From 2ff4d9d5691e2d4867b061e7320a60557a72f25d Mon Sep 17 00:00:00 2001 From: CristianAlam <91946810+CristianAlam@users.noreply.github.com> Date: Fri, 11 Jul 2025 08:43:07 +0300 Subject: [PATCH] Initial comit of TrendBreakouts --- Algo_Skeleton_Functions.mqh | 1958 +++++++++++++++++++++ Breakout_Fractals.ex5 | Bin 0 -> 68614 bytes Breakout_Fractals.mq5 | 404 +++++ BuyEntryManager.mqh | 113 ++ BuyGandalf.mqh | 85 + BuyRejectionDetector.mqh | 53 + BuyTradeManager.mqh | 587 ++++++ BuyTradeManagerTiger.mqh | 72 + Entries_Newest.ex5 | Bin 0 -> 80262 bytes Entries_Newest.mq5 | 333 ++++ Gandalf.ex5 | Bin 0 -> 29474 bytes Gandalf.mq5 | 363 ++++ GeneralTests.ex5 | Bin 0 -> 161402 bytes GeneralTests.mq5 | 1668 ++++++++++++++++++ GraphicalObjectsManager.mqh | 1076 +++++++++++ HighFractal.mqh | 254 +++ HighFractalContainer.mqh | 131 ++ LotSizeCalculator.mqh | 130 ++ LowFractal.mqh | 255 +++ LowFractalContainer.mqh | 137 ++ MarketObserver.mqh | 299 ++++ MarketObserverTiger.mqh | 105 ++ NewCandleDetector.mqh | 378 ++++ NewGenTest.ex5 | Bin 0 -> 97590 bytes NewGenTest.mq5 | 1643 +++++++++++++++++ ObjectConfirmationUnit.mqh | 50 + Phoenix_Functions.mqh | 618 +++++++ Phoenix_Reborn.ex5 | Bin 0 -> 33828 bytes Phoenix_Reborn.mq5 | 201 +++ Point_Value_Testing.ex5 | Bin 0 -> 6804 bytes Point_Value_Testing.mq5 | 51 + PositionEntryTest.ex5 | Bin 0 -> 164996 bytes PositionEntryTest.mq5 | 1676 ++++++++++++++++++ SellEntryManager.mqh | 119 ++ SellGandalf.mqh | 79 + SellRejectionDetector.mqh | 52 + SellTradeManager.mqh | 586 ++++++ SellTradeManagerTiger.mqh | 69 + SellTradeMangerTiger.mqh | 29 + Shark.mq5 | 846 +++++++++ Shark_tester.mq5 | 1191 +++++++++++++ TempLineObjectAttributes.mqh | 40 + TempObjectAttributes.mqh | 81 + Tiger.ex5 | Bin 0 -> 46688 bytes Tiger.mq5 | 601 +++++++ TigerEntryTaker.ex5 | Bin 0 -> 51062 bytes TigerEntryTaker.mq5 | 1023 +++++++++++ TigerEntryTakerNew.ex5 | Bin 0 -> 56044 bytes TigerEntryTakerNew.mq5 | 1161 ++++++++++++ TigerEntryTakerNewGen.ex5 | Bin 0 -> 56532 bytes TigerEntryTakerNewGen.mq5 | 1060 +++++++++++ TigerEntryTakerNewGenNext.ex5 | Bin 0 -> 63566 bytes TigerEntryTakerNewGenNext.mq5 | 1274 ++++++++++++++ TigerNewFeature.ex5 | Bin 0 -> 72656 bytes TigerNewFeature.mq5 | 1442 +++++++++++++++ TigerObserver.ex5 | Bin 0 -> 34970 bytes TigerObserver.mq5 | 694 ++++++++ TigerWicksIncluded.ex5 | Bin 0 -> 70946 bytes TigerWicksIncluded.mq5 | 1465 +++++++++++++++ TigerWicksOnly.ex5 | Bin 0 -> 73358 bytes TigerWicksOnly.mq5 | 443 +++++ TigerZonesComplete.ex5 | Bin 0 -> 73164 bytes TigerZonesComplete.mq5 | 423 +++++ Tiger_Entries_4H.ex5 | Bin 0 -> 74164 bytes Tiger_Entries_4H.mq5 | 232 +++ TrendBreakouts.ex5 | Bin 0 -> 35506 bytes TrendBreakouts.mq5 | 182 ++ Zone.mqh | 341 ++++ ZoneContainer.mqh | 686 ++++++++ ZoneRejectionOneCandle.ex5 | Bin 0 -> 161346 bytes ZoneRejectionOneCandle.mq5 | 1651 +++++++++++++++++ ZoneRjectionTest4H.ex5 | Bin 0 -> 159958 bytes ZoneRjectionTest4H.mq5 | 1642 +++++++++++++++++ candleStringDetector.ex5 | Bin 0 -> 29468 bytes candleStringDetector.mq5 | 98 ++ library_functions.mqh | 765 ++++++++ shark_tiger/Algo_Skeleton_Functions.mqh | 1958 +++++++++++++++++++++ shark_tiger/Breakout_Fractals.ex5 | Bin 0 -> 66390 bytes shark_tiger/Breakout_Fractals.mq5 | 404 +++++ shark_tiger/BuyEntryManager.mqh | 113 ++ shark_tiger/BuyGandalf.mqh | 85 + shark_tiger/BuyRejectionDetector.mqh | 53 + shark_tiger/BuyTradeManager.mqh | 592 +++++++ shark_tiger/BuyTradeManagerTiger.mqh | 72 + shark_tiger/Entries_Newest.ex5 | Bin 0 -> 80262 bytes shark_tiger/Entries_Newest.mq5 | 333 ++++ shark_tiger/Gandalf.ex5 | Bin 0 -> 30574 bytes shark_tiger/Gandalf.mq5 | 363 ++++ shark_tiger/GeneralTests.mq5 | 1668 ++++++++++++++++++ shark_tiger/GraphicalObjectsManager.mqh | 1076 +++++++++++ shark_tiger/HighFractal.mqh | 254 +++ shark_tiger/HighFractalContainer.mqh | 131 ++ shark_tiger/LotSizeCalculator.mqh | 130 ++ shark_tiger/LowFractal.mqh | 255 +++ shark_tiger/LowFractalContainer.mqh | 137 ++ shark_tiger/MarketObserver.mqh | 299 ++++ shark_tiger/MarketObserverTiger.mqh | 105 ++ shark_tiger/NewCandleDetector.mqh | 378 ++++ shark_tiger/NewGenTest.ex5 | Bin 0 -> 97590 bytes shark_tiger/NewGenTest.mq5 | 1643 +++++++++++++++++ shark_tiger/ObjectConfirmationUnit.mqh | 50 + shark_tiger/Phoenix_Functions.mqh | 618 +++++++ shark_tiger/Phoenix_Reborn.ex5 | Bin 0 -> 33828 bytes shark_tiger/Phoenix_Reborn.mq5 | 201 +++ shark_tiger/Point_Value_Testing.ex5 | Bin 0 -> 6804 bytes shark_tiger/Point_Value_Testing.mq5 | 51 + shark_tiger/PositionEntryTest.mq5 | 1676 ++++++++++++++++++ shark_tiger/SellEntryManager.mqh | 119 ++ shark_tiger/SellGandalf.mqh | 79 + shark_tiger/SellRejectionDetector.mqh | 52 + shark_tiger/SellTradeManager.mqh | 586 ++++++ shark_tiger/SellTradeManagerTiger.mqh | 69 + shark_tiger/SellTradeMangerTiger.mqh | 29 + shark_tiger/Shark.mq5 | 846 +++++++++ shark_tiger/Shark_tester.mq5 | 1191 +++++++++++++ shark_tiger/TempLineObjectAttributes.mqh | 40 + shark_tiger/TempObjectAttributes.mqh | 81 + shark_tiger/Tiger.ex5 | Bin 0 -> 46688 bytes shark_tiger/Tiger.mq5 | 601 +++++++ shark_tiger/TigerEntryTaker.ex5 | Bin 0 -> 51062 bytes shark_tiger/TigerEntryTaker.mq5 | 1023 +++++++++++ shark_tiger/TigerEntryTakerNew.ex5 | Bin 0 -> 56044 bytes shark_tiger/TigerEntryTakerNew.mq5 | 1161 ++++++++++++ shark_tiger/TigerEntryTakerNewGen.ex5 | Bin 0 -> 56532 bytes shark_tiger/TigerEntryTakerNewGen.mq5 | 1060 +++++++++++ shark_tiger/TigerEntryTakerNewGenNext.mq5 | 1274 ++++++++++++++ shark_tiger/TigerNewFeature.ex5 | Bin 0 -> 72656 bytes shark_tiger/TigerNewFeature.mq5 | 1442 +++++++++++++++ shark_tiger/TigerObserver.ex5 | Bin 0 -> 34970 bytes shark_tiger/TigerObserver.mq5 | 694 ++++++++ shark_tiger/TigerWicksIncluded.ex5 | Bin 0 -> 70946 bytes shark_tiger/TigerWicksIncluded.mq5 | 1465 +++++++++++++++ shark_tiger/TigerWicksOnly.ex5 | Bin 0 -> 73358 bytes shark_tiger/TigerWicksOnly.mq5 | 443 +++++ shark_tiger/TigerZonesComplete.mq5 | 423 +++++ shark_tiger/Tiger_Entries_4H.ex5 | Bin 0 -> 74164 bytes shark_tiger/Tiger_Entries_4H.mq5 | 232 +++ shark_tiger/TrendBreakouts.ex5 | Bin 0 -> 33786 bytes shark_tiger/TrendBreakouts.mq5 | 182 ++ shark_tiger/Zone.mqh | 341 ++++ shark_tiger/ZoneContainer.mqh | 686 ++++++++ shark_tiger/ZoneRejectionOneCandle.ex5 | Bin 0 -> 161346 bytes shark_tiger/ZoneRejectionOneCandle.mq5 | 1651 +++++++++++++++++ shark_tiger/ZoneRjectionTest4H.ex5 | Bin 0 -> 159958 bytes shark_tiger/ZoneRjectionTest4H.mq5 | 1642 +++++++++++++++++ shark_tiger/candleStringDetector.ex5 | Bin 0 -> 29468 bytes shark_tiger/candleStringDetector.mq5 | 98 ++ shark_tiger/library_functions.mqh | 765 ++++++++ 148 files changed, 61835 insertions(+) create mode 100644 Algo_Skeleton_Functions.mqh create mode 100644 Breakout_Fractals.ex5 create mode 100644 Breakout_Fractals.mq5 create mode 100644 BuyEntryManager.mqh create mode 100644 BuyGandalf.mqh create mode 100644 BuyRejectionDetector.mqh create mode 100644 BuyTradeManager.mqh create mode 100644 BuyTradeManagerTiger.mqh create mode 100644 Entries_Newest.ex5 create mode 100644 Entries_Newest.mq5 create mode 100644 Gandalf.ex5 create mode 100644 Gandalf.mq5 create mode 100644 GeneralTests.ex5 create mode 100644 GeneralTests.mq5 create mode 100644 GraphicalObjectsManager.mqh create mode 100644 HighFractal.mqh create mode 100644 HighFractalContainer.mqh create mode 100644 LotSizeCalculator.mqh create mode 100644 LowFractal.mqh create mode 100644 LowFractalContainer.mqh create mode 100644 MarketObserver.mqh create mode 100644 MarketObserverTiger.mqh create mode 100644 NewCandleDetector.mqh create mode 100644 NewGenTest.ex5 create mode 100644 NewGenTest.mq5 create mode 100644 ObjectConfirmationUnit.mqh create mode 100644 Phoenix_Functions.mqh create mode 100644 Phoenix_Reborn.ex5 create mode 100644 Phoenix_Reborn.mq5 create mode 100644 Point_Value_Testing.ex5 create mode 100644 Point_Value_Testing.mq5 create mode 100644 PositionEntryTest.ex5 create mode 100644 PositionEntryTest.mq5 create mode 100644 SellEntryManager.mqh create mode 100644 SellGandalf.mqh create mode 100644 SellRejectionDetector.mqh create mode 100644 SellTradeManager.mqh create mode 100644 SellTradeManagerTiger.mqh create mode 100644 SellTradeMangerTiger.mqh create mode 100644 Shark.mq5 create mode 100644 Shark_tester.mq5 create mode 100644 TempLineObjectAttributes.mqh create mode 100644 TempObjectAttributes.mqh create mode 100644 Tiger.ex5 create mode 100644 Tiger.mq5 create mode 100644 TigerEntryTaker.ex5 create mode 100644 TigerEntryTaker.mq5 create mode 100644 TigerEntryTakerNew.ex5 create mode 100644 TigerEntryTakerNew.mq5 create mode 100644 TigerEntryTakerNewGen.ex5 create mode 100644 TigerEntryTakerNewGen.mq5 create mode 100644 TigerEntryTakerNewGenNext.ex5 create mode 100644 TigerEntryTakerNewGenNext.mq5 create mode 100644 TigerNewFeature.ex5 create mode 100644 TigerNewFeature.mq5 create mode 100644 TigerObserver.ex5 create mode 100644 TigerObserver.mq5 create mode 100644 TigerWicksIncluded.ex5 create mode 100644 TigerWicksIncluded.mq5 create mode 100644 TigerWicksOnly.ex5 create mode 100644 TigerWicksOnly.mq5 create mode 100644 TigerZonesComplete.ex5 create mode 100644 TigerZonesComplete.mq5 create mode 100644 Tiger_Entries_4H.ex5 create mode 100644 Tiger_Entries_4H.mq5 create mode 100644 TrendBreakouts.ex5 create mode 100644 TrendBreakouts.mq5 create mode 100644 Zone.mqh create mode 100644 ZoneContainer.mqh create mode 100644 ZoneRejectionOneCandle.ex5 create mode 100644 ZoneRejectionOneCandle.mq5 create mode 100644 ZoneRjectionTest4H.ex5 create mode 100644 ZoneRjectionTest4H.mq5 create mode 100644 candleStringDetector.ex5 create mode 100644 candleStringDetector.mq5 create mode 100644 library_functions.mqh create mode 100644 shark_tiger/Algo_Skeleton_Functions.mqh create mode 100644 shark_tiger/Breakout_Fractals.ex5 create mode 100644 shark_tiger/Breakout_Fractals.mq5 create mode 100644 shark_tiger/BuyEntryManager.mqh create mode 100644 shark_tiger/BuyGandalf.mqh create mode 100644 shark_tiger/BuyRejectionDetector.mqh create mode 100644 shark_tiger/BuyTradeManager.mqh create mode 100644 shark_tiger/BuyTradeManagerTiger.mqh create mode 100644 shark_tiger/Entries_Newest.ex5 create mode 100644 shark_tiger/Entries_Newest.mq5 create mode 100644 shark_tiger/Gandalf.ex5 create mode 100644 shark_tiger/Gandalf.mq5 create mode 100644 shark_tiger/GeneralTests.mq5 create mode 100644 shark_tiger/GraphicalObjectsManager.mqh create mode 100644 shark_tiger/HighFractal.mqh create mode 100644 shark_tiger/HighFractalContainer.mqh create mode 100644 shark_tiger/LotSizeCalculator.mqh create mode 100644 shark_tiger/LowFractal.mqh create mode 100644 shark_tiger/LowFractalContainer.mqh create mode 100644 shark_tiger/MarketObserver.mqh create mode 100644 shark_tiger/MarketObserverTiger.mqh create mode 100644 shark_tiger/NewCandleDetector.mqh create mode 100644 shark_tiger/NewGenTest.ex5 create mode 100644 shark_tiger/NewGenTest.mq5 create mode 100644 shark_tiger/ObjectConfirmationUnit.mqh create mode 100644 shark_tiger/Phoenix_Functions.mqh create mode 100644 shark_tiger/Phoenix_Reborn.ex5 create mode 100644 shark_tiger/Phoenix_Reborn.mq5 create mode 100644 shark_tiger/Point_Value_Testing.ex5 create mode 100644 shark_tiger/Point_Value_Testing.mq5 create mode 100644 shark_tiger/PositionEntryTest.mq5 create mode 100644 shark_tiger/SellEntryManager.mqh create mode 100644 shark_tiger/SellGandalf.mqh create mode 100644 shark_tiger/SellRejectionDetector.mqh create mode 100644 shark_tiger/SellTradeManager.mqh create mode 100644 shark_tiger/SellTradeManagerTiger.mqh create mode 100644 shark_tiger/SellTradeMangerTiger.mqh create mode 100644 shark_tiger/Shark.mq5 create mode 100644 shark_tiger/Shark_tester.mq5 create mode 100644 shark_tiger/TempLineObjectAttributes.mqh create mode 100644 shark_tiger/TempObjectAttributes.mqh create mode 100644 shark_tiger/Tiger.ex5 create mode 100644 shark_tiger/Tiger.mq5 create mode 100644 shark_tiger/TigerEntryTaker.ex5 create mode 100644 shark_tiger/TigerEntryTaker.mq5 create mode 100644 shark_tiger/TigerEntryTakerNew.ex5 create mode 100644 shark_tiger/TigerEntryTakerNew.mq5 create mode 100644 shark_tiger/TigerEntryTakerNewGen.ex5 create mode 100644 shark_tiger/TigerEntryTakerNewGen.mq5 create mode 100644 shark_tiger/TigerEntryTakerNewGenNext.mq5 create mode 100644 shark_tiger/TigerNewFeature.ex5 create mode 100644 shark_tiger/TigerNewFeature.mq5 create mode 100644 shark_tiger/TigerObserver.ex5 create mode 100644 shark_tiger/TigerObserver.mq5 create mode 100644 shark_tiger/TigerWicksIncluded.ex5 create mode 100644 shark_tiger/TigerWicksIncluded.mq5 create mode 100644 shark_tiger/TigerWicksOnly.ex5 create mode 100644 shark_tiger/TigerWicksOnly.mq5 create mode 100644 shark_tiger/TigerZonesComplete.mq5 create mode 100644 shark_tiger/Tiger_Entries_4H.ex5 create mode 100644 shark_tiger/Tiger_Entries_4H.mq5 create mode 100644 shark_tiger/TrendBreakouts.ex5 create mode 100644 shark_tiger/TrendBreakouts.mq5 create mode 100644 shark_tiger/Zone.mqh create mode 100644 shark_tiger/ZoneContainer.mqh create mode 100644 shark_tiger/ZoneRejectionOneCandle.ex5 create mode 100644 shark_tiger/ZoneRejectionOneCandle.mq5 create mode 100644 shark_tiger/ZoneRjectionTest4H.ex5 create mode 100644 shark_tiger/ZoneRjectionTest4H.mq5 create mode 100644 shark_tiger/candleStringDetector.ex5 create mode 100644 shark_tiger/candleStringDetector.mq5 create mode 100644 shark_tiger/library_functions.mqh diff --git a/Algo_Skeleton_Functions.mqh b/Algo_Skeleton_Functions.mqh new file mode 100644 index 0000000..c4c345a --- /dev/null +++ b/Algo_Skeleton_Functions.mqh @@ -0,0 +1,1958 @@ +//+------------------------------------------------------------------+ +//| Algo_Skeleton_Functions.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" + +#define NUM_MAX_ALLOWED_TRADES 4 + +#include "library_functions.mqh" + +#include "NewCandleDetector.mqh" +#include "GraphicalObjectsManager.mqh" +#include "Zone.mqh" +#include "ZoneContainer.mqh" +#include "LotSizeCalculator.mqh" +#include "MarketObserverTiger.mqh" + +#include "BuyEntryManager.mqh" +#include "SellEntryManager.mqh" +#include "BuyTradeManagerTiger.mqh" +#include "SellTradeManagerTiger.mqh" + + + +input group "Risk Management Related Variables" +input double riskManagementPartial ; +input double firstPartialCloseFactor ; +input double firstPartialProfitInPips; +input bool trail_based_m30 ; +input bool trail_based_h1 ; +input bool trail_based_h4 ; + +input group "Entry Time Frame" +input bool ENTRY_BASED_M30_STRUCTURE ; +input bool ENTRY_BASED_H1_STRUCTURE ; + +input group "Range Related Variables" +input double rangeDistanceBetweenZones_4H ; +input double rangeDistanceBetweenZones_H1; +input double rangeDistanceBetweenZones_M30 ; +input double breakoutMinDist_H4 ; +input double breakoutMinDist_H1 ; +input double breakoutMinDist_M30 ; +input double cleanRangeUponEntry ; +input double potentialRR; + +input group "Zone Related Settings" +input double resistanceExtendAboveCandle; +input double resistanceLowerEdgeExtend ; +input double supportExtendBelowCandle ; +input double supportHigherEdgeExtend; +input int firstZoneShift ; +input datetime rightEdge ; +input int deleteAllZonesAfter_Weeks ; + + +input group "Candle Body Variables" +input double WICK_RATIO_REJECTION; +input double SIZE_OF_BREAKER_CANDLE_BODY; + + +input group "Trade Restrictions" +input bool BUYS_ALLOWED = true ; +input bool SELLS_ALLOWED = true ; + + +/* +input int wickLengthInMinutes ; +input double preWickPush ; +input double stopOrderFactor ; +input double retracementWickSize ; +input double retracementWickFibMeasure ; +input double minimumStopLossInPips ; */ + +input group "Trading Sessions" +input bool TRADE_NEW_YORK_ALLOWED = true ; +input bool TRADE_LONDON_ALLOWED = true ; +input bool TRADE_TOKYO_ALLOWED = true ; + +input group "Modes" +input bool MODE_WICKS_INCLUDED ; + +input group "HTF Confirmations" +input bool H4_Break_Confirmation ; +input bool H4_Closure_Confirmation ; + +// GUI CLASSES INITIALIZATION +GraphicalObjectsManager* objectsManager = new GraphicalObjectsManager(); + +// CONTAINERS INITIALIZATION + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +ZoneContainer* zoneContainer_W1 = new ZoneContainer() ; +ZoneContainer* zoneContainer_D1 = new ZoneContainer() ; +ZoneContainer* zoneContainer_H4 = new ZoneContainer() ; +ZoneContainer* zoneContainer_H1 = new ZoneContainer() ; +ZoneContainer* zoneContainer_M30 = new ZoneContainer() ; + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +ZoneContainer* zoneContainerSupport_W1 = new ZoneContainer() ; +ZoneContainer* zoneContainerSupport_D1 = new ZoneContainer() ; +ZoneContainer* zoneContainerSupport_H4 = new ZoneContainer() ; +ZoneContainer* zoneContainerSupport_H1 = new ZoneContainer() ; +ZoneContainer* zoneContainerSupport_M30 = new ZoneContainer() ; + + + +// ALGORITHM CLASSES INITIALIZATION +MarketObserverTiger* marketObserverTiger = new MarketObserverTiger(); + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +NewCandleDetector newCandleDetectorWeekly("PERIOD_W1"); +NewCandleDetector newCandleDetectorDaily("PERIOD_D1"); +NewCandleDetector newCandleDetector4H("PERIOD_H4"); +NewCandleDetector newCandleDetector1H("PERIOD_H1"); +NewCandleDetector newCandleDetector30M("PERIOD_M30"); +NewCandleDetector newCandleDetectorM15("PERIOD_M15"); +NewCandleDetector newCandleDetectorM1("PERIOD_M1"); +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ + +Zone* temporaryRestestSupportZone = new Zone(); + + + +// TRADE CLASSES +BuyEntryManager buyEntryManager ; +SellEntryManager sellEntryManager ; + + +// LotSizeCalculator class + +LotSizeCalculator lsCalc ; + + +// TRADE VARIABLS +bool securedRisk = false ; +ulong activeTradeId ; +BuyTradeManagerTiger* BuyActiveTradesArray[NUM_MAX_ALLOWED_TRADES]; +SellTradeManagerTiger* SellActiveTradesArray[NUM_MAX_ALLOWED_TRADES]; +int buysCount = 0 ; +int sellsCount = 0 ; +bool waitForBottomWickToForm = false ; +bool bottomWickFormed = false; +bool topWickFormed = false; +int bottomWickValidationState = -2 ; +int topWickValidationState = -2; +bool waitForTopWickToForm = false ; +int wickLengthCounter = 0 ; +double buyStopPrice = -1 ; +double sellStopPrice = -1 ; +bool wickTradeTaken = false ; + + +// Zone variables +int weekCounter = 0 ; + +// HTF Variables +bool last_H4_candle_broke_structure = false ; + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double supportExtendBelowCandleActual = supportExtendBelowCandle * Point(); +double supportHigherEdgeExtendActual = supportHigherEdgeExtend * Point(); +double resistanceExtendAboveCandleActual = resistanceExtendAboveCandle * Point(); +double resistanceLowerEdgeExtendActual = resistanceLowerEdgeExtend * Point(); + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double stopLossAboveWickByActual = stopLossAboveWickBy * Point() ; +double stopLossUnderWickByActual = stopLossUnderWickBy * Point() ; + + +double cleanRangeUponEntryActual = cleanRangeUponEntry * Point() ; + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double rangeDistanceBetweenZonesActual_H4 = rangeDistanceBetweenZones_4H * Point(); +double rangeDistanceBetweenZonesActual_H1 = rangeDistanceBetweenZones_H1 * Point(); +double rangeDistanceBetweenZonesActual_M30 = rangeDistanceBetweenZones_M30 * Point(); + +double maxPipsRiskAmountActual = maxPipsRiskAmount * Point(); + +double firstPartialProfitInPipsActual = firstPartialProfitInPips * Point(); + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool detectAndDrawResistanceOnTimeFrame(ENUM_TIMEFRAMES timeFrame, string timeFrameStr, long BOS_zone_color,ZoneContainer& zoneContainer, double _rangeDistanceBetweenZonesActual, int _timeFrameZoneCounterFactor) + { + + + if(resistancePatternFormed(timeFrame)) // if resistance formed + { + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getZonesIdCounter() + _timeFrameZoneCounterFactor; + + + datetime _leftEdge = iTime(_Symbol,timeFrame,2); + //datetime _rightEdge = D'2023.11.01 00:00:00'; + datetime _rightEdge = rightEdge; + double resistancePrice = iOpen(_Symbol,timeFrame,1); + double _higherEdgePrice = resistancePrice + resistanceExtendAboveCandleActual; + double _lowerEdgePrice = resistancePrice - resistanceLowerEdgeExtendActual ; + string _zoneId = IntegerToString(currentIdCounter); + + + + if((zoneContainer.getNumberOfActiveZones() != 0) && (zoneContainer.getZoneByIndex(0).getLowerEdge() - resistancePrice >= _rangeDistanceBetweenZonesActual)) // check if it has a clean range above + { + + Zone* newZone = new Zone(_zoneId,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_RESISTANCE_BREAKOUT") ; + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandleActual,resistancePrice - resistanceLowerEdgeExtendActual,BOS_zone_color); + + } + + else + if((zoneContainer.getNumberOfActiveZones() != 0) && (zoneContainer.getZoneByIndex(0).getLowerEdge() - resistancePrice < _rangeDistanceBetweenZonesActual)) // if it doesnt have a clean range, just add it as a blue zone + { + + Zone* newZone = new Zone(_zoneId,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_RESISTANCE_NORMAL") ; + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + + } + + else + if(zoneContainer.getNumberOfActiveZones() == 0) // this means this is the first zone to add to the data strucutre + { + int result = detectAndDrawFirstResistanceZoneHigherThan(resistancePrice + resistanceExtendAboveCandleActual, timeFrame,firstZoneShift, zoneContainer, timeFrameStr,BOS_zone_color,_rangeDistanceBetweenZonesActual,_timeFrameZoneCounterFactor); + if(result == 1) + { + + int currentIdCounter = zoneContainer.getZonesIdCounter() + _timeFrameZoneCounterFactor ; + string currentIdCounterStr = IntegerToString(currentIdCounter); + Zone* newZone = new Zone(currentIdCounterStr,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_RESISTANCE_BREAKOUT") ; + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandleActual,resistancePrice - resistanceLowerEdgeExtendActual,BOS_zone_color); + + } + else + if(result == 0) + { + int currentIdCounter = zoneContainer.getZonesIdCounter() + _timeFrameZoneCounterFactor ; + string currentIdCounterStr = IntegerToString(currentIdCounter); + + Zone* newZone = new Zone(currentIdCounterStr,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_RESISTANCE_NORMAL") ; + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + } + else + if(result == 2) + { + int currentIdCounter = zoneContainer.getZonesIdCounter() + _timeFrameZoneCounterFactor ; + string currentIdCounterStr = IntegerToString(currentIdCounter); + Zone* newZone = new Zone(currentIdCounterStr,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_RESISTANCE_BREAKOUT") ; + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandleActual,resistancePrice - resistanceLowerEdgeExtendActual,BOS_zone_color); + + } + + } + + + + + if(allResistancesAreNormalType(zoneContainer)) // if all resistances are type normal , then find the first resistance higher than the current highest resistance + { + + double highestResistanceZonePrice = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge() ; + int res = detectAndDrawFirstResistanceZoneHigherThan(highestResistanceZonePrice, timeFrame,firstZoneShift, zoneContainer, timeFrameStr,BOS_zone_color,_rangeDistanceBetweenZonesActual,_timeFrameZoneCounterFactor); + + + + if(res == 1) + { + if((zoneContainer.getNumberOfActiveZones()-2) >= 0) + { + + zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-2).setType("TYPE_RESISTANCE_BREAKOUT"); // we choose the second cell from the end, because in the last index now sits the new higher zone created by the previous function call. + } + + + } + else + if(res == 0) + { + + if((zoneContainer.getNumberOfActiveZones()-2) >= 0) + { + deleteZoneGuiOnly(zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-2).getId(),zoneContainer); + } + + } + + else + if(res == 2) + { + zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).setType("TYPE_RESISTANCE_BREAKOUT"); + + } + + } + + return true ; + + } + return false ; + } + + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool detectAndDrawSupportOnTimeFrame(ENUM_TIMEFRAMES timeFrame, string timeFrameStr, long BOS_zone_color,ZoneContainer& zoneContainer, double _rangeDistanceBetweenZonesAcual, int _timeFrameZoneCounterFactor) + { + + + if(supportPatternFormed(timeFrame)) // if support formed + { + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getSupportZonesIdCounter() + _timeFrameZoneCounterFactor; + + + datetime _leftEdge = iTime(_Symbol,timeFrame,2); + datetime _rightEdge =rightEdge; + double supportPrice = iOpen(_Symbol,timeFrame,1); + double _higherEdgePrice = supportPrice + supportHigherEdgeExtendActual; + double _lowerEdgePrice = supportPrice - supportExtendBelowCandleActual; + string _zoneId = IntegerToString(currentIdCounter); + + + + if((zoneContainer.getNumberOfActiveZones() != 0) && (supportPrice - zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge() >= _rangeDistanceBetweenZonesAcual)) // check if it has a clean range down + { + + Zone* newZone = new Zone(_zoneId,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_SUPPORT_BREAKOUT") ; + + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice + supportHigherEdgeExtendActual,supportPrice- supportExtendBelowCandleActual,BOS_zone_color); + + } + + else + if((zoneContainer.getNumberOfActiveZones() != 0) && (supportPrice - zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge() < _rangeDistanceBetweenZonesAcual)) // if it doesnt have a clean range, just add it as a blue zone + { + Zone* newZone = new Zone(_zoneId,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_SUPPORT_NORMAL") ; + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + } + + else + if(zoneContainer.getNumberOfActiveZones() == 0) // this means this is the first zone to add to the data strucutre + { + + // Add the old lower support zone before adding the new support zone. + + int result = detectAndDrawFirstSupportZoneLowerThan(supportPrice - supportExtendBelowCandleActual, timeFrame,firstZoneShift, zoneContainer, timeFrameStr,BOS_zone_color,_rangeDistanceBetweenZonesAcual,_timeFrameZoneCounterFactor); + if(result == 1) // means if found a lower zone and the range is clean + { + int currentIdCounter = zoneContainer.getSupportZonesIdCounter() + _timeFrameZoneCounterFactor; + string currentIdCounterStr = IntegerToString(currentIdCounter); + Zone* newZone = new Zone(currentIdCounterStr,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_SUPPORT_BREAKOUT") ; + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice + supportHigherEdgeExtendActual,supportPrice - supportExtendBelowCandleActual,BOS_zone_color); + + } + else + if(result == 0) // means found a lower zone but the range is not clean + { + + int currentIdCounter = zoneContainer.getSupportZonesIdCounter() + _timeFrameZoneCounterFactor; + string currentIdCounterStr = IntegerToString(currentIdCounter); + + Zone* newZone = new Zone(currentIdCounterStr,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_SUPPORT_NORMAL") ; + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + } + else + if(result == 2) // means didnt find a lower zone + { + + int currentIdCounter = zoneContainer.getSupportZonesIdCounter() + _timeFrameZoneCounterFactor; + string currentIdCounterStr = IntegerToString(currentIdCounter); + + Zone* newZone = new Zone(currentIdCounterStr,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_SUPPORT_BREAKOUT") ; + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice + supportHigherEdgeExtendActual,supportPrice - supportExtendBelowCandleActual,BOS_zone_color); + } + + + + } + + + + if(allSupportsAreNormalType(zoneContainer)) // if all supports are type normal , then find the first support lower than the current lowest. + { + + + double lowestSupportPrice = zoneContainer.getZoneByIndex(0).getLowerEdge() ; + int res = detectAndDrawFirstSupportZoneLowerThan(lowestSupportPrice, timeFrame,firstZoneShift, zoneContainer, timeFrameStr,BOS_zone_color,_rangeDistanceBetweenZonesAcual,_timeFrameZoneCounterFactor) ; + + if(res == 1) // if we found lower support than the current lower, and the range is valid, then keep both + { + + zoneContainer.getZoneByIndex(1).setType("TYPE_SUPPORT_BREAKOUT"); // we choose index 1, because in index 0 now sits the new lower zone created by the previous function call. + } + else + if(res == 0) // if we found a lower support than the current lowest but the range is not valid, then keep only the lower one + { + + if(zoneContainer.getNumberOfActiveZones() > 1) + { + zoneContainer.getZoneByIndex(1).setType("TYPE_SUPPORT_NORMAL"); + deleteZoneGuiOnly(zoneContainer.getZoneByIndex(1).getId(),zoneContainer); + } + + } + + else + if(res == 0) + { + zoneContainer.getZoneByIndex(0).setType("TYPE_SUPPORT_NORMAL"); + } + + } + + + return true ; + + } + return false ; + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int detectAndDrawFirstResistanceZoneHigherThan(double currentHigherResistancePrice, ENUM_TIMEFRAMES timeFrame,int _firstZoneShift,ZoneContainer& zoneContainer,string timeFrameStr, long BOS_zone_color,double _rangeDistanceBetweenZonesAcual, int _timeFrameZoneCounterFactor) + { + + for(int i=3 ; i< _firstZoneShift; i++) + { + if(resistancePatternFormed(timeFrame,i)) // if old resistance found + { + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getZonesIdCounter() + _timeFrameZoneCounterFactor ; + string currentIdCounterStr = IntegerToString(currentIdCounter); + datetime _leftEdge = iTime(_Symbol,timeFrame,i+2); + datetime _rightEdge = rightEdge; + double resistancePrice = iOpen(_Symbol,timeFrame,i+1); + double _higherEdgePrice = resistancePrice + resistanceExtendAboveCandleActual; + double _lowerEdgePrice = resistancePrice - resistanceLowerEdgeExtendActual ; + + if((resistancePrice > currentHigherResistancePrice) && ((resistancePrice - currentHigherResistancePrice) > _rangeDistanceBetweenZonesAcual)) // this means the range is valid + { + + if(MODE_WICKS_INCLUDED) + { + Zone* newZone = new Zone(currentIdCounterStr,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_RESISTANCE_BREAKOUT") ; + zoneContainer.addHistoryResistanceZoneOnTop(newZone); + zoneContainer.incrementZonesIdCounter(); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,newZone.getHigherEdge(),newZone.getLowerEdge(),BOS_zone_color); + + } + else + { + Zone* newZone = new Zone(currentIdCounterStr,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_RESISTANCE_NORMAL") ; + zoneContainer.addHistoryResistanceZoneOnTop(newZone); + zoneContainer.incrementZonesIdCounter(); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,newZone.getHigherEdge(),newZone.getLowerEdge(),BOS_zone_color); + } + + + return 1 ; // range is valid so return 1 + } + else + if((resistancePrice > currentHigherResistancePrice) && !((resistancePrice - currentHigherResistancePrice) > _rangeDistanceBetweenZonesAcual)) // the range is not valid, this means draw only the old one + { + + if(MODE_WICKS_INCLUDED) + { + Zone* newZone = new Zone(currentIdCounterStr,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_RESISTANCE_BREAKOUT") ; + zoneContainer.addHistoryResistanceZoneOnTop(newZone); + zoneContainer.incrementZonesIdCounter(); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,newZone.getHigherEdge(),newZone.getLowerEdge(),BOS_zone_color); + + } + else + { + Zone* newZone = new Zone(currentIdCounterStr,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_RESISTANCE_NORMAL") ; + zoneContainer.addHistoryResistanceZoneOnTop(newZone); + zoneContainer.incrementZonesIdCounter(); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,newZone.getHigherEdge(),newZone.getLowerEdge(),BOS_zone_color); + } + + + + + return 0 ; // range is not valid , so return 0 + + } + } + } + return 2; // this is the case that we didnt find a zone above the current highest zone, which means the current highest zone now, will be breakout zone + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int detectAndDrawFirstSupportZoneLowerThan(double currentLowerSupportPrice, ENUM_TIMEFRAMES timeFrame,int _firstZoneShift,ZoneContainer& zoneContainer,string timeFrameStr, long BOS_zone_color, double _rangeDistanceBetweenZonesAcual, int _timeFrameZoneCounterFactor) + { + + int result = 2 ; + for(int i=3 ; i< _firstZoneShift; i++) + { + if(supportPatternFormed(timeFrame,i)) // if old support found + { + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getSupportZonesIdCounter() + _timeFrameZoneCounterFactor ; + string currentIdCounterStr = IntegerToString(currentIdCounter); + datetime _leftEdge = iTime(_Symbol,timeFrame,i+2); + datetime _rightEdge = rightEdge; + double supportPrice = iOpen(_Symbol,timeFrame,i+1); + double _higherEdgePrice = supportPrice + supportHigherEdgeExtendActual; + double _lowerEdgePrice = supportPrice - supportExtendBelowCandleActual ; + + if((supportPrice < currentLowerSupportPrice) && ((currentLowerSupportPrice - supportPrice) > _rangeDistanceBetweenZonesAcual)) // this means the range is valid + { + + if(MODE_WICKS_INCLUDED) + { + Zone* newZone = new Zone(currentIdCounterStr,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_SUPPORT_BREAKOUT") ; + zoneContainer.addHistorySupportZoneAtBottom(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,newZone.getHigherEdge(),newZone.getLowerEdge(),BOS_zone_color); + + + } + else + { + Zone* newZone = new Zone(currentIdCounterStr,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_SUPPORT_NORMAL") ; + zoneContainer.addHistorySupportZoneAtBottom(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,newZone.getHigherEdge(),newZone.getLowerEdge(),BOS_zone_color); + + } + + return 1 ; + } + else + if((supportPrice < currentLowerSupportPrice) && !((currentLowerSupportPrice - supportPrice) > _rangeDistanceBetweenZonesAcual)) // the range is not valid, this means draw only the old one + { + + if(MODE_WICKS_INCLUDED) + { + Zone* newZone = new Zone(currentIdCounterStr,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_SUPPORT_BREAKOUT") ; + zoneContainer.addHistorySupportZoneAtBottom(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,newZone.getHigherEdge(),newZone.getLowerEdge(),BOS_zone_color); + + } + else + { + Zone* newZone = new Zone(currentIdCounterStr,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_SUPPORT_NORMAL") ; + zoneContainer.addHistorySupportZoneAtBottom(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,newZone.getHigherEdge(),newZone.getLowerEdge(),BOS_zone_color); + } + + + return 0 ; + + } + } + } + return 2 ; // this is the case that we didnt find a zone below the current lowest zone, which means the lowest zone now, will be breakout zone + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool allSupportsAreNormalType(ZoneContainer& zoneContainer) + { + for(int i=0 ; i< zoneContainer.getNumberOfActiveZones() ; i++) + { + if(zoneContainer.getZoneByIndex(i).getType() == "TYPE_SUPPORT_BREAKOUT") + { + return false ; + } + + + } + return true ; + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool allResistancesAreNormalType(ZoneContainer& zoneContainer) + { + + for(int i=0 ; i< zoneContainer.getNumberOfActiveZones() ; i++) + { + if(zoneContainer.getZoneByIndex(i).getType() == "TYPE_RESISTANCE_BREAKOUT") + { + return false ; + } + + + } + return true ; + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void updateNormalZonesSupport(ZoneContainer& zoneContainer_Support,ENUM_TIMEFRAMES timeFrame,string timeFrameStr, long _color, double _rangeDistanceBetweenZonesAcual, int _timeFrameZoneCounterFactor) + { + + if(allSupportsAreNormalType(zoneContainer_Support)) // if all supports are type normal , then find the first support lower than the current lowest. + { + + + double lowestSupportPrice = zoneContainer_Support.getZoneByIndex(0).getLowerEdge() ; + int res = detectAndDrawFirstSupportZoneLowerThan(lowestSupportPrice, timeFrame,firstZoneShift, zoneContainer_Support, timeFrameStr,_color,_rangeDistanceBetweenZonesAcual,_timeFrameZoneCounterFactor) ; + + if(res == 1) // if we found lower support than the current lower, and the range is valid, then keep both + { + + zoneContainer_Support.getZoneByIndex(1).setType("TYPE_SUPPORT_BREAKOUT"); // we choose index 1, because in index 0 now sits the new lower zone created by the previous function call. + } + else + if(res == 0) // if we found a lower support than the current lowest but the range is not valid, then keep only the lower one + { + + if(zoneContainer_Support.getNumberOfActiveZones() > 1) + { + zoneContainer_Support.getZoneByIndex(1).setType("TYPE_SUPPORT_NORMAL"); + deleteZoneGuiOnly(zoneContainer_Support.getZoneByIndex(1).getId(),zoneContainer_Support); + } + + } + else + if(res == 2) + { + zoneContainer_Support.getZoneByIndex(0).setType("TYPE_SUPPORT_BREAKOUT"); + + } + + } + + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void updateNormalZonesResistance(ZoneContainer& zoneContainer_Resistance,ENUM_TIMEFRAMES timeFrame,string timeFrameStr, long _color, double _rangeDistanceBetweenZonesAcual, int _timeFrameZoneCounterFactor) + { + if(allResistancesAreNormalType(zoneContainer_Resistance)) // if all resistances are type normal , then find the first resistance higher than the current highest resistance + { + + double highestResistanceZonePrice = zoneContainer_Resistance.getZoneByIndex(zoneContainer_Resistance.getNumberOfActiveZones()-1).getHigherEdge() ; + int res = detectAndDrawFirstResistanceZoneHigherThan(highestResistanceZonePrice, timeFrame,firstZoneShift, zoneContainer_Resistance, timeFrameStr,_color,_rangeDistanceBetweenZonesAcual,_timeFrameZoneCounterFactor); + + + if(res == 1) + { + if((zoneContainer_Resistance.getNumberOfActiveZones()-2) >= 0) + { + + zoneContainer_Resistance.getZoneByIndex(zoneContainer_Resistance.getNumberOfActiveZones()-2).setType("TYPE_RESISTANCE_BREAKOUT"); // we choose the second cell from the end, because in the last index now sits the new higher zone created by the previous function call. + } + + + } + else + if(res == 0) + { + + if((zoneContainer_Resistance.getNumberOfActiveZones()-2) >= 0) + { + deleteZoneGuiOnly(zoneContainer_Resistance.getZoneByIndex(zoneContainer_Resistance.getNumberOfActiveZones()-2).getId(),zoneContainer_Resistance); + } + + } + + else + if(res == 2) + { + zoneContainer_Resistance.getZoneByIndex(zoneContainer_Resistance.getNumberOfActiveZones()-1).setType("TYPE_RESISTANCE_BREAKOUT"); + + } + + } + + } + + + + + +//+------------------------------------------------------------------+ +void deleteZoneWithGUI(string _id, ZoneContainer& zoneContainer) + { + + + zoneContainer.deleteZone(_id); + + if(!ObjectDelete(_Symbol,_id)) + { + Print("Failed to delete object error: " + GetLastError()); + } + + + Print("Deleted the zone with gui!"); + + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void deleteZoneGuiOnly(string _id,ZoneContainer& zoneContainer) + { + + + if(!ObjectDelete(_Symbol,_id)) + { + Print("Failed to delete object error: " + GetLastError()); + } + + Print("Deleted the zone gui!"); + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool updateBreakAboveStructureAndDelete(ZoneContainer& zoneContainer, ENUM_TIMEFRAMES timeFrame, string timeFrameStr, double& brokenResistanceLowerEdge, string& type) + { + bool finishedDeleting = false ; + + if(zoneContainer.getNumberOfActiveZones() != 0) // if there are zones found + { + if(marketObserverTiger.candleClosedAboveResistanceByIndex(0,timeFrame,zoneContainer)) // check if candle closed above the zone + { + + + datetime _leftEdgeRestestZone = iTime(_Symbol,timeFrame,4); + datetime _rightEdgeRetestZone = D'2023.11.01 00:00:00'; + + + while(!finishedDeleting && zoneContainer.getNumberOfActiveZones() != 0) // this while is used in the case of a candle closing above more than 1 zone at once + { + + + if(zoneContainer.getNumberOfActiveZones() != 0 && marketObserverTiger.candleClosedAboveResistanceByIndex(0,timeFrame,zoneContainer)) + { + zoneContainer.getZoneByIndex(0).getHigherEdge(); + temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(0).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(0).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame(timeFrameStr); + + type = zoneContainer.getZoneByIndex(0).getType(); + temporaryRestestSupportZone.setType("TYPE_SUPPORT_TEMPORARY"); + + brokenResistanceLowerEdge = zoneContainer.getZoneByIndex(0).getLowerEdge(); // save the lower edge of the broken zone, in order to return it in the parameter + + deleteZoneWithGUI((zoneContainer.getZoneByIndex(0).getId()),zoneContainer); // delete the zone with the GUI + } + else + { + finishedDeleting = true ; + } + + + } + + + return true ; + + } + + + } + return false ; + + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool updateBreakBelowStructureAndDelete(ZoneContainer& zoneContainer, ENUM_TIMEFRAMES timeFrame, string timeFrameStr, double& brokenSupportHigherEdge, string& type) + { + bool finishedDeleting = false ; + + if(zoneContainer.getNumberOfActiveZones() != 0) // if there are zones found + { + + if(marketObserverTiger.candleClosedBelowSupportByIndex(zoneContainer.getNumberOfActiveZones() -1,timeFrame,zoneContainer)) // check if candle closed below the zone + { + + datetime _leftEdgeRestestZone = iTime(_Symbol,timeFrame,4); + datetime _rightEdgeRetestZone = D'2023.11.01 00:00:00'; + + + while(!finishedDeleting && zoneContainer.getNumberOfActiveZones() != 0) // this while is used in the case of a candle closing above more than 1 zone at once + { + + + if(zoneContainer.getNumberOfActiveZones() != 0 && marketObserverTiger.candleClosedBelowSupportByIndex(zoneContainer.getNumberOfActiveZones()-1,timeFrame,zoneContainer)) + { + zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge(); + temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("9999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame(timeFrameStr); + + type = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getType(); + temporaryRestestSupportZone.setType("TYPE_RESISTANCE_TEMPORARY"); + + brokenSupportHigherEdge = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge(); + + deleteZoneWithGUI((zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getId()),zoneContainer); // delete the zone with the GUI + } + else + { + finishedDeleting = true ; + } + + + } + + + return true ; + + + } + + + } + + return false ; + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double findClosestResistancePrice(ZoneContainer& zoneContainer) + { + + double closestResistancePrice = -1; + if(zoneContainer.getNumberOfActiveZones() != 0) + { + + closestResistancePrice = zoneContainer.getZoneByIndex(0).getLowerEdge(); + } + + return closestResistancePrice ; + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double findClosestSupportPrice(ZoneContainer& zoneContainer) + { + + double closestSupportPrice = -1 ; + if(zoneContainer.getNumberOfActiveZones() != 0) + { + + closestSupportPrice = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getLowerEdge(); + } + + return closestSupportPrice ; + + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool buyStopLossUnderZone(double resistanceZoneLowerEdge, double stopLossValue) + { + + if(stopLossValue < resistanceZoneLowerEdge) + { + return true ; + } + else + { + Comment("stop loss is not under the zone im not taking a buy"); + return false ; + + } + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool sellStopLossAboveZone(double supportZoneHigherEdge, double stopLossValue) + { + + if(stopLossValue > supportZoneHigherEdge) + { + return true ; + } + else + { + Comment("stop loss is not above the zone, so im not taking a sell"); + return false ; + } + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void manageRiskIfNeeded() + { + + if(PositionsTotal()!= 0) // There is an active trade + { + manageRiskOnBuysIfNeeded(); + manageRiskOnSellsIfNeeded(); + + } + + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void manageRiskOnBuysIfNeeded() + { + if(candleClosedBearish(PERIOD_M15,1) && !bearishCandleIsWeak(PERIOD_M15,1, WICK_RATIO_REJECTION)) + { + + for(int i = 0 ; i < NUM_MAX_ALLOWED_TRADES ; i++) + { + if((BuyActiveTradesArray[i] != NULL) && !(BuyActiveTradesArray[i].riskAlreadyManaged())) // if the trade still hasnt managead risk , then do it now. + { + closePartialFromSpecificPosition(BuyActiveTradesArray[i].getTradeId(),riskManagementPartial); + BuyActiveTradesArray[i].manageRisk(); + } + } + + } + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void manageRiskOnSellsIfNeeded() + { + + if(candleClosedBullish(PERIOD_M15,1) && !bullishCandleIsWeak(PERIOD_M15,1, WICK_RATIO_REJECTION)) + { + for(int i = 0 ; i < NUM_MAX_ALLOWED_TRADES ; i++) + { + if((SellActiveTradesArray[i] != NULL) && !(SellActiveTradesArray[i].riskAlreadyManaged())) // if the trade still hasnt managead risk , then do it now. + { + closePartialFromSpecificPosition(SellActiveTradesArray[i].getTradeId(),riskManagementPartial); + SellActiveTradesArray[i].manageRisk(); + } + } + + } + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void secureProfitIfNeeded() + { + + if(PositionsTotal() != 0) // if there are active trades + { + + secureProfitOnBuysIfNeeded(); + secureProfitOnSellsIfNeeded(); + + } + + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void secureProfitOnBuysIfNeeded() + { + + for(int i=0 ; i< NUM_MAX_ALLOWED_TRADES ; i++) + { + + if((BuyActiveTradesArray[i] != NULL) && !(BuyActiveTradesArray[i].firstPartialIsSecured())) // if first partial is not yet secured for the current position + { + + double currentProfit = positionProfitInPips(BuyActiveTradesArray[i].getTradeId()); + if(currentProfit >= firstPartialProfitInPipsActual) + { + closePartialFromSpecificPosition(BuyActiveTradesArray[i].getTradeId(),firstPartialCloseFactor) ; + BuyActiveTradesArray[i].secureFirstPartial(); + } + + } + } + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void secureProfitOnSellsIfNeeded() + { + + for(int i=0 ; i< NUM_MAX_ALLOWED_TRADES ; i++) + { + + if((SellActiveTradesArray[i] != NULL) && !(SellActiveTradesArray[i].firstPartialIsSecured())) // if first partial is not yet secured for the current position + { + + double currentProfit = positionProfitInPips(SellActiveTradesArray[i].getTradeId()); + if(currentProfit >= firstPartialProfitInPipsActual) + { + closePartialFromSpecificPosition(SellActiveTradesArray[i].getTradeId(),firstPartialCloseFactor) ; + SellActiveTradesArray[i].secureFirstPartial(); + } + } + } + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int findAvailableSpotInBuyManagerArr() // returns the index , or -1 if all are full + { + + for(int i=0 ; i < NUM_MAX_ALLOWED_TRADES ; i++) + { + if(BuyActiveTradesArray[i] == NULL) + { + return i; + + } + + } + return -1 ; + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int findAvailableSpotInSellManagerArr() // returns the index , or -1 if all are full + { + + for(int i=0 ; i positionStopLoss(BuyActiveTradesArray[i].getTradeId())) // if new stop loss is higher than the current position's stop loss + { + if(SymbolInfoDouble(_Symbol,SYMBOL_BID) <= newStopLoss){ // close the trade because the bid is lower than the stop loss (and the modify will fail)) + tradeLong.PositionClose(BuyActiveTradesArray[i].getTradeId()); + } + positionTrailStopLoss(BuyActiveTradesArray[i].getTradeId(),newStopLoss,0); + } + } + + + + if((SellActiveTradesArray[i] != NULL)) // CHECK TRAIL FOR SELLS + { + double newStopLoss = iHigh(_Symbol,_timeFrame,1); + newStopLoss = newStopLoss + stopLossAboveWickByActual ; + if(newStopLoss < positionStopLoss(SellActiveTradesArray[i].getTradeId())) // if new stop loss is lower than the current position's stop loss + { + if(SymbolInfoDouble(_Symbol,SYMBOL_ASK) >= newStopLoss){ // close the trade because the ask is higher than the stop loss (and the modify will fail)) + tradeShort.PositionClose(SellActiveTradesArray[i].getTradeId()); + } + positionTrailStopLoss(SellActiveTradesArray[i].getTradeId(),newStopLoss,0); + } + } + + + } + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + +/*int bottomWickIsValid() + { + double previousCandleBodySize = iClose(_Symbol,PERIOD_M30,1) - iOpen(_Symbol,PERIOD_M30,1) ; + double currentWickSize = iOpen(_Symbol,PERIOD_M30,0) - iLow(_Symbol,PERIOD_M30,0); + if((iHigh(_Symbol,PERIOD_M30,0) - iOpen(_Symbol,PERIOD_M30,0)) > preWickPush) // this case we would not take the trade at all, because pushed too much in the beggining of the candle + { + return 0; + } + else + if(currentWickSize < previousCandleBodySize * retracementWickFibMeasure) // this case we would wait until the wick size becomes valid + { + + return 1 ; + } + + + else + if(SymbolInfoDouble(_Symbol,SYMBOL_ASK) > iOpen(_Symbol,PERIOD_M30,0)) + { + + return -1 ; + } + + return 2 ; // this case means the wick that was formed is healthy and we only need the price to reach the candle open in order to check the trade and execute + } */ + + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +/* +int handleBottomWickValidation() + { + + int result = bottomWickIsValid() ; + if(result == 0) // not considering the trade + { + Comment("not considering the trade"); + } + else + if(result == 1) // the wick was formed however its not big enough, so we need to wait more (call bottomWickIsValid() again)) + { + Comment("bottom wick is too small, lets wait to see if it becomes valid"); + } + else + if(result == 2) // the wick was formed and it satisfies the conditions, so now just wait for the price to reach the candle open + { + + Comment("bottom wick is valid, im waiting the price to reach the candle open in order to consider executing"); + } + + else + if(result == -1) + { + + Comment("Price has already moved !"); + } + + + return result ; + } */ + +/*void updateBottomWickState(int bottomWickValidationState) + { + datetime currTime = TimeCurrent(); + switch(bottomWickValidationState) + { + case -1 : // not considering the trade because price already moved + Comment(TimeToString(currTime,TIME_MINUTES) + ": not considering the trade because price already moved"); + waitForBottomWickToForm = false ; + wickLengthCounter = 0; + break; + + case 0 : // not considering the trade because price pushed too much upwards before the wick formed + Comment(TimeToString(currTime,TIME_MINUTES) + ": not considering the trade because price pushed too much upwards before the wick formed"); + waitForBottomWickToForm = false ; + wickLengthCounter = 0; + break; + case 1: // bottom wick has formed but its too small, lets wait for it to become valid + Comment(TimeToString(currTime,TIME_MINUTES) + ": bottom wick has formed but its too small, lets wait for it to become valid"); + + break; + + case 2 : // bottom wick has formed and its healthy, lets wait for price to reach candle entry, in order to check sl + Comment(TimeToString(currTime,TIME_MINUTES) + ": bottom wick has formed and its healthy, lets wait for price to reach candle entry, in order to check sl"); + waitForBottomWickToForm = false ; + wickLengthCounter = 0; + bottomWickFormed = true ; + buyStopPrice = iHigh(_Symbol,PERIOD_CURRENT,0) + stopOrderFactor ; + break; + } + } */ + + +/*int topWickIsValid() + { + double previousCandleBodySize = iOpen(_Symbol,PERIOD_M30,1) - iClose(_Symbol,PERIOD_M30,1); + double currentWickSize = iHigh(_Symbol,PERIOD_M30,0) - iOpen(_Symbol,PERIOD_M30,0); + if((iOpen(_Symbol,PERIOD_M30,0) - iLow(_Symbol,PERIOD_M30,0)) > preWickPush) // this case we would not take the trade at all + { + return 0; + } + else + if(currentWickSize < retracementWickFibMeasure * previousCandleBodySize) // this case we would wait until the wick size becomes valid + { + + return 1 ; + } + else + if(SymbolInfoDouble(_Symbol,SYMBOL_BID) < iOpen(_Symbol,PERIOD_M30,0)) + { + + return -1 ; + } + return 2 ; // this case means the wick that was formed is healthy and we only need the price to reach the candle open in order to check the trade and execute + + } */ +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +/* int handleTopWickValidation() + { + int result = topWickIsValid() ; + if(result == 0) // not considering the trade + { + Comment("not considering the trade"); + } + else + if(result == 1) // the wick was formed however its not big enough, so we need to wait more + { + Comment("top wick is too small, lets wait to see if it becomes valid"); + } + else + if(result == 2) // the wick was formed and it satisfies the conditions, so now just wait for the price to reach the candle open + { + + Comment("top wick is valid, im waiting the price to reach the candle open in order to consider executing"); + } + + else + if(result == -1) + { + Comment("Price has already moved !"); + } + + + return result ; + + } */ +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +/* void updateTopWickState(int topWickValidationState) + { + datetime currTime = TimeCurrent(); + switch(topWickValidationState) + { + case -1 : // not considering the trade because price already moved + Comment(TimeToString(currTime,TIME_MINUTES) + ": not considering the trade because price already moved"); + waitForTopWickToForm = false ; + wickLengthCounter = 0; + break; + + case 0 : // not considering the trade because price pushed too much downwards before the wick formed + Comment(TimeToString(currTime,TIME_MINUTES) + ": not considering the trade because price pushed too much downwards before the wick formed"); + waitForTopWickToForm = false ; + wickLengthCounter = 0; + break; + case 1: // top wick has formed but its too small, lets wait for it to become valid + Comment(TimeToString(currTime,TIME_MINUTES) + ": top wick has formed but its too small, lets wait for it to become valid"); + + break; + + case 2 : // top wick has formed and its healthy, lets wait for price to reach candle low, in order to check sl + Comment(TimeToString(currTime,TIME_MINUTES) + ": top wick has formed and its healthy, lets wait for price to reach candle low, in order to check sl"); + waitForTopWickToForm = false ; + wickLengthCounter = 0; + topWickFormed = true ; + sellStopPrice = iLow(_Symbol,PERIOD_CURRENT,0) - stopOrderFactor ; + break; + } + + + } */ + +//+------------------------------------------------------------------+ + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void handleBullishBreakouts(ZoneContainer& _zoneContainer, ENUM_TIMEFRAMES _timeFrame,string _timeFrameStr) + { + double brokenResistanceLowerPrice = -1 ; + string brokenZoneTypeResistance = "" ; + if(updateBreakAboveStructureAndDelete(_zoneContainer,_timeFrame,_timeFrameStr,brokenResistanceLowerPrice,brokenZoneTypeResistance)) + { + if(_timeFrameStr == "PERIOD_H4") + { + last_H4_candle_broke_structure = true ; + } + + } + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void handleBearishBreakouts(ZoneContainer& _zoneContainer, ENUM_TIMEFRAMES _timeFrame,string _timeFrameStr) + { + double brokenSupportHigherPrice = -1; + string brokenZoneTypeSupport = "" ; + + if(updateBreakBelowStructureAndDelete(_zoneContainer,_timeFrame,_timeFrameStr,brokenSupportHigherPrice,brokenZoneTypeSupport)) + { + if(_timeFrameStr == "PERIOD_H4") + { + last_H4_candle_broke_structure = true ; + } + } + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void handleBuys(ZoneContainer& _zoneContainer, ENUM_TIMEFRAMES _timeFrame,string _timeFrameStr, double _cleanRangeUponEntryActual) + { + + double brokenResistanceLowerPrice = -1 ; + string brokenZoneTypeResistance = "" ; + + if(updateBreakAboveStructureAndDelete(_zoneContainer,_timeFrame,_timeFrameStr,brokenResistanceLowerPrice,brokenZoneTypeResistance) + && buyBreakerCandleIsValid(_timeFrame, SIZE_OF_BREAKER_CANDLE_BODY) + && ((sessionIsNy() && TRADE_NEW_YORK_ALLOWED) || (sessionIsLondon() && TRADE_LONDON_ALLOWED) || (sessionIsTokyo() && TRADE_TOKYO_ALLOWED)) && BUYS_ALLOWED) // means M30 candle broke structure, and the breaker candle is valid (big enough),and time is in the sessions (ny or london or both, based on what the user chose)) + { + + + if(brokenZoneTypeResistance == "TYPE_RESISTANCE_BREAKOUT") + { + + + + + int indexToNewTrade ; + if((indexToNewTrade = findAvailableSpotInBuyManagerArr()) != -1) // find a spot in the trades array, and save the result + { + + if(H4TimeFrameConfirmedBuys() && validateCleanRangeBuys_H4() && validateCleanRangeBuys_H1() && validateCleanRangeBuys_M30()) + { + + double stopLossPrice ; + if((stopLossPrice = findAndValidateStopLossBuys(_timeFrameStr,maxPipsRiskAmountActual))!= -1) + { + + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossPrice); + activeTradeId = buyEntryManager.takeBuyTradeTiger(lotsToEnter,stopLossPrice) ; + + BuyTradeManagerTiger* tempTigerManager= new BuyTradeManagerTiger(activeTradeId); // create an object of type buyTradeManagerTiger + BuyActiveTradesArray[indexToNewTrade] = tempTigerManager ;// put the new object in the array + buysCount++; + + Comment("Took a buy. stop loss: based on "+ _timeFrameStr + " Active trade id: " + activeTradeId); + + + } + + + } + + } + else + { + + Comment("I cant take a buy because the trades array is full"); + } + + + } + + else + { + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + Comment(timeInStr+ ": Cant take a buy, because the broken resistance zone is not a break out zone !"); + + } + } + + + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double findAndValidateStopLossBuys(string _timeFrameStr,double _maxPipsRiskAmountActual) + { + + if(_timeFrameStr == "PERIOD_H4") + { + + double stopLossBased_H4 = iLow(_Symbol,PERIOD_H4,1); + stopLossBased_H4 = stopLossBased_H4 - stopLossUnderWickByActual ; + if(stopLossIsValidBuys(stopLossBased_H4,_maxPipsRiskAmountActual)) + { + return stopLossBased_H4 ; + } + Comment("Cant take a buy, because stop loss is not valid"); + return -1 ; + + } + else + if(_timeFrameStr == "PERIOD_H1") + { + double stopLossBased_H1 = iLow(_Symbol,PERIOD_H1,1); + stopLossBased_H1 = stopLossBased_H1 - stopLossUnderWickByActual ; + + double stopLossBased_M30 = iLow(_Symbol,PERIOD_M30,1); + stopLossBased_M30 = stopLossBased_M30 - stopLossUnderWickByActual ; + + if(stopLossIsValidBuys(stopLossBased_H1,_maxPipsRiskAmountActual)) + { + return stopLossBased_H1 ; + } + else + if(stopLossIsValidBuys(stopLossBased_M30,_maxPipsRiskAmountActual)) + { + return stopLossBased_M30 ; + } + Comment("Cant take a buy, because stop loss is not valid"); + return -1 ; + } + else + if(_timeFrameStr == "PERIOD_M30") + { + + double stopLossBased_M30 = iLow(_Symbol,PERIOD_M30,1); + stopLossBased_M30 = stopLossBased_M30 - stopLossUnderWickByActual ; + + double stopLossBased_M15 = iLow(_Symbol,PERIOD_M15,1); + stopLossBased_M15 = stopLossBased_M15 - stopLossUnderWickByActual ; + + if(stopLossIsValidBuys(stopLossBased_M30,_maxPipsRiskAmountActual)) + { + return stopLossBased_M30 ; + } + else + if(stopLossIsValidBuys(stopLossBased_M15,_maxPipsRiskAmountActual)) + { + return stopLossBased_M15 ; + } + Comment("Cant take a buy, because stop loss is not valid"); + return -1 ; + } + Comment("Cant take a buy, because stop loss is not valid"); + return -1 ; + } + + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void handleSells(ZoneContainer& _zoneContainer, ENUM_TIMEFRAMES _timeFrame,string _timeFrameStr, double _cleanRangeUponEntryActual) + { + + double brokenSupportHigherPrice = -1; + string brokenZoneTypeSupport = "" ; + + if(updateBreakBelowStructureAndDelete(_zoneContainer,_timeFrame,_timeFrameStr,brokenSupportHigherPrice,brokenZoneTypeSupport) + && sellBreakerCandleIsValid(_timeFrame, SIZE_OF_BREAKER_CANDLE_BODY) + && ((sessionIsNy() && TRADE_NEW_YORK_ALLOWED) || (sessionIsLondon() && TRADE_LONDON_ALLOWED) || (sessionIsTokyo() && TRADE_TOKYO_ALLOWED)) && SELLS_ALLOWED) // means M30 candle broke structure, and the breaker candle is valid (big enough),and time is in the sessions (ny or london or both, based on what the user chose)) + { + + + if(brokenZoneTypeSupport == "TYPE_SUPPORT_BREAKOUT") + { + + + + int indexToNewTrade ; + if((indexToNewTrade = findAvailableSpotInSellManagerArr()) != -1) // find a spot in the trades array, and save the result + { + + if(H4TimeFrameConfirmedSells() && validateCleanRangesSells_H4() && validateCleanRangeSells_H1() && validateCleanRangeSells_M30()) + { + double stopLossPrice ; + if((stopLossPrice = findAndValidateStopLossSells(_timeFrameStr,maxPipsRiskAmountActual))!= -1) + { + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossPrice); + activeTradeId = sellEntryManager.takeSellTradeTiger(lotsToEnter,stopLossPrice) ; + SellTradeManagerTiger* tempTigerManager= new SellTradeManagerTiger(activeTradeId); // create an object of type sellTradeManagerTiger + SellActiveTradesArray[indexToNewTrade] = tempTigerManager ;// put the new object in the array + sellsCount++; + Comment("Took a sell. stop loss: based on "+ _timeFrameStr + " Active trade id: " + activeTradeId); + + } + + + } + + } + else + { + + Comment("I cant take a sell because the trades array is full"); + } + + + + } + + else + { + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + Comment(timeInStr+ ": Cant take a sell, because the broken resistance zone is not a break out zone !"); + + } + + } + + + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double findAndValidateStopLossSells(string _timeFrameStr,double _maxPipsRiskAmountActual) + { + + if(_timeFrameStr == "PERIOD_H4") + { + + double stopLossBased_H4 = iHigh(_Symbol,PERIOD_H4,1); + stopLossBased_H4 = stopLossBased_H4 + stopLossUnderWickByActual ; + if(stopLossIsValidSells(stopLossBased_H4,_maxPipsRiskAmountActual)) + { + return stopLossBased_H4 ; + } + Comment("Cant take a sell because stop loss is not valid !"); + return -1 ; + + } + else + if(_timeFrameStr == "PERIOD_H1") + { + double stopLossBased_H1 = iHigh(_Symbol,PERIOD_H1,1); + stopLossBased_H1 = stopLossBased_H1 + stopLossAboveWickByActual ; + + double stopLossBased_M30 = iHigh(_Symbol,PERIOD_M30,1); + stopLossBased_M30 = stopLossBased_M30 + stopLossAboveWickByActual ; + + if(stopLossIsValidSells(stopLossBased_H1,_maxPipsRiskAmountActual)) + { + return stopLossBased_H1 ; + } + else + if(stopLossIsValidSells(stopLossBased_M30,_maxPipsRiskAmountActual)) + { + return stopLossBased_M30 ; + } + Comment("Cant take a sell because stop loss is not valid !"); + return -1 ; + } + else + if(_timeFrameStr == "PERIOD_M30") + { + + double stopLossBased_M30 = iHigh(_Symbol,PERIOD_M30,1); + stopLossBased_M30 = stopLossBased_M30 + stopLossUnderWickByActual ; + + double stopLossBased_M15 = iHigh(_Symbol,PERIOD_M15,1); + stopLossBased_M15 = stopLossBased_M15 + stopLossUnderWickByActual ; + + if(stopLossIsValidSells(stopLossBased_M30,_maxPipsRiskAmountActual)) + { + return stopLossBased_M30 ; + } + else + if(stopLossIsValidSells(stopLossBased_M15,_maxPipsRiskAmountActual)) + { + return stopLossBased_M15 ; + } + Comment("Cant take a sell because stop loss is not valid !"); + return -1 ; + } + Comment("Cant take a sell because stop loss is not valid !"); + return -1 ; + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool H4TimeFrameConfirmedBuys() + { + + + if(!H4_Break_Confirmation && !H4_Closure_Confirmation) // if the user doesnt want any 4H confirmation, return true . now the code understands that its not necessecary to look at the 4H confirmation. + { + return true ; + } + + if((H4_Closure_Confirmation && candleClosedBullish(PERIOD_H4,1)) && !H4_Break_Confirmation) // if the user wants only 4H closure confirmation + { + + return true ; + } + else + if(candleClosedBullish(PERIOD_H4,1) && (H4_Break_Confirmation && last_H4_candle_broke_structure)) // if the user wants a 4H breakout confirmation (which includes the closure confirmation too) + { + Print("Price broke structure on H4"); + return true ; + } + + + return false ; // all other cases return false, which means the 4H confirmation conditon wast not satisfied. + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool H4TimeFrameConfirmedSells() + { + + + if(!H4_Break_Confirmation && !H4_Closure_Confirmation) // if the user doesnt want any 4H confirmation, return true . now the code understands that its not necessecary to look at the 4H confirmation. + { + return true ; + } + + if((H4_Closure_Confirmation && candleClosedBearish(PERIOD_H4,1)) && !H4_Break_Confirmation) // if the user wants only 4H closure confirmation + { + + return true ; + } + else + if(candleClosedBearish(PERIOD_H4,1) && (H4_Break_Confirmation && last_H4_candle_broke_structure)) // if the user wants a 4H breakout confirmation (which includes the closure confirmation too) + { + Print("Price broke structure on H4"); + return true ; + } + + + return false ; // all other cases return false, which means the 4H confirmation conditon wast not satisfied. + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool validateCleanRangesBuys() + { + double nearest_H4_Resistance = findClosestResistancePrice(zoneContainer_H4); + double nearest_H1_Resistance = findClosestResistancePrice(zoneContainer_H1); + double nearest_M30_Resistance = findClosestResistancePrice(zoneContainer_M30); + + if((nearest_H4_Resistance >= cleanRangeUponEntryActual) && (nearest_H1_Resistance >= cleanRangeUponEntryActual) && (nearest_M30_Resistance >= cleanRangeUponEntryActual)) + { + return true ; + + } + + return false ; + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool validateCleanRangeBuys_H4() + { + double nearest_H4_Resistance = findClosestResistancePrice(zoneContainer_H4); + double cleanRangeValue_H4 = nearest_H4_Resistance - SymbolInfoDouble(_Symbol,SYMBOL_ASK) ; + if(((cleanRangeValue_H4 >= cleanRangeUponEntryActual) && (cleanRangeValue_H4 > 0))|| (nearest_H4_Resistance == -1)) + { + return true ; + } + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + Comment(timeInStr + ": Cant Take a buy, Reason: No Clean Range on H4"); + return false ; + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool validateCleanRangeBuys_H1() + { + double nearest_H1_Resistance = findClosestResistancePrice(zoneContainer_H1); + double cleanRangeValue_H1 = nearest_H1_Resistance - SymbolInfoDouble(_Symbol,SYMBOL_ASK) ; + if(((cleanRangeValue_H1 >= cleanRangeUponEntryActual) && (cleanRangeValue_H1 > 0))|| (nearest_H1_Resistance == -1)) + { + return true ; + } + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + Comment(timeInStr + ": Cant Take a buy, Reason: No Clean Range on H1"); + return false ; + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool validateCleanRangeBuys_M30() + { + double nearest_M30_Resistance = findClosestResistancePrice(zoneContainer_M30); + double cleanRangeValue_M30 = nearest_M30_Resistance - SymbolInfoDouble(_Symbol,SYMBOL_ASK) ; + if(((cleanRangeValue_M30 >= cleanRangeUponEntryActual) && (cleanRangeValue_M30 > 0))|| (nearest_M30_Resistance == -1)) + { + return true ; + } + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + Comment(timeInStr + ": Cant Take a buy, Reason: No Clean Range on M30"); + return false ; + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool validateCleanRangesSells_H4() + { + double nearest_H4_Support = findClosestSupportPrice(zoneContainerSupport_H4); + double cleanRangeValue_H4 = SymbolInfoDouble(_Symbol,SYMBOL_BID) - nearest_H4_Support ; + if(((cleanRangeValue_H4 >= cleanRangeUponEntryActual) && (cleanRangeValue_H4 > 0))|| (nearest_H4_Support == -1)) + { + return true ; + } + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + Comment(timeInStr + ": Cant Take a sell, Reason: No Clean Range on H4"); + return false ; + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool validateCleanRangeSells_H1() + { + double nearest_H1_Support = findClosestSupportPrice(zoneContainerSupport_H1); + double cleanRangeValue_H1 = SymbolInfoDouble(_Symbol,SYMBOL_BID) - nearest_H1_Support ; + if(((cleanRangeValue_H1 >= cleanRangeUponEntryActual) && (cleanRangeValue_H1 > 0))|| (nearest_H1_Support == -1)) + { + return true ; + } + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + Comment(timeInStr + ": Cant Take a sell, Reason: No Clean Range on H1"); + return false ; + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool validateCleanRangeSells_M30() + { + double nearest_M30_Support = findClosestSupportPrice(zoneContainerSupport_M30); + double cleanRangeValue_M30 = SymbolInfoDouble(_Symbol,SYMBOL_BID) - nearest_M30_Support ; + if(((cleanRangeValue_M30 >= cleanRangeUponEntryActual) && (cleanRangeValue_M30 > 0))|| (nearest_M30_Support == -1)) + { + Print("Closest support is: "+ nearest_M30_Support); + return true ; + } + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + Comment(timeInStr + ": Cant Take a sell, Reason: No Clean Range on M30"); + return false ; + } + + + + +//+------------------------------------------------------------------+ diff --git a/Breakout_Fractals.ex5 b/Breakout_Fractals.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..db3bad191ae0a0b7fe69eb12c4f57f54efeb36e6 GIT binary patch literal 68614 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 QcTm*c;{AJ(OBWUZ09Wk$QUCw| literal 0 HcmV?d00001 diff --git a/Breakout_Fractals.mq5 b/Breakout_Fractals.mq5 new file mode 100644 index 0000000..faad5b5 --- /dev/null +++ b/Breakout_Fractals.mq5 @@ -0,0 +1,404 @@ +//+------------------------------------------------------------------+ +//| Breakout_Fractals.mq5 | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ + +//#include "Algo_Skeleton_Functions.mqh" +#include "Phoenix_Functions.mqh" + +bool trailWhenMarketOpensDaily = false ; +int OnInit() + { +//--- + +//--- + for(int i=0; i + +CTrade tradeLong ; +class BuyEntryManager + { +private: + + bool longTradeTaken ; + bool waitingForRejectionCandle; + bool waitingForRetracement ; + + + +public: + BuyEntryManager(); + ~BuyEntryManager(); + + BuyRejectionDetector* buyRejectionDetector ; + + bool isWaitingForRejectionCandle(){return waitingForRejectionCandle ;} + void setWaitingForRejectionCandle(bool _setting){waitingForRejectionCandle = _setting ;} + + bool isWaitingForRetracement(){return waitingForRetracement;} + void setWaitingForRetracement(bool _setting){waitingForRetracement = _setting ;} + + bool buyTradeTaken(); + void setTradeTakenStatus(bool _status){longTradeTaken = _status ; Print("long trade taken flag has been set to true");} + + + ulong takeBuyTrade(double _lots,double _stopLoss); + ulong takeBuyTradeTiger(double _lots,double _stopLoss,double _takeProfit); + ulong takeBuyTradeTiger(double _lots,double _stopLoss); + + + + + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +BuyEntryManager::BuyEntryManager() + { + buyRejectionDetector = new BuyRejectionDetector(); + longTradeTaken = false ; + waitingForRejectionCandle = false ; + waitingForRetracement = false ; + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +BuyEntryManager::~BuyEntryManager() + { + delete buyRejectionDetector ; + } +//+------------------------------------------------------------------+ + + +bool BuyEntryManager:: buyTradeTaken(){ + + +return longTradeTaken ; +} + + +ulong BuyEntryManager:: takeBuyTrade(double _lots, double _stopLoss){ + + tradeLong.Buy(NormalizeDouble(_lots,2),_Symbol,SymbolInfoDouble(_Symbol, SYMBOL_ASK),_stopLoss); + + ulong tradeTicket = tradeLong.ResultOrder(); + + Print("Buy entry manager has taken a trade, ticket: " + tradeTicket); + return tradeTicket; + + +} + + +ulong BuyEntryManager:: takeBuyTradeTiger(double _lots,double _stopLoss, double _takeProft){ // first version, take the buy with fixed tp + + double netTp = _takeProft - SymbolInfoDouble(_Symbol, SYMBOL_ASK) ; + + tradeLong.Buy(NormalizeDouble(_lots,2),_Symbol,SymbolInfoDouble(_Symbol, SYMBOL_ASK),_stopLoss,SymbolInfoDouble(_Symbol, SYMBOL_ASK) + netTp); + + ulong tradeTicket = tradeLong.ResultOrder(); + + Print("Buy entry manager has taken a trade, ticket: " + tradeTicket); + return tradeTicket; + +} + + +ulong BuyEntryManager:: takeBuyTradeTiger(double _lots,double _stopLoss){ // second version, take the buy without a fixed tp + + + tradeLong.Buy(NormalizeDouble(_lots,2),_Symbol,SymbolInfoDouble(_Symbol, SYMBOL_ASK),_stopLoss); + + ulong tradeTicket = tradeLong.ResultOrder(); + + Print("Buy entry manager has taken a trade, ticket: " + tradeTicket); + return tradeTicket; + +} + diff --git a/BuyGandalf.mqh b/BuyGandalf.mqh new file mode 100644 index 0000000..f802a88 --- /dev/null +++ b/BuyGandalf.mqh @@ -0,0 +1,85 @@ +//+------------------------------------------------------------------+ +//| BuyGandalf.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include + +CTrade tradeLong ; +class BuyGandalf + { +private: + + bool longTradeTaken ; + ulong longTrades[10] ; + + +public: + BuyGandalf(); + ~BuyGandalf(); + + + + bool buyTradeTaken(); + void setTradeTakenStatus(bool _status){longTradeTaken = _status ; Print("long trade taken flag has been set to true");} + + + ulong takeBuyTrade(double _lots,double _stopLoss); + ulong takeBuyTradeGandalf(double _lots,double _stopLoss); + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +BuyGandalf::BuyGandalf() + { + + longTradeTaken = false ; + + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +BuyGandalf::~BuyGandalf() + { + } +//+------------------------------------------------------------------+ + + + +//+------------------------------------------------------------------+ + + +bool BuyGandalf:: buyTradeTaken(){ + + +return longTradeTaken ; +} + + +ulong BuyGandalf:: takeBuyTrade(double _lots, double _stopLoss){ + + tradeLong.Buy(NormalizeDouble(_lots,2),_Symbol,SymbolInfoDouble(_Symbol, SYMBOL_ASK),_stopLoss); + + ulong tradeTicket = tradeLong.ResultOrder(); + + Print("Buy entry manager has taken a trade, ticket: " + tradeTicket); + return tradeTicket; + + +} + + +ulong BuyGandalf:: takeBuyTradeGandalf(double _lots,double _stopLoss){ + + tradeLong.Buy(NormalizeDouble(_lots,2),_Symbol,SymbolInfoDouble(_Symbol, SYMBOL_ASK),_stopLoss); + + ulong tradeTicket = tradeLong.ResultOrder(); + + Print("Buy entry manager has taken a trade, ticket: " + tradeTicket); + return tradeTicket; + +} diff --git a/BuyRejectionDetector.mqh b/BuyRejectionDetector.mqh new file mode 100644 index 0000000..91f0fc3 --- /dev/null +++ b/BuyRejectionDetector.mqh @@ -0,0 +1,53 @@ +//+------------------------------------------------------------------+ +//| BuyRejectionDetector.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +class BuyRejectionDetector + { +private: + +public: + BuyRejectionDetector(); + ~BuyRejectionDetector(); + + bool rejectionByOneCandleFormed(ENUM_TIMEFRAMES _timeFrame); + bool rejectionByRangeFormed(); + bool rejectionByWicksFormed(); + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +BuyRejectionDetector::BuyRejectionDetector() + { + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +BuyRejectionDetector::~BuyRejectionDetector() + { + } +//+------------------------------------------------------------------+ + + +bool BuyRejectionDetector:: rejectionByOneCandleFormed(ENUM_TIMEFRAMES _timeFrame){ + + double rejectionCandleClose = iClose(_Symbol,_timeFrame,1); + double rejectionCandleOpen = iOpen(_Symbol,_timeFrame,1); + double rejectionCandleHigh = iHigh(_Symbol,_timeFrame,1) ; + double rejectionCandleHigherWickSize ; + double rejectionCandleBodySize ; + + if( rejectionCandleClose > rejectionCandleOpen ){ // the previous candle closed bullish + rejectionCandleHigherWickSize = rejectionCandleHigh - rejectionCandleClose; + rejectionCandleBodySize = rejectionCandleClose - rejectionCandleOpen; + if(rejectionCandleBodySize >= rejectionCandleHigherWickSize){ + return true ; + } + + } + return false ; +} \ No newline at end of file diff --git a/BuyTradeManager.mqh b/BuyTradeManager.mqh new file mode 100644 index 0000000..70e16d4 --- /dev/null +++ b/BuyTradeManager.mqh @@ -0,0 +1,587 @@ +//+------------------------------------------------------------------+ +//| BuyTradeManager.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +#include +#include +#include +CTrade tradeLongInTradeManager; + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +class BuyTradeManager + { +private: + int tradeId; + ulong rejectionByOneCandleTradeArray[3]; + + string firstSecureMethod ; + bool firstSecureMethodFound; + int numberOfTakeProfits ; + bool securedFirstLevelProfit ; + bool securedSecondLevelProfit; + double partialToClose ; + bool isTradeRunning ; + + +public: + BuyTradeManager(); + ~BuyTradeManager(); + + void fillRejectionByOneCandleTradeArray(int _index, int _id) {rejectionByOneCandleTradeArray[_index] = _id ;} + ulong getRejectionByOneCandleTradeTicket(int _index) {return rejectionByOneCandleTradeArray[_index] ;} + void printRejectionByOneCandleTradeArray(); + + void checkAndSecureTradeIfNeeded(double _ratio, double _riskInDollars); + string findFirstSecureMethod(); + + bool reachedProfitRatio(int _indexInArr); + bool closeTrade(int _indexInArr); + bool positionBreakEven(int _indexInArr); + + + void addTpAtIndex(int _index, double tpPrice) {tpArray[_index] = tpPrice;} + int countRemainingTakeProfits(); + bool reachedClosestTakeProfit(); + void deleteClosestTp(); + int findClosestTpIndex(); + + + void cleanOrderDataStructures(); + + void setTradeRunning(bool _setting) {isTradeRunning = _setting ;} + bool tradeIsRunning() {return isTradeRunning ;} + + double tpArray[3]; + + + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +BuyTradeManager::BuyTradeManager() + { + + for(int i=0; i<3; i++) + { + tpArray[i] = -1; + } + securedFirstLevelProfit = false ; + securedSecondLevelProfit = false ; + firstSecureMethodFound = false ; + firstSecureMethod = "NOT_FOUND" ; + partialToClose = -1 ; + isTradeRunning = false ; + + + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +BuyTradeManager::~BuyTradeManager() + { + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void BuyTradeManager:: printRejectionByOneCandleTradeArray() + { + + Print("Printing the tickets :"); + for(int i=0 ; i<3 ; i++) + { + Print((int)rejectionByOneCandleTradeArray[i]); + } + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void BuyTradeManager:: checkAndSecureTradeIfNeeded(double _ratio, double _riskInDollars) + { + if(securedFirstLevelProfit == false) // in this case im searching for 2 cases: either RR 1:1.5 , OR reaching the first TP , if any of them happened im gonna close half the order and updatae the remaining stop losses + { + + + if(!firstSecureMethodFound) + { + + firstSecureMethod = findFirstSecureMethod(); + if(firstSecureMethod != "FAILED") + { + + firstSecureMethodFound = true ; + } + else + if(firstSecureMethod == "FAILED") + { + Print("Failed to find the first secure method, go check the function : findFirstSecureMehod() !"); + } + + } + + if(firstSecureMethodFound == true) + { + + if(firstSecureMethod == "RATIO_METHOD") + { + cleanOrderDataStructures(); // this is used each time before we are choosing an order by ticket + if(reachedProfitRatio(0)) + { + ChartRedraw(); // Make sure the chart is up to date + + if(closeTrade(0)) // close the half + { + + rejectionByOneCandleTradeArray[0] = -1; + Print("Closed Half Of the position due to reaching the first secure Ratio!"); + } + else + { + Print("Failed Closing Half of the order by reaching the first secure Ratio !"); + } + + cleanOrderDataStructures(); // this is used each time before we are choosing an order by ticket + if(positionBreakEven(1)) // put the first quarter at break even + { + + Print(" First quarter has been put into break even due to reaching the first secure Ratio!"); + } + else + { + Print("Failed to Put the first quarter into break even"); + } + + numberOfTakeProfits = countRemainingTakeProfits(); + + Print("Number of remaining tps is: " + numberOfTakeProfits); + + securedFirstLevelProfit = true ; + } + + + + + + } + else + if(firstSecureMethod == "FIRST_TP_METHOD") + { + if(countRemainingTakeProfits() > 1) // there is at least 2 tp in the tp Array (because if this is the last tp then we want to close the whole order and not just a part of it) + { + if(reachedClosestTakeProfit()) // 2. Check if reached the first Tp + { + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + + // close the first half and update remaining partials sl's and delete the closest take profit from the array + cleanOrderDataStructures(); // this is used each time before we are choosing an order by ticket + if(closeTrade(0)) // close the half + { + + rejectionByOneCandleTradeArray[0] = -1; + Print("Closed Half Of the position due to reaching the first TP!"); + + } + else + { + Print("Failed Closing Half of the order by reaching the first TP !"); + } + cleanOrderDataStructures(); // this is used each time before we are choosing an order by ticket + if(positionBreakEven(1)) // put the first quarter at break even + { + + Print(" First quarter has been put into break even due to reaching the first TP!"); + } + else + { + Print("Failed to Put the first quarter into break even"); + } + deleteClosestTp(); + numberOfTakeProfits = countRemainingTakeProfits(); // update the number of remaining take profits + // calculate the remaining tps + + Print("Number of remaining tps is: " + numberOfTakeProfits); + Print("TP ARRY: " + tpArray[0] + ", " + tpArray[1] + " , " + tpArray[2]); + + securedFirstLevelProfit = true ; + + + } + } + else + if(numberOfTakeProfits = countRemainingTakeProfits() == 1) + { + if(reachedClosestTakeProfit()) + { + // close everything remained + } + } + } + + } + + + + } + else + if(securedFirstLevelProfit == true) // after securing the first level i just want to close the remaining partials by reaching the tp's + { + + if(countRemainingTakeProfits() == 1) + { + if(reachedClosestTakeProfit()) + { + // close everything + cleanOrderDataStructures(); + for(int i=0 ; i<3 ; i++) + { + closeTrade(i); + } + Print("Closed every thing because price reached the last Take Profit !"); + + ChartRedraw(); // Make sure the chart is up to date + + + deleteClosestTp(); + } + } + else + if(countRemainingTakeProfits() > 1) + { + if(reachedClosestTakeProfit()) + { + cleanOrderDataStructures(); + if(PositionSelectByTicket(rejectionByOneCandleTradeArray[1])) // DEALING WITH THE FIRST QUARTER + { + double currentLot = PositionGetDouble(POSITION_VOLUME); + if(partialToClose == -1) + { + partialToClose = currentLot/numberOfTakeProfits ; + } + if(tradeLongInTradeManager.PositionClosePartial(rejectionByOneCandleTradeArray[1],NormalizeDouble(partialToClose,2))) + { + uint res = tradeLongInTradeManager.ResultRetcode(); + if(res == 10009) + { + Print("Closed Partials successfully on the first quarter !"); + } + else + { + Print("The returned code is: " + res + " go check what it means !"); + } + + } + } + else + { + Print("Failed to select position by ticket! , Error: " + GetLastError()); + Print("The EA tried to close partials on the first quarter, but it is closed, probably due to break even and thats why it couldnt select the order !"); + } + + + cleanOrderDataStructures(); + if(PositionSelectByTicket(rejectionByOneCandleTradeArray[2])) // DEALING WITH THE SECOND QUARTER + { + if(PositionGetDouble(POSITION_SL) < PositionGetDouble(POSITION_PRICE_OPEN)) // this is to put the second quarter at break even if its not already at break even + { + positionBreakEven(2); + + } + double currentLot = PositionGetDouble(POSITION_VOLUME); + if(partialToClose == -1) + { + partialToClose = currentLot/numberOfTakeProfits ; + } + if(tradeLongInTradeManager.PositionClosePartial(rejectionByOneCandleTradeArray[2],NormalizeDouble(partialToClose,2))) + { + uint res = tradeLongInTradeManager.ResultRetcode(); + if(res == 10009) + { + Print("Closed Partials successfully on the second quarter!"); + } + else + { + Print("The returned code is: " + res + " go check what it means !"); + } + + } + + } + deleteClosestTp(); + Print("Number Of Remained tps is: " + countRemainingTakeProfits()); + + ChartRedraw(); // Make sure the chart is up to date + + + } + + } + + + } + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +string BuyTradeManager:: findFirstSecureMethod() + { + + cleanOrderDataStructures(); // this is used each time before we are choosing an order by ticket + if(PositionSelectByTicket(rejectionByOneCandleTradeArray[0])) + { + double positionStopLoss = PositionGetDouble(POSITION_SL); + double positionOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN); + double firstTakeProfit = tpArray[findClosestTpIndex()]; + if(((firstTakeProfit-positionOpenPrice)/(positionOpenPrice-positionStopLoss) > firstSecureRatio)) // firstTp > ratio + { + Print("Found the first profit secure method !"); + Print("The first TP RR is: 1:" + (firstTakeProfit-positionOpenPrice)/(positionOpenPrice-positionStopLoss) + "the firstSecureRatio is: 1:" + firstSecureRatio); + Print("The tp ratio is greater than the firstSecure so:"); + Print("The first secure method is RATIO_METHOD"); + return"RATIO_METHOD"; + } + else + if((firstTakeProfit-positionOpenPrice)/(positionOpenPrice-positionStopLoss)< firstSecureRatio) + { + Print("Found the first profit secure method !"); + Print("The first TP RR is: 1:" + (firstTakeProfit-positionOpenPrice)/(positionOpenPrice-positionStopLoss) + "the firstSecureRatio is: 1:" + firstSecureRatio); + Print("The tp ratio is less than the firstSecure so:"); + Print("The first secure method is FIRST_TP_METHOD"); + return "FIRST_TP_METHOD" ; + } + } + else + { + Print("Failed to select position by ticket 1, Error: " + GetLastError()); + } + + return "FAILED" ; + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool BuyTradeManager:: reachedProfitRatio(int _indexInArr) + { + + ulong _ticket = rejectionByOneCandleTradeArray[_indexInArr]; + if(_ticket != -1) + { + if(PositionSelectByTicket(_ticket)) + { + if(PositionGetDouble(POSITION_PROFIT)/(0.5*riskDollars) >= firstSecureRatio) // checking if the first half of the contract reached the ratio of first secure profit + { + Print("reached profit ratio !"); + return true ; + } + } + else + { + Print("Failed to select the position by ticket 4 ,Error: " + GetLastError()); + + } + + } + + return false ; + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool BuyTradeManager:: closeTrade(int _indexInArr) + { + + + ulong _ticket = rejectionByOneCandleTradeArray[_indexInArr]; + if(_ticket != -1) + { + if(PositionSelectByTicket(_ticket)) + { + + // close the first half and update remaining partials sl's + if(tradeLongInTradeManager.PositionClose(_ticket)) + { + return true ; + + } + else + { + + Print("Failed to close positon, Error:" + GetLastError()); + return false; + } + + } + else + { + + Print("Failed to select position by ticket , Error: "+ GetLastError()); + return false; + } + + } + + + return false ; + + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool BuyTradeManager:: positionBreakEven(int _indexInArr) + { + + ulong _ticket = rejectionByOneCandleTradeArray[_indexInArr]; + if(_ticket != -1) + { + if(PositionSelectByTicket(_ticket)) // select the first quarter + { + double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); + double positionTp = PositionGetDouble(POSITION_TP); + double positionSl = PositionGetDouble(POSITION_SL); + + if(tradeLongInTradeManager.PositionModify(_ticket,openPrice,positionTp)) + { + + + return true ; + } + else + { + Print("Failed to modify oder , ERROR: " + GetLastError()); + return false ; + } + + } + else + { + Print("Failed to select position by ticket "); + return false ; + } + } + + + return false ; + + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int BuyTradeManager:: countRemainingTakeProfits() + { + + int counter = 0 ; + for(int i=0; i<3 ; i++) + { + if(tpArray[i] != -1) + { + counter++ ; + } + } + + return counter; + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void BuyTradeManager:: deleteClosestTp() + { + + int closestTpIndex =findClosestTpIndex(); + tpArray[closestTpIndex] = -1; + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int BuyTradeManager:: findClosestTpIndex() + { + int closestTpIndex = 0; + int closestTpValue = 1000000 ; // dummy value + + for(int i=0; i<3; i++) + { + if(tpArray[i] != -1 && tpArray[i] < closestTpValue) + { + closestTpValue = tpArray[i]; + closestTpIndex = i ; + } + + } + + return closestTpIndex ; + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool BuyTradeManager:: reachedClosestTakeProfit() + { + + + double closestTakeProfitValue = tpArray[findClosestTpIndex()]; + //Print("im in reached closest take profit function ,the current price is: " + SymbolInfoDouble(_Symbol, SYMBOL_BID) + " and the tp is: " + closestTakeProfitValue); + if(SymbolInfoDouble(_Symbol, SYMBOL_BID) >= closestTakeProfitValue) // we are looking for the BID , because reaching a tp in a buy trade means we are selling, so we want our take profit value, to be at least as the BID price (because we want to find someone to buy it from us at this price) + { + return true ; + } + return false ; + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void BuyTradeManager:: cleanOrderDataStructures() + { +// this is to make sure, that every closed order is removed from the data strucutre ! + + for(int i=0; i<3; i++) + { + if(!PositionSelectByTicket(rejectionByOneCandleTradeArray[i])) + { + if(GetLastError() == 4753) + { + rejectionByOneCandleTradeArray[i] = -1 ; + } + } + } + + } +//+------------------------------------------------------------------+ + + diff --git a/BuyTradeManagerTiger.mqh b/BuyTradeManagerTiger.mqh new file mode 100644 index 0000000..d9295ba --- /dev/null +++ b/BuyTradeManagerTiger.mqh @@ -0,0 +1,72 @@ +//+------------------------------------------------------------------+ +//| BuyTradeManagerTiger.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +class BuyTradeManagerTiger + { +private: + + ulong tradeId ; + string entryType ; + bool firstPartialSecured ; + bool secondPartialSecured ; + bool managedRisk ; + bool retestWickFormed ; + double retestWickLengthInPips ; + + int riskManagementCandleCounter ; + double brokenResistanceLowerEdge ; + double brokenResistanceHigherEdge ; +public: + + ulong getTradeId(){return tradeId ;} + + bool riskAlreadyManaged(){return managedRisk ;} + void manageRisk(){managedRisk = true ;} + + bool firstPartialIsSecured(){return firstPartialSecured ;} + void secureFirstPartial(){firstPartialSecured = true ;} + + void setBrokenResistancetLowerEdge(double _brokenResistanceLowerEdge){brokenResistanceLowerEdge = _brokenResistanceLowerEdge ;} + void setBrokenResistanceHigherEdge(double _brokenResistanceHigherEdge){brokenResistanceHigherEdge = _brokenResistanceHigherEdge ;} + + double getBrokenResistanceLowerEdge(){return brokenResistanceLowerEdge ;} + double getBrokenResistanceHigherEdge(){return brokenResistanceHigherEdge ;} + + void incrementRiskManagementCandleCoutner(){riskManagementCandleCounter++ ;} + void decrementRiskManagementCandleCounter(){riskManagementCandleCounter-- ;} + + int getRiskManagementCandleCounter(){return riskManagementCandleCounter ;} + + void setRiskManagementCandleCounter(int count){ riskManagementCandleCounter = count ;} + + BuyTradeManagerTiger(ulong _tradeId); + ~BuyTradeManagerTiger(); + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +BuyTradeManagerTiger::BuyTradeManagerTiger(ulong _tradeId) + { + + tradeId = _tradeId ; + firstPartialSecured = false ; + secondPartialSecured = false ; + managedRisk = false ; + retestWickFormed = false ; + retestWickLengthInPips = 0 ; + + riskManagementCandleCounter = 0 ; + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +BuyTradeManagerTiger::~BuyTradeManagerTiger() + { + } +//+------------------------------------------------------------------+ + diff --git a/Entries_Newest.ex5 b/Entries_Newest.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..33fa53c3124f1e3c0f2be7cf3d8525eb2af85963 GIT binary patch literal 80262 zcmdRVQ;;YyknPyEZQHhO+qP}nbH}!A+qP%!*q(WJxAtTAeZ6{r+g(YzJ3OgMs*_Yi zHCTZh0mk74Kwtm>0004wLH;HGjYy1^`pN~=81ZOqn~3gySpQqre~PpI|F`A8^#5wd z3jzS(KY~CQ>c9AZ5|TE8ysw_F_bRZ2Tb3r0@&TO}DmSheWC0YO^E$PV>;uv!+GoA7 z>3`G`2CxTk0PqBG0lddhv z>K~>Dn9pWDNK)aVBNF&L)`@{BfLz^RH&uGxCZo}>oBx@vo1I^z%R#yYqG;Q6H)RXQ zuWe|^fx^uipOl8QimoCs5oXRfh+*?2z|LQ}KbM`uY$z~EyVS{$r|*3P!GXou!AD(( za1r>c=Nj7RGCol-{1$XNcNq%CcwCvLa}Lyx_J7m@RF3Y=*pm;jIED^y2arJmmYjZ= zPQ){Pbkw)-`UH1;lb}*CMa9%i|5`W^unRXCtXTAmVk@_a$tz;lIqiXdtW6!#8AS$KqlcpcQHhbD?n19tI+N*KSQ%C=3R* zZg(=Zhbj7BPu`ZKw@)j8I&*Y2LT_j9*jVqk8mV6S>_WQVccq zJ^;bJ`xPI&N!Ro;rIz|0ffIn+#gb&@t>(LJE-UD(8IIbE06b9meg1Y)j;MAPUECV? z%=)jnDc0Rfv}E6(?n(DUj)?qR!p&>}5=lOsZty34tWtQ+zRudz?xfjBN0=HDl`9Zdy_#2AUP9FQXsr+==saWpznJQjK&{(U1;uP`RlZD)g0q}06 z)70NX+I)f?`QL$`V#m7A<85)mQ}@8i*iSO8 zPTqC>V~a-g&l6D~{JN%!kQ+=`?~;2LjP}i!Ou74NwF=AEynmbx!>VwjjN!GwnjyzQ zAEsiKx(_%xrMevnLFyqq(T#Ge=eK$+1QKqFD>Vcv(puq{7b*yL`$7-vyVQBv^OwK7 z1(2m>c&MORDv!^<`dNK?R9s^$v*Z+IV>edz2?v-L)|jCmrk|hQB^;Eo@xm-5TZfo) zMx06xv;C~g`KL=MAGx~j3O{n{5_+K8rk1qyn)p_4kwh?|<}>d2DS2gLqt0fPO140% zRA6Z{M{j0}{2u?@{?P$)ux+qL(J*(FGjyJjF%8q5_!Up^EVX>n^!) zzj5p=4h7R4tTl4{fcfjixTBZFuWs!`Pgcfu+K1e?yBJy+_tLYT9^AW_?WoHUruem= z*mG)HLW)~MCipm-CE0hQVk|$CiUVh}h^$~_O=XKfvCz=Vcc84JE4h-dWQ(V&Uxz>? z3={%38%-;`mx&Z4Rj0! z%}NvRHv9FeX`*e`=y|$=z~o@ndxbD-CYK=L#mZq`=l-O@YDycHj2BzkK1g=-9$)}m?f^0{zJshVW~U|?~2)rdflU)b3dWl9c@>ET@ysI-WsTbzp0HU8*;8j zyEp7pJoO}mFTSn+b{^;2uCiL*)bPXBLXG1L(cCJ|A&Pc7yNqI)9jF60@8#_04Rh(V zeM9r)xj?bUV2z~t$${N%@p5rlr8YyPj)2z%3f(R>@&sZFLIqcb?-zLn+dxPQe~Us7Rr zDsKx7b=+Qv;ZID-2+l9$Zfn8@FqaGrz;oA+EBH#>qTv~uiFM^*&*D$x-_x)iRYg4p?%|e?R53BbsCV;U80=zT;yaXQ~?T?r?j>5{K!xrGf-NC-NVSERpYLK zDWp89057eGajZk74p$wpwk|&_HkUez+Lk;!VT0ntFA>Tit}p`-b%ygQY5A%ntc=wN zY1K_7C-BnZ13A~sg|OuJ)PPeTCT2brqLmN&L6G~r+xstR$U>G72#KTl#gr(idt&IY z+&}r zB6kc*BxuW*A5$o(ZfX)FdcK1)qG6G9qF^f>Xjf(U=$&IiasSCtNR(5)ggfEnLkE2f zoQMMG^Pu2b7I$!nHqh@^dSB56T0>jyp)`aky)d{HSX%kx1$-9Aq0&31-+ev(o=@kS zvIp4>_K({1sZgc0$`rgFv~ewufxR-2WC>#KEjRANX3g*=K>GgIR|t+p97G0gMTLn{ z6KxEc3*a@vGSG4sjef$*+Qj`=1HKf^FG3QG_CC8$NlU;u$iu4Fc6;wQ3v$iXbBHX` z$Ia{&8^R$43`owq{Y~=|<5N#Zt=3LGk+a4}E%_v3$Xfs8Z*S8S zft{pnrMXw{-J?wdt11If{r6}t8j}T~wJ7qQC>JmU6P}@FYa2Nfbu&}T&|Ct>z@*TN z(0To{Jp1uScR`vDnHMegUiK3A5rl<1lEjmdWXP&?{^lQpgVgshqrct4;xo^Hnpfz8 z{52-fo7KkO=A5!CkRPN$^^vSxPsUtf!^Q0J@g z^}f~1JTWO&FGPZiUJx(QDR||pPihBTqH0oyOaJz}r2>h2HZ~vS!^*nP6E(fDV2~z;3vEC)06LXdab=d}!~?Ls<1|;1;Ipt( zD$?lMaq2WwOw$7QuLFMqT!05!8--|{Y>vW*RlKc&!zcv8$1I%^HDf#>sXnOs zSF)8|@h{|XQNw}5bRlRO>~7{w#%VxDy%jLispqv3I&~`A6C;6{UO!a1S_d2!Acx@6AYV(1}gHQZtlO2!XeG(kh>WKfew3={kKd^F%uYPZtw0l0!rrEEEW?@d}zc6ii z1NzKR5SqEcL53&7c<21-7;Dx|fs}0)1}&WPf|zJGqteko5Vm=a)8=$!E`ix)kDnOi*tRGSo$7$9a`&z)IvtuyjCb@n>pwL6KI79f$6<`5y53>pQ4RoPHfh zbF;;`)eV_isKx^!sk}B#w!UWoVm7#ujVLn1ag5>Zs4_(swo3(niB6hS zf4k3LAF9K!R3%CC@m|RJGbW8Qidg|JEcU*aZz8+?pzne*cUztQu8n%Bh~wqe#HJ+e zs^QRs%WXYc-9`hQ_qUdKh#$W8Nf;80`p|zmXNkF`OQ_m|_gRSz%2b8HCELem5|M)T zZ&`gMe1*i=SmC+0_GLA0Zawee;^VHB3)wsqHX~Za-^}+9_rP`@PN3LQMg3;TY6!z;pltY*dvpav69j+fd4yeUEhY@^jYuVuEObxIJUhLlpGrSv8 zvtS1;a&L7Hla1&Nk!X41OnaY&;VrB`-%v%CK1@}rI?%`Zg)Pk4;+Y^VvUUJUCJtJR z)gP<`wm+a-aN+%J!aq+TYxwEf1`G+z6IE8H%FAvShfN5H(vXuY%vg=mKwisakyIRR zNcQP9ZE+m2zvazUApZ>f} ztK#12)w5%U< zr8fMg*tZK`nQBY)aqBr(lj*1Zz) zP=s3AjQApc@Wzy`ueV|1DxIL}!BAOz#L~xL$o5qb``(sLmwVHdM67*n2@2+<0L`{g zY!G8ubS*TJ2q~RdGfJh({G{#{3_(*R2NuAwDw1aT8st3=e-X)E`+DU{!pS19 z5&XgxuHt)ld*foKiH>l)*n(<9s3XpUA z$jNHc5#L)V_CQ_2z^=L^zGjn&S}Zrd70$kj{SfMiJcVfX5aFVCMTaY!Lvqrj&;!FU zn`zdD)F(xAPAcy=-FMGkGXdQ8?t`I&g32TYNUSJpia=gh-2+*siFg)vT?6Z$R?a)QNk^*3jRu zjvfUt=2&7Wl5tHpy)pM%gU8V1gP|s7KsdFMXZohwG7+#H!`S)Mpi>8CXxZ-kw8ls z&1v%h)3o)I0>y(tBauL@7hCN?goJtSz&ESdD1nn%@;pU^3{8D3ThWwU zmT^fYT@K!kSrE^U_LV-k?-~DfC^s{|%);|*x(kmM`OE7P3LzFpEwkjE;PD_Egkr|~ zQ&*s?$RUu06|ylZ)TCPnk@R#ZH%RDqL*Z%YzrU!|yefNQQ!$}=jEtr5e!`U#j*TlT z6f^Yr$MxYjIz)f^g|fY)Blqza;T2E!K8?CrfhLJf@T0;#gx`(RJtG5hTWPiC?Bx*K zx3O+eYfX1x*W(x9X^|_9hqe6g3_Qx`hVd<#!I}TNA5^tlpfM9c*h`V^F1xW}VSAP< zDV(1E&pywmAp!t?64VE`81u zUXH()bO4`GJSXAQYs%-4fC$fE`%B8bLg*MTZ|9u*UfizH8)H3=-!6_VM~8|?u2Q^o zjukqDF!00b^ajS!4@DSP<)TGLo`>5F0EbT=U|ynwB=Fd^rqTKK0Y~31o0S$TjOo5v zYMYwCtJp6IUxnEqgU2n{uub-*^#0OrgSkr*u4u2oh-4it2%_<=4#WPBUNkJJ5bHmz zGl8mY0YzM7Y>GOp{A6iiR36rIZe}B@I9uWq;t4q;Y~+=JF8619T;>Ew=MLtuisQ4) zP0rUA3hb+H!*;=U+fEnj3FSu2cZ7@JD@W zZByYr;Zi!vFuA^^O&jf2BnV%68j7?^l%iCtSP5@-MWvhrFJ|*Gd$D+UsSNoxr2*dn}4_PHI)E89|}05dskEW za0$GkF;2q<+RtcC1{Am}m`I^#XGv|M^jsSymYF+J%Bm;(E^93vc#^*U)@%XFL zB0J70M}nMo`8j&UcI0b1?eF}#VysERRw=GDvZ)U9Mn1Myru$w3nqm1KGO`;s{{$YL zpVWXC%;xpLf%>fQlomE>I&Z~r4x9>quaB6#?m~mW*32Svaa&!Prq(1`R}Dg{*|Iuv z5|R`}_9qApz+phY3@Bf;C20Npn>2SkNPF!o3`)cGnh{d(vDv^vD#M}=DdcRBym_N? zHz%C{p{y3U%2f>MQzv}%K(p%zAm4_^K9VS`-^FSgVDpZ6SlsWvvz3hcgTHNn0o7=* zgu~5OV_@@R;?b}r{Qi{*T=?*b9UrZuC|T|{y7db)OyQoGU?RKK^?ZNrVu=%R=c^xs zgkUvBBP1w#HzVv6Guz#r?mz-}D6_aWRg%os;|^=U{Yv~Q>y;}-uR1O&sskM?Huc`_ zNtP^-4cjnr!G+Qita(rh;{0fuukv!#8>~phOeYl>mPZ|~*Jmcz7|d9(Pn5Ja{opxk7su;A#OG9f)g;kH2sCG2l8*;4Tm&20+O_1Fv?$2`&V-KSwp86)Ap&=J1H+y>@ixNX7gK|unvsq)pZ@b#)8 zS*4!ZO2~$L)5N-1v_&&5gZ)sDhEAA2#vZ(LF)gRp1B(5^Ws}uowTQ+ZbhVZ7jDks+ z%{c*aXJNVF->TKy0}ab*m`!q?rB9LF@YREJ!IKklm@*BswN=G^a>*$dE>(C`S zf#ewwIvm*vfK^hfv-9wII|}jaTtIn4oII}zEtN{;n9O_ zCCJK-gj@~Sr4T0!*JY5i0?Zy##d# z%6eDGYe{Jx0h7+I0fHQ{dqy)N_ zw8Xwp5q8r@}-3JO^;?EM{>FmP! zi()+0{;fCD`IrrOb0Em9N=FM&=_=P0JAfi~?%&jc1GkM}*;xFYykVGnYaz12)tJWB zpv#7(iN|~X8KvOfxLy@I|DL928e|dZutqmxy=Q%B1#4PKhXHT=SO$BsMpDtdvIbCP z*)r*e^0FfM5+Vu`u*{}D)JeE?+@ntV*%nWEDwEkmU@zc~!PKuhMiH7Lh}MNKPmG7% zb?ZQ0tRv@Gi)b@BP?Rr3jr7HCjU$bM$`UiLQ0@m4lT}`(j(s6$b3G=8hi<35ODzYf z+3zZHa}{zd1uVv@DR+f*dgr}N-k%U+ z!3|ovHf|oz4cSl$&y^1M6s0=DT11xa<)1YSN(^*+7TqdXk>gt!4{%@dNi-3rXizrNAW4i5tHk#JDTfb(;;zXyFh=E^^X7 zdaH@A7Wvq46cVyaLorf~BEvr$s<-XI4h(Gljk?Y^asRF*$CQS_lb{rJ))p~M=+%1* zLi6Q@)jPV0>+7|8my_4~la|LvE~A&i%;i_4OSx{)ry$Rz=pgnOy|GGiEDkd1=A>OT zu#IRRv($YG*waJ)z#Eim$>1gjgs$WMrzDX22vnXKBenw29=>aKp}3+ zJGF!J2}kJ0C4-lof5rrj!hp4ASU*fP?}h3R(Bo&Paf6CH4c(4_F4uJb` zPu+9xkvmwrK^WuFZEmBStRBO>Yj-#IqKb@5I4TH3G|quIwZHUCX1+B_Vrd)I3q$+<$rd$z(0+qFk7oT%o5e2ccJ%VxLh8FJ+;UySd*Cu4> zvebnJQmieL6s<}sVEO}#Rq->%2pTXfW>8-^;epm{X^Z+GWlF|Ciog?PlmVkWABabg zb4teHB=+&iSw>mMLozN>87yn7U8_QUW|U`UAYK%8B93qmiov&QEm6GG8V*jDk}Rf2 z@{-_`Qq0;HMbN+G=Dkb;;vcsUDT9GRQ2Ct?{ia1E7ThTK{LAzxzS~&8nD9}DS6l6&_24=3kI>|>>Xw$|i{q~w?&n%L+J_lgz)ioN$SN&Ax_bqE`BZ)orufedm= znDGW0N98%XIXH6IiIbyCIt&f6IpX4wXCyeNM|H|2zVnK*qr+H*H-^$&j_)bB_3WNK zh!STO^51mkxHgPjxv~~ozGl=JO5Z*wk$V)0EJ3I1)+ttNq03mP!OBFu%5D&C5$T(; zpW~I}G^ z;1L>}-?=uH4^~1$goI375@A}oh##=~s{|9x3P>i&5+#qx6jXd`dbZBT1JwpLeIl2> zrL~m&d7$$+LBEU&w}r+&sxht0g#I-Gt=V`wDJ`MxQ z*blK!WAjEqKVY!_0MepCPjZeY0!?H9HT;Qk5o0RVdwHYc+>gT~cj5zix@URW7cj2Y z(ZP-66<88{f{&)|NNaiUe(8i6#yP-d?|hpfG%x1>{l}girpLmFFjNCq!V>dsVR)^g zGf}+JZ-la>4hO+7XE*H7LzA8q^c0nMH)Lmk$+|imE%Y{riybeCAP-Q9aV}vvIx>iQ zv?N+oHGKIUT-v0~_&8ED(Au{lD3*OPVr$~3>y7JShWqpNo1MfeK^SU+fzJcLexbU| z$(0rB^ku8HNH!0?!Y1~FxD}Y?ii<|Kmkw$Q(PfXq8c*6WV-N_n&t8^v!GK1K4wn=IFvof4xqomq-EVH<=F-+B1&MeU z2aU*WMVWPpPLHzzwY5u5Ap~CXkTRr-l3qyAb0V_r>)&G&CKDSHs+h$Yy++i`!f);@ z#GN6iRkbgZ1mvbRMM}D=k-~0@36QRp+rS7O zeV7PTTAO9<^L-V@?GZ9+KeB1*exByiVUSzI2ty8>FZlfk?=4Olg7xBMgM0hQ!yssj@S~8ed zh?F0Dazgz3D!nj)BwMMBLw1C6fDZBuzRz+Mi5HhJ(~2Grne~}|#c2J1HzDmN8~GG) zKon0O=yf~1ic|w|@%-a|0-Wr{)AGKO*x(QJ1Sx{R;Nwr>@ScSpDF8;fR(W&rns;D3 z{h&7mqh_`wetST1S)^9s_BU1o@o_2_>E^RO-m$n8vjYL{OVj5FYC83`ZQhX~ER*9# z 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 I6yg5=2Wo3f$p8QV literal 0 HcmV?d00001 diff --git a/Entries_Newest.mq5 b/Entries_Newest.mq5 new file mode 100644 index 0000000..1b205b9 --- /dev/null +++ b/Entries_Newest.mq5 @@ -0,0 +1,333 @@ +//+------------------------------------------------------------------+ +//| TigerObserver.mq5 | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + + +#include "Algo_Skeleton_Functions.mqh" + +long H4_SUPPORT_ZONE_CLR ; +long H4_RESISTANCE_ZONE_CLR ; +long H1_SUPPORT_ZONE_CLR; +long H1_RESISTANCE_ZONE_CLR; +long M30_SUPPORT_ZONE_CLR ; +long M30_RESISTANCE_ZONE_CLR ; + +int OnInit() + { +//--- create timer + EventSetTimer(60); + +// ONLY FOR VISULAZITAION ON STRATEGY TESTER + iClose(_Symbol,PERIOD_W1,1); + iClose(_Symbol,PERIOD_D1,1); + iClose(_Symbol,PERIOD_H4,5); + iClose(_Symbol,PERIOD_H1,5); + iClose(_Symbol,PERIOD_M30,5); + iClose(_Symbol,PERIOD_M15,5); + + H4_SUPPORT_ZONE_CLR = clrBlack ; + H4_RESISTANCE_ZONE_CLR = clrBlack ; + + if(ENTRY_BASED_H1_STRUCTURE == true && ENTRY_BASED_M30_STRUCTURE == false){ + M30_SUPPORT_ZONE_CLR = clrBlack ; + M30_RESISTANCE_ZONE_CLR = clrBlack ; + + H1_SUPPORT_ZONE_CLR = clrAliceBlue ; + H1_RESISTANCE_ZONE_CLR = clrDarkGray ; + + } + else if(ENTRY_BASED_H1_STRUCTURE == false && ENTRY_BASED_M30_STRUCTURE == true){ + M30_SUPPORT_ZONE_CLR = clrAliceBlue ; + M30_RESISTANCE_ZONE_CLR = clrDarkGray ; + + H1_SUPPORT_ZONE_CLR = clrBlack ; + H1_RESISTANCE_ZONE_CLR = clrBlack ; + + } + + + objectsManager.addTextTiger(); + + for(int i=0; i0){ + updateNormalZonesSupport(zoneContainerSupport_M30,PERIOD_M30,"PERIOD_M30",M30_SUPPORT_ZONE_CLR,rangeDistanceBetweenZonesActual_M30,0); + } + + if(zoneContainer_M30.getNumberOfActiveZones()> 0){ + updateNormalZonesResistance(zoneContainer_M30,PERIOD_M30,"PERIOD_M30",M30_RESISTANCE_ZONE_CLR,rangeDistanceBetweenZonesActual_M30,0); + } + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + if(newCandleDetector30M.isNewCandle()) + { + + if(trail_based_m30){ + trailAllOpenPositionsIfNeeded(PERIOD_M30); + } + datetime currTime = TimeCurrent(); + ObjectSetString(0,"clockTextTiger",OBJPROP_TEXT,TimeToString(currTime,TIME_MINUTES)); + + detectAndDrawResistanceOnTimeFrame(PERIOD_M30,"PERIOD_M30",M30_RESISTANCE_ZONE_CLR,zoneContainer_M30,rangeDistanceBetweenZonesActual_M30,0); + detectAndDrawSupportOnTimeFrame(PERIOD_M30,"PERIOD_M30",M30_SUPPORT_ZONE_CLR,zoneContainerSupport_M30,rangeDistanceBetweenZonesActual_M30,0); + if(ENTRY_BASED_M30_STRUCTURE){ + + handleBuys(zoneContainer_M30,PERIOD_M30,"PERIOD_M30",cleanRangeUponEntryActual); + handleSells(zoneContainerSupport_M30,PERIOD_M30,"PERIOD_M30",cleanRangeUponEntryActual); + } + else{ + + handleBullishBreakouts(zoneContainer_M30,PERIOD_M30,"PERIOD_M30"); + handleBearishBreakouts(zoneContainerSupport_M30,PERIOD_M30,"PERIOD_M30"); + } + + + + // UPDATING H1 ZONES + if(zoneContainerSupport_H1.getNumberOfActiveZones()>0){ + updateNormalZonesSupport(zoneContainerSupport_H1,PERIOD_H1,"PERIOD_H1",H1_SUPPORT_ZONE_CLR,rangeDistanceBetweenZonesActual_H1,1000); + } + + if(zoneContainer_H1.getNumberOfActiveZones()> 0){ + updateNormalZonesResistance(zoneContainer_H1,PERIOD_H1,"PERIOD_H1",H1_RESISTANCE_ZONE_CLR,rangeDistanceBetweenZonesActual_H1,1000); + } + + + + zoneContainerSupport_M30.printZonesSortedArray(); + zoneContainer_M30.printZonesSortedArray(); + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + + if(newCandleDetector1H.isNewCandle()){ + + if(trail_based_h1){ + trailAllOpenPositionsIfNeeded(PERIOD_H1); + } + + + detectAndDrawResistanceOnTimeFrame(PERIOD_H1,"PERIOD_H1",H1_RESISTANCE_ZONE_CLR,zoneContainer_H1,rangeDistanceBetweenZonesActual_H1,1000); + detectAndDrawSupportOnTimeFrame(PERIOD_H1,"PERIOD_H1",H1_SUPPORT_ZONE_CLR,zoneContainerSupport_H1,rangeDistanceBetweenZonesActual_H1,1000); + + if(ENTRY_BASED_H1_STRUCTURE){ + + handleBuys(zoneContainer_H1,PERIOD_H1,"PERIOD_H1",cleanRangeUponEntryActual); + handleSells(zoneContainerSupport_H1,PERIOD_H1,"PERIOD_H1",cleanRangeUponEntryActual); + } + + else{ + handleBullishBreakouts(zoneContainer_H1,PERIOD_H1,"PERIOD_H1"); + handleBearishBreakouts(zoneContainerSupport_H1,PERIOD_H1,"PERIOD_H1"); + + } + + + // UPDATING H4 ZONES + if(zoneContainerSupport_H4.getNumberOfActiveZones()>0){ + updateNormalZonesSupport(zoneContainerSupport_H4,PERIOD_H4,"PERIOD_H4",H4_SUPPORT_ZONE_CLR,rangeDistanceBetweenZonesActual_H4,2000); + } + + if(zoneContainer_H4.getNumberOfActiveZones()> 0){ + updateNormalZonesResistance(zoneContainer_H4,PERIOD_H4,"PERIOD_H4",H4_RESISTANCE_ZONE_CLR,rangeDistanceBetweenZonesActual_H4,2000); + } + + Print("H1 zones :"); + //zoneContainerSupport_H1.printZonesSortedArray(); + //zoneContainer_H1.printZonesSortedArray(); + + } + + + + + if(newCandleDetector4H.isNewCandle()){ + last_H4_candle_broke_structure = false ; + + if(trail_based_h4){ + trailAllOpenPositionsIfNeeded(PERIOD_H4); + } + + + detectAndDrawResistanceOnTimeFrame(PERIOD_H4,"PERIOD_H4",H4_RESISTANCE_ZONE_CLR,zoneContainer_H4,rangeDistanceBetweenZonesActual_H4,2000); + detectAndDrawSupportOnTimeFrame(PERIOD_H4,"PERIOD_H4",H4_SUPPORT_ZONE_CLR,zoneContainerSupport_H4,rangeDistanceBetweenZonesActual_H4,2000); + + // BREAK OF STRUCTURE HANDLING + + + handleBullishBreakouts(zoneContainer_H4,PERIOD_H4,"PERIOD_H4"); + handleBearishBreakouts(zoneContainerSupport_H4,PERIOD_H4,"PERIOD_H4"); + + //handleBuys(zoneContainer_H4,PERIOD_H4,"PERIOD_H4",cleanRangeUponEntryActual); + //handleSells(zoneContainerSupport_H4,PERIOD_H4,"PERIOD_H4",cleanRangeUponEntryActual); + + //Print("H4, Zones:"); + //zoneContainerSupport_H4.printZonesSortedArray(); + //zoneContainer_H4.printZonesSortedArray(); + } + + + + if(newCandleDetectorDaily.isNewCandle()) + { + + //detectAndDrawResistanceOnTimeFrame(PERIOD_D1,"PERIOD_D1",clrYellow,clrYellow,zoneContainer_D1); + //updateBreakAboveStructureAndDelete(zoneContainer_D1,PERIOD_D1,"PERIOD_D1"); + objectsManager.drawVerticalLine(clrAqua, TimeCurrent()); + + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + if(newCandleDetectorWeekly.isNewCandle()) + { + + objectsManager.drawVerticalLine(clrRed, TimeCurrent()); + + weekCounter++ ; + + if(weekCounter == deleteAllZonesAfter_Weeks){ + + //deleteAllzonesWithGUI(); + weekCounter = 0; + } + } + + } + +//+------------------------------------------------------------------+ +//| Timer function | +//+------------------------------------------------------------------+ +void OnTimer() + { +//--- + + } +//+------------------------------------------------------------------+ +//| Trade function | +//+------------------------------------------------------------------+ +void OnTrade() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TradeTransaction function | +//+------------------------------------------------------------------+ +void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) + { +//--- + + } +//+------------------------------------------------------------------+ +//| Tester function | +//+------------------------------------------------------------------+ +double OnTester() + { +//--- + double ret=0.0; +//--- + +//--- + return(ret); + } +//+------------------------------------------------------------------+ +//| TesterInit function | +//+------------------------------------------------------------------+ +void OnTesterInit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterPass function | +//+------------------------------------------------------------------+ +void OnTesterPass() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterDeinit function | +//+------------------------------------------------------------------+ +void OnTesterDeinit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| ChartEvent function | +//+------------------------------------------------------------------+ +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) + { +//--- + + } +//+------------------------------------------------------------------+ +//| BookEvent function | +//+------------------------------------------------------------------+ +void OnBookEvent(const string &symbol) + { +//--- + + } + diff --git a/Gandalf.ex5 b/Gandalf.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..86bde9f27b096e6e22970f3a505b6af04dbeb764 GIT binary patch literal 29474 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 DF%#!7 literal 0 HcmV?d00001 diff --git a/Gandalf.mq5 b/Gandalf.mq5 new file mode 100644 index 0000000..189f720 --- /dev/null +++ b/Gandalf.mq5 @@ -0,0 +1,363 @@ +//+------------------------------------------------------------------+ +//| Gandalf.mq5 | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +#include "GraphicalObjectsManager.mqh" +#include "TempLineObjectAttributes.mqh" +#include "ObjectConfirmationUnit.mqh" +#include "BuyGandalf.mqh" +#include "SellGandalf.mqh" +#include "LotSizeCalculator.mqh" + + + +LotSizeCalculator lsCalc; +GraphicalObjectsManager graphicalObjectsManager ; +ObjectConfirmationUnit objectConfUnit ; +BuyGandalf buyGandalfGray ; +SellGandalf SellGandalfGray ; + +bool buyCase = false ; +bool sellCase = false ; + +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ + +TempLineObjectAttributes tempLineObjectAttr ; +int OnInit() + { +//--- create timer + EventSetTimer(60); + + + graphicalObjectsManager.addTotalRiskText(); + graphicalObjectsManager.addTakeBuyTradeButton(); + graphicalObjectsManager.addTakeSellTradeButton(); + graphicalObjectsManager.addText(); + graphicalObjectsManager.addConfirmButton(); + + //ObjectSetString(0,"totalRiskText",OBJPROP_TEXT,"the new ext is : !"); + + + +//--- + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- destroy timer + EventKillTimer(); + + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { + + updateOverAllRiskText(); + + } +//+------------------------------------------------------------------+ +//| Timer function | +//+------------------------------------------------------------------+ +void OnTimer() + { +//--- + + } +//+------------------------------------------------------------------+ +//| Trade function | +//+------------------------------------------------------------------+ +void OnTrade() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TradeTransaction function | +//+------------------------------------------------------------------+ +void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) + { +//--- + + } +//+------------------------------------------------------------------+ +//| Tester function | +//+------------------------------------------------------------------+ +double OnTester() + { +//--- + double ret=0.0; +//--- + +//--- + return(ret); + } +//+------------------------------------------------------------------+ +//| TesterInit function | +//+------------------------------------------------------------------+ +void OnTesterInit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterPass function | +//+------------------------------------------------------------------+ +void OnTesterPass() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterDeinit function | +//+------------------------------------------------------------------+ +void OnTesterDeinit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| ChartEvent function | +//+------------------------------------------------------------------+ +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) + { + + + + switch(id) + { + + case CHARTEVENT_CLICK: + { + + break; + } + + + + + //--- clicking on a graphical object + case CHARTEVENT_OBJECT_CLICK: + { + + + if(sparam == "BUY_BTN") + { + buyCase = true ; + + graphicalObjectsManager.drawStopLossLineGandalf(); + objectConfUnit.setWaitingStatus(true); + + } + + else if(sparam == "SELL_BTN"){ + sellCase = true ; + graphicalObjectsManager.drawStopLossLineGandalf(); + objectConfUnit.setWaitingStatus(true); + + + } + + else + if(sparam == "CONFIRM_BTN") + { + if(buyCase == true) + { + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THAT THERE IS SOMETHING SELECTED TO BE CONFIRMED + { + double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK) ; + string textRecieved; + graphicalObjectsManager.EditTextGet(textRecieved,0,"textName"); + double riskAsDouble = StringToDouble(textRecieved); + + double stopLossPrice = tempLineObjectAttr.getPrice(); + + + + if(ObjectDelete(_Symbol,"sl")) + { + + } + else + { + Print("Failed to delete the stop loss line ! Error: "+ GetLastError()); + } + + //Print("Buy info has been set, SL price: " + stopLossPrice + " risk is: " + riskAsDouble); + + double lotsToTrade = lsCalc.calculateLotSize(riskAsDouble,stopLossPrice); + + buyGandalfGray.takeBuyTradeGandalf(lotsToTrade,stopLossPrice); + + objectConfUnit.setWaitingStatus(false); + buyCase = false ; + + // change the risk text + //updateOverAllRiskText(); + + + } + + } + else + if(sellCase == true) + { + + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THAT THERE IS SOMETHING SELECTED TO BE CONFIRMED + { + + double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + string textRecieved; + graphicalObjectsManager.EditTextGet(textRecieved,0,"textName"); + double riskAsDouble = StringToDouble(textRecieved); + + double stopLossPrice = tempLineObjectAttr.getPrice(); + + if(ObjectDelete(_Symbol,"sl")){ + + + } + else{ + + Print("Failed to delete the stop loss line ! Error: "+ GetLastError()); + } + double lotsToTrade = lsCalc.calculateLotSize(riskAsDouble,stopLossPrice); + SellGandalfGray.takeSellTradeGandalf(lotsToTrade,stopLossPrice); + + objectConfUnit.setWaitingStatus(false); + sellCase = false ; + + + // change the risk text + //updateOverAllRiskText(); + + + } + + } + + + + + } + break; + } + + + case CHARTEVENT_OBJECT_DRAG: + { + + + + if(ObjectGetInteger(_Symbol,sparam,OBJPROP_TYPE,0) == OBJ_HLINE) + { + + if(StringSubstr(sparam,0,2) == "sl") // case of sl line (attached to a zone) + { + double stopLossPrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0); + tempLineObjectAttr.setId(sparam); + tempLineObjectAttr.setPrice(stopLossPrice); + } + else + if(StringSubstr(sparam,0,2) == "tp") // case of tp line (attached to a zone) + { + double takeProfitPrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0); + tempLineObjectAttr.setId(sparam); + tempLineObjectAttr.setPrice(takeProfitPrice); + } + + + } + + + break; + } + + + case CHARTEVENT_KEYDOWN: + { + + } + + + + //--- + + } + + } +//+------------------------------------------------------------------+ +//| BookEvent function | +//+------------------------------------------------------------------+ +void OnBookEvent(const string &symbol) + { +//--- + + } +//+------------------------------------------------------------------+ + + +void updateOverAllRiskText(){ + + + + //double pointValue = lsCalc.PointValue(_Symbol); + + double pointValue = PointValueNew(_Symbol); + double overAllRisk = 0 ; + for(int i=PositionsTotal() -1 ;i >= 0 ; i--){ + //Print("entered here !"); + ulong ticket = PositionGetTicket(i); + int positionType = PositionGetInteger(POSITION_TYPE); + double positionStopLossPrice = PositionGetDouble(POSITION_SL); + double positionOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN); + double positionLotSize = PositionGetDouble(POSITION_VOLUME); + + + if(positionType == POSITION_TYPE_BUY){ + double positionStopLossInPoints = (positionOpenPrice - positionStopLossPrice) * MathPow(10 , SymbolInfoInteger(_Symbol,SYMBOL_DIGITS)) ; + double riskAmount = pointValue*positionLotSize*positionStopLossInPoints ; + overAllRisk = overAllRisk + riskAmount ; + string riskAsString = DoubleToString(overAllRisk); + ObjectSetString(0,"totalRiskText",OBJPROP_TEXT,"Total Risk is:" + riskAsString); + } + else if(positionType == POSITION_TYPE_SELL){ + double positionStopLossInPoints = (positionStopLossPrice - positionOpenPrice) * MathPow(10 , SymbolInfoInteger(_Symbol,SYMBOL_DIGITS)) ; + double riskAmount = pointValue*positionLotSize*positionStopLossInPoints ; + overAllRisk = overAllRisk + riskAmount ; + string riskAsString = DoubleToString(overAllRisk); + ObjectSetString(0,"totalRiskText",OBJPROP_TEXT,"Total Risk is:" + riskAsString); + + } + } + +} + + + +double PointValueNew(string symbol){ + + + 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 ; + double pointValue = tickValue/ticksPerPoint ; + + return (pointValue); +} \ No newline at end of file diff --git a/GeneralTests.ex5 b/GeneralTests.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..baec73c10043f2fa1b6d6257a34028b1bef4f5e2 GIT binary patch literal 161402 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Ȓ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 + +// Telegram Connection include +#include + +// SCRIPTS INCLUDES + + + + +// GUI CLASSES INITIALIZATION +GraphicalObjectsManager* objectsManager = new GraphicalObjectsManager(); +ObjectConfirmationUnit* objectConfUnit = new ObjectConfirmationUnit(); +TempObjectAttributes* tempObjectAttr = new TempObjectAttributes(); +TempLineObjectAttributes* tempLineObjectAttr = new TempLineObjectAttributes(); + + +// CONTAINERS INITIALIZATION +ZoneContainer* zoneContainer = new ZoneContainer() ; +//LowFractalContainer* lowsContainer = new LowFractalContainer(inputTimeFrameFractals) ; + +//HighFractalContainer* highsContainer = new HighFractalContainer(inputTimeFrameFractals) ; + + +// ALGORITHM CLASSES INITIALIZATION +MarketObserver* marketObserver = new MarketObserver(zoneContainer); +LotSizeCalculator lotSizeCalculator ; + + + +// GENERAL CHART VARIABLES INITIALIZATION +bool initialized = false ; +bool firstCandleAfterStart = true ; + + +// ENTRY VARIABLES +string entryZoneType ; +bool lookForBuy = false ; +bool lookForSell = false ; + + +// LIVE FORMING FRACTALS HANDLER CLASS +NewCandleDetector* newCandleDetectorLive ; + + +// NEW CANDLE CLASSES INITIALIZATION +NewCandleDetector* newCandleDetector_H4; +NewCandleDetector* newCandleDetector_H1; +NewCandleDetector* newCandleDetector_M30; +NewCandleDetector* newCandleDetector_M15; +NewCandleDetector* newCandleDetector_M5; +NewCandleDetector* newCandleDetector_M1; + + + +// Trade MANAGING VARIABLES +bool priceInMiddle = true ; +bool buyOnWait = false ; +bool buyOnAction = false; +bool sellOnWait = false; +bool sellOnAction = false ; + +bool telegramTested = false ; +input bool testTelegram ; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- create timer + EventSetTimer(60); +// Added because bmp files seem to have stopped working, possibly a file format issue +//fileType = "png"; +//fileName = "MyScreenshot." + fileType; + + + if(telegramTested == false && testTelegram == true) + { + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"This is just a test ! " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + telegramTested = true ; + } + + +// THIS IS FOR SETTING THE NEW CANDLE DETECTOR TIMEFRAME FOR THE LIVE FRACTALS . (IN ORDER TO KNOW WHICH TIMEFRAME OF THE LIVE FRACTALS TO TAKE) + + + + + + /* if(inputTimeFrameFractals == PERIOD_M1) + { + + newCandleDetectorLive = new NewCandleDetector("PERIOD_M1"); + + } + else + if(inputTimeFrameFractals == PERIOD_M5) + { + + newCandleDetectorLive = new NewCandleDetector("PERIOD_M5"); + } + else + if(inputTimeFrameFractals == PERIOD_M15) + { + newCandleDetectorLive = new NewCandleDetector("PERIOD_M15"); + + } + else + if(inputTimeFrameFractals == PERIOD_M30) + { + + newCandleDetectorLive = new NewCandleDetector("PERIOD_M30"); + } + else + if(inputTimeFrameFractals == PERIOD_H1) + { + newCandleDetectorLive = new NewCandleDetector("PERIOD_H1"); + + } + else + if(inputTimeFrameFractals == PERIOD_H4) + { + newCandleDetectorLive = new NewCandleDetector("PERIOD_H4"); + + } + else + if(inputTimeFrameFractals == PERIOD_D1) + { + newCandleDetectorLive = new NewCandleDetector("PERIOD_D1"); + + } */ + + + if(initialized == false) + { + Print("Shark Initialized successfully on " + Symbol()); + + // ADD THE BUTTONS TO THE SCREEN + objectsManager.addZoneButton(); + objectsManager.addConfirmButton(); + objectsManager.addDeleteButton(); + objectsManager.addExitExperAdvisorButton(); + objectsManager.addPrintFractalsButton(); + objectsManager.addPrintZonesButton(); + objectsManager.addStopLossButton(); + objectsManager.addTakeProfitButton(); + objectsManager.addSetTakeProfitButton(); + + // INIT FRACTAL VARIABLES + + //lowFractalIndex = rightPeriod+1 ; // this is used for the fractals + //highFractalIndex = rightPeriod+1; // this is used for the fractals + //initLowFractalsFromIndex(initFractalsPeriod,inputTimeFrameFractals); + //initHighFractalsFromIndex(initFractalsPeriod,inputTimeFrameFractals); + + // INITIALIZATION FLAG + + + newCandleDetector_H4 = new NewCandleDetector("PERIOD_H4"); + newCandleDetector_H1 = new NewCandleDetector("PERIOD_H1"); + newCandleDetector_M30 = new NewCandleDetector("PERIOD_M30"); + newCandleDetector_M15 = new NewCandleDetector("PERIOD_M15"); + newCandleDetector_M5 = new NewCandleDetector("PERIOD_M5"); + newCandleDetector_M1 = new NewCandleDetector("PERIOD_M1"); + + initialized = true ; + + + } + + + + +//--- + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- destroy timer + /*Print("Low Fractals:"); + lowsContainer.printLowFractals(); + Print(" "); + Print("High Fractals:"); + highsContainer.printhighFractals(); + Print(" "); */ + + + + + + + + + + EventKillTimer(); + + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { + + + if(!IsTradeAllowed()) + { + + return ; + } + + if(!IsMarketOpen2(Symbol(),TimeCurrent())) + { + + return ; + } + + + + if((marketObserver.getClosestResistanceZone() != NULL) && (marketObserver.getClosestResistanceZone().sellEntryManager.sellTradeTaken())) + { + marketObserver.getClosestResistanceZone().sellTradeManager.checkAndSecureTradeIfNeeded(firstSecureRatio,riskDollars); + } + + if((marketObserver.getClosestSupportZone() != NULL) && (marketObserver.getClosestSupportZone().buyEntryManager.buyTradeTaken())) + { + marketObserver.getClosestSupportZone().buyTradeManager.checkAndSecureTradeIfNeeded(firstSecureRatio,riskDollars); + } + + + + + /*if(newCandleDetector_M1.isNewCandle()) + { + + + handleBuys(PERIOD_M1); + handleSells(PERIOD_M1); + }*/ + + + if(REJECTION_M1_ONLY == true) + { + if(newCandleDetector_M1.isNewCandle()) + { + + /* ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"this is just a test " + _Symbol + " " + TimeToString(TimeLocal()), fileName); */ + Print("Im in new candle !"); + handleBuys(PERIOD_M1); + handleSells(PERIOD_M1); + } + } + else + { + + if(newCandleDetector_H1.isNewCandle()) + { + + /* ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"this is just a test " + _Symbol + " " + TimeToString(TimeLocal()), fileName); */ + handleBuys(PERIOD_H1); + handleSells(PERIOD_H1); + } + + } + } + + + +//+------------------------------------------------------------------+ +//| Timer function | +//+------------------------------------------------------------------+ +void OnTimer() + { +//--- + + } +//+------------------------------------------------------------------+ +//| Trade function | +//+------------------------------------------------------------------+ +void OnTrade() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TradeTransaction function | +//+------------------------------------------------------------------+ +void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) + { +//--- + + } +//+------------------------------------------------------------------+ +//| Tester function | +//+------------------------------------------------------------------+ +double OnTester() + { +//--- + double ret=0.0; +//--- + +//--- + return(ret); + } +//+------------------------------------------------------------------+ +//| TesterInit function | +//+------------------------------------------------------------------+ +void OnTesterInit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterPass function | +//+------------------------------------------------------------------+ +void OnTesterPass() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterDeinit function | +//+------------------------------------------------------------------+ +void OnTesterDeinit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| ChartEvent function | +//+------------------------------------------------------------------+ +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) + { +//--- +//--- left-clicking on a chart + + switch(id) + { + + case CHARTEVENT_CLICK: + { + + break; + } + + + + + //--- clicking on a graphical object + case CHARTEVENT_OBJECT_CLICK: + { + if(sparam == "ZONE_ADD_BTN") + { + + if(objectConfUnit.getWaitingStatus() == false) // THIS IS TO MAKE SURE THERE IS NO OTHER OBJECT SELECTED + { + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getZonesIdCounter(); + objectsManager.drawRectangle(currentIdCounter); // create a rectangle . set its name to be the current zonesIdCounter (and that would be the id of this current zone ) + objectConfUnit.setWaitingStatus(true); + objectConfUnit.setObjectType("OBJ_RECTANGLE"); + objectConfUnit.setConfirmationObjectId(currentIdCounter); + zoneContainer.incrementZonesIdCounter(); + + + + } + else + { + + Print("Failed to Add a new Object, Make sure to confirm the previous object first! ."); + } + + + + } + + else + if(sparam == "ADD_SL_BTN") + { + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THAT THERE IS A ZONE SELECTED TO ADD STOP LOSS TO + { + + if(objectConfUnit.getObjectType() != "OBJ_RECTANGLE") + { + Print("Please select a zone object only !"); + } + else + { + + objectsManager.drawStopLossLine(objectConfUnit.getConfirmationObjectId()); + } + + } + else + { + + Print("Please select a zone in order to add a stop loss line !"); + } + + + } + else + if(sparam == "ADD_TP_BTN") + { + + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THAT THERE IS A ZONE SELECTED TO ADD STOP LOSS TO + { + + if(objectConfUnit.getObjectType() != "OBJ_RECTANGLE") + { + Print("Please select a zone object only !"); + } + else + { + + objectsManager.drawTakeProfitLine(objectConfUnit.getConfirmationObjectId()); + } + + } + else + { + + Print("Please select a zone in order to add a stop loss line !"); + } + + } + else + if(sparam == "CONFIRM_BTN") + { + + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THAT THERE IS SOMETHING SELECTED TO BE CONFIRMED + { + + + if(objectConfUnit.getObjectType() == "OBJ_RECTANGLE") // CASE OF ZONE + { + + if(zoneContainer.getZoneIndex(objectConfUnit.getConfirmationObjectId()) != -1) // means the zone already in the data structure, in this case we just need to update it + { + + // update the zone attributes + // zoneContainer.UpdateZone(int id); + Zone* tempZone = new Zone(); + + + + tempZone.setHigherEdgePrice(tempObjectAttr.getHigherEdgePrice()) ; + tempZone.setLowerEdgePrice(tempObjectAttr.getLowerEdgePrice()); + tempZone.setLeftEdge(tempObjectAttr.getLeftEdgeTime()); + tempZone.setRightEdge(tempObjectAttr.getRightEdgeTime()); + tempZone.setTimeFrame(tempObjectAttr.getTimeFrame()); + + string idOfOriginalZone = objectConfUnit.getConfirmationObjectId(); + // no need to set the ID here because the ID belongs to the original zone and not this new temp one (this is just a temporary zone to check if the adjustment is valid or no) + + if(zoneContainer.updateZone(tempZone, idOfOriginalZone) ==1) + { + // in this case we successfully updated the zone + + Print("Updated the object:" + + "\n ID: " + objectConfUnit.getConfirmationObjectId() + + "\n Type: " + objectConfUnit.getObjectType() + + "\n Asset: " + tempObjectAttr.getSymbol() + + "\n Time Frame:" + tempObjectAttr.getTimeFrame() + + "\n Higher Edge Price: " + tempObjectAttr.getHigherEdgePrice() + + "\n Lower Edge Price: " + tempObjectAttr.getLowerEdgePrice() + + "\n Left Edge Date: " + tempObjectAttr.getLeftEdgeTime() + + "\n Right Edge Date: " + tempObjectAttr.getRightEdgeTime() + ); + + delete tempZone; + if(ObjectSetInteger(_Symbol,objectConfUnit.getConfirmationObjectId(),OBJPROP_SELECTED,false) == true) // this is to unselect the object once we finish using it + { + } + else + { + Print("Failed to unselect the object. Error: " + GetLastError()); + } + + // THIS IS TO CLEAN THE objectConfUnit + objectConfUnit.setWaitingStatus(false); + ChartRedraw(); + } + else + { + + Print("Failed to update the zone, please reposition it"); + } + + } + + else // means the zone is new so we need to add it + { + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(tempObjectAttr.getHigherEdgePrice()); + newZone.setLowerEdgePrice(tempObjectAttr.getLowerEdgePrice()); + newZone.setLeftEdge(tempObjectAttr.getLeftEdgeTime()); + newZone.setRightEdge(tempObjectAttr.getRightEdgeTime()); + newZone.setId(objectConfUnit.getConfirmationObjectId()); + newZone.setTimeFrame(tempObjectAttr.getTimeFrame()); + + + double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK) ; + double higherEdge = tempObjectAttr.getHigherEdgePrice(); + + Print("higher edge is: " + higherEdge + " ask is: " + ask); + if(tempObjectAttr.getHigherEdgePrice() < ask) // means its a support zone + { + newZone.setType("TYPE_SUPPORT"); + } + + + double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + double lowerEdge = tempObjectAttr.getLowerEdgePrice(); + Print("lower edge is: "+lowerEdge + " bidd i: " + bid); + if(tempObjectAttr.getLowerEdgePrice() > bid) // means its a resistance zone + { + + newZone.setType("TYPE_RESISTANCE"); + } + // add the zone to the data structure + if(zoneContainer.addZone(newZone) == 1) + { + zoneContainer.findOrUpdatePivotEdgesOnConfirm(ask,bid); // update the pivot edges + Print("Added the object:" + + "\n ID: " + objectConfUnit.getConfirmationObjectId() + + "\n Type: " + objectConfUnit.getObjectType() + + "\n Asset: " + tempObjectAttr.getSymbol() + + "\n Time Frame:" + tempObjectAttr.getTimeFrame() + + "\n Higher Edge Price: " + tempObjectAttr.getHigherEdgePrice() + + "\n Lower Edge Price: " + tempObjectAttr.getLowerEdgePrice() + + "\n Left Edge Date: " + tempObjectAttr.getLeftEdgeTime() + + "\n Right Edge Date: " + tempObjectAttr.getRightEdgeTime() + ); + + + + if(ObjectSetInteger(_Symbol,objectConfUnit.getConfirmationObjectId(),OBJPROP_SELECTED,false) == true) // this is to unselect the object once we finish using it + { + } + else + { + Print("Failed to unselect the object. Error: " + GetLastError()); + } + + // THIS IS TO CLEAN THE objectConfUnit + objectConfUnit.setWaitingStatus(false); + } + else + { + Print("Failed to add the zone, Error: 2 or more zones are crossing"); + } + + ChartRedraw(); + } + + + + + + } + + else + if(objectConfUnit.getObjectType() == "OBJ_TRENDLINE") // CASE OF TRENDLINE + { + + + + + } + else + if(objectConfUnit.getObjectType() == "OBJ_HLINE") // CASE OF HORIZNOTAL LINE + { + + if(StringSubstr(tempLineObjectAttr.getId(),0,2) == "sl") + { + + zoneContainer.searchZoneById(StringSubstr(tempLineObjectAttr.getId(),2,-1)).setStopLossPrice(tempLineObjectAttr.getPrice()); + Print("Stop loss for zone: " + StringSubstr(tempLineObjectAttr.getId(),2,-1) + " has been set at: " + tempLineObjectAttr.getPrice()); + if(ObjectDelete(_Symbol,tempLineObjectAttr.getId())) + { + + } + else + { + Print("Failed to delete the stop loss line ! Error: "+ GetLastError()); + } + + // THIS IS TO CLEAN THE objectConfUnit + objectConfUnit.setWaitingStatus(false); + + ChartRedraw(); + } + else + if(StringSubstr(tempLineObjectAttr.getId(),0,2) == "tp") + { + + + if(ObjectDelete(_Symbol,tempLineObjectAttr.getId())) + { + + } + else + { + Print("Failed to delete the stop loss line ! Error: "+ GetLastError()); + } + + // THIS IS TO CLEAN THE objectConfUnit + objectConfUnit.setWaitingStatus(false); + ChartRedraw(); + } + else + if(StringSubstr(tempLineObjectAttr.getId(),0,2) == "rl") + { + + Print("Relational level line for zone: " + StringSubstr(tempLineObjectAttr.getId(),2,-1) + " has been set at: " + tempLineObjectAttr.getPrice()); + ChartRedraw(); + + } + else + if(StringSubstr(tempLineObjectAttr.getId(),0,2) == "dl") + { + + Print("Daily indecision line for zone: " + StringSubstr(tempLineObjectAttr.getId(),2,-1) + " has been set at: " + tempLineObjectAttr.getPrice()); + ChartRedraw(); + + } + else + if(StringSubstr(tempLineObjectAttr.getId(),0,3) == "bos") + { + + Print("Break of structure line for zone: " + StringSubstr(tempLineObjectAttr.getId(),3,-1) + " has been set at: " + tempLineObjectAttr.getPrice()); + ChartRedraw(); + + } + + } + + + + } + else + { + + Print("Cannot confirm, Please select an object first !"); + } + + } + + else + if(sparam == "DELETE_BTN") + { + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THAT THERE IS SOMETHING SELECTED TO BE DELETED + { + if(ObjectDelete(_Symbol,objectConfUnit.getConfirmationObjectId())) + { + if(zoneContainer.deleteZone(objectConfUnit.getConfirmationObjectId()) == 1) + { + // delete from data structure + zoneContainer.findOrUpdatePivotEdgesOnDelete(); + Print("Deleted the object: " + + "\n Type: " + objectConfUnit.getObjectType() + + "\n ID: " + objectConfUnit.getConfirmationObjectId()); + + objectConfUnit.setWaitingStatus(false); + objectConfUnit.setObjectType("NO_OBJECT"); + objectConfUnit.setConfirmationObjectId(-2); + + ChartRedraw(); + } + else + { + objectConfUnit.setWaitingStatus(false); + objectConfUnit.setObjectType("NO_OBJECT"); + objectConfUnit.setConfirmationObjectId(-2); + } + } + + } + else + { + + Print("Cannot delete, Please select an object first !"); + } + + } + else + if(sparam == "EXIT_BTN") + { + delete objectsManager ; + delete objectConfUnit; + delete tempObjectAttr; + //delete lowsContainer; + //delete highsContainer; + + delete newCandleDetectorLive; + delete tempLineObjectAttr; + delete marketObserver; + + + zoneContainer.freeZonesSortedArray(); + delete zoneContainer ; + + delete newCandleDetector_H4; + delete newCandleDetector_H1; + delete newCandleDetector_M30; + delete newCandleDetector_M15; + delete newCandleDetector_M5 ; + delete newCandleDetector_M1; + + + + + + + ExpertRemove(); + } + else + if(sparam == "PRINT_FRACTAL_BTN") + { + Print("Low Fractals:"); + //lowsContainer.printLowFractals(); + Print("High Fractals:"); + //highsContainer.printHighFractals(); + } + + else + if(sparam == "PRINT_ZONES_BTN") + { + + zoneContainer.printZonesSortedArray(); + } + + else + if(sparam == "SET_TP_BTN") + { + if(objectConfUnit.getObjectType() != "OBJ_HLINE") + { + Print("Please select a TP line first !"); + + } + else + { + if(zoneContainer.searchZoneById(StringSubstr(tempLineObjectAttr.getId(),2,-1)).setTakeProfit(tempLineObjectAttr.getPrice())) + { + Print("TP for zone: " + StringSubstr(tempLineObjectAttr.getId(),2,-1) + " has been set at: " + tempLineObjectAttr.getPrice()); + } + else + { + Print("You have reached the max take profit lines !"); + } + + } + + + } + else // THIS is the case were we click on any object except for main Buttons on screen + { + + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THERE IS NO OTHER OBJECT SELECTED + { + Print("Cannot select the object clicked, Make sure to confirm a previous selected object first !"); + } + + + else + { + ObjectSetInteger(_Symbol,sparam,OBJPROP_SELECTED,true); + + if(ObjectGetInteger(_Symbol,sparam,OBJPROP_TYPE,0) == OBJ_RECTANGLE) // CASE OF SELECTING A RECTANGLE + { + Print("Selected the object:" + + "\n Type: OBJ_RECTANGLE" + + "\n ID: " + sparam); + objectConfUnit.setWaitingStatus(true) ; + objectConfUnit.setConfirmationObjectId(StringToInteger(sparam)); + objectConfUnit.setObjectType("OBJ_RECTANGLE"); + + double _higherEdgePrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,1); + double _lowerEdgePrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0); + datetime _leftEdgeTime = (datetime)ObjectGetInteger(_Symbol,sparam,OBJPROP_TIME,0); + datetime _rightEdgeTime = (datetime)ObjectGetInteger(_Symbol,sparam,OBJPROP_TIME,1); + + if(_higherEdgePrice < _lowerEdgePrice) // this is the case were the user flips the rectangle while adjusting it. + { + tempObjectAttr.setHigherEdgePrice(_lowerEdgePrice); + tempObjectAttr.setLowerEdgePrice(_higherEdgePrice); + } + else + { + tempObjectAttr.setHigherEdgePrice(_higherEdgePrice); + tempObjectAttr.setLowerEdgePrice(_lowerEdgePrice); + } + + + + + + tempObjectAttr.setLeftEdgeTime(_leftEdgeTime); + tempObjectAttr.setRightEdgeTime(_rightEdgeTime); + tempObjectAttr.setSymbol(); + tempObjectAttr.setTimeFrame(getChartTimeFrameInString()); + ChartRedraw(); + } + + + else + if(ObjectGetInteger(_Symbol,sparam,OBJPROP_TYPE,0) == OBJ_HLINE) // CASE OF SELECTING A HORIZONTAL LINE + { + + objectConfUnit.setWaitingStatus(true) ; + objectConfUnit.setConfirmationObjectId(StringToInteger(sparam)); + objectConfUnit.setObjectType("OBJ_HLINE"); + + //tempLineObjectAttr.setId(sparam); + //tempLineObjectAttr.setPrice( ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0)); + ChartRedraw(); + } + + + + + + } + + } + + + break; + } + + + //--- object moved or anchor point coordinates changed + case CHARTEVENT_OBJECT_DRAG: + { + + if(ObjectGetInteger(_Symbol,sparam,OBJPROP_TYPE,0) == OBJ_RECTANGLE) + { + + + double _higherEdgePrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,1); + double _lowerEdgePrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0); + + datetime _leftEdgeTime = (datetime)ObjectGetInteger(_Symbol,sparam,OBJPROP_TIME,0); + datetime _rightEdgeTime = (datetime)ObjectGetInteger(_Symbol,sparam,OBJPROP_TIME,1); + + if(_higherEdgePrice < _lowerEdgePrice) // this is the case were the user flips the rectangle while adjusting it. + { + tempObjectAttr.setHigherEdgePrice(_lowerEdgePrice); + tempObjectAttr.setLowerEdgePrice(_higherEdgePrice); + } + else + { + tempObjectAttr.setHigherEdgePrice(_higherEdgePrice); + tempObjectAttr.setLowerEdgePrice(_lowerEdgePrice); + } + + tempObjectAttr.setLeftEdgeTime(_leftEdgeTime); + tempObjectAttr.setRightEdgeTime(_rightEdgeTime); + tempObjectAttr.setSymbol(); + tempObjectAttr.setTimeFrame(getChartTimeFrameInString()); + break; + } + + else + if(ObjectGetInteger(_Symbol,sparam,OBJPROP_TYPE,0) == OBJ_HLINE) + { + + if(StringSubstr(sparam,0,2) == "sl") // case of sl line (attached to a zone) + { + double stopLossPrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0); + tempLineObjectAttr.setId(sparam); + tempLineObjectAttr.setPrice(stopLossPrice); + } + else + if(StringSubstr(sparam,0,2) == "tp") // case of tp line (attached to a zone) + { + double takeProfitPrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0); + tempLineObjectAttr.setId(sparam); + tempLineObjectAttr.setPrice(takeProfitPrice); + } + else + if(StringSubstr(sparam,0,2) == "rl") // case of relational point line (attached to a zone) + { + Print("dragging a relational point line"); + } + else + if(StringSubstr(sparam,0,2) == "dl") // case of daily line + { + Print("dragging a daily line"); + } + else + if(StringSubstr(sparam,0,3) == "bos") // case of break of structure line + { + Print("dragging a break of structure line"); + } + + } + } + } + + } + + +//+------------------------------------------------------------------+ +//| BookEvent function | +//+------------------------------------------------------------------+ +void OnBookEvent(const string &symbol) + { +//--- + + } +//+------------------------------------------------------------------+ + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + + +/*void initLowFractalsFromIndex(int _index,ENUM_TIMEFRAMES timeFramePeriod) + { + + for(int i=_index ; i> rightPeriod ; i--) + { + + bool accessDeniedLows = false ; // variable for dealing with equal consecutive fractals + + + + if(isLowFractalByIndex(i,leftPeriod,rightPeriod,timeFramePeriod) == true) + { + + if(lowsContainer.getFreeIndex() > 0) + { + + if(iLow(Symbol(),timeFramePeriod,i) == lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getPrice()) // if low fractal is equal to the previous low fractal + { + if(lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getDistance() - i < 2*rightPeriod) // if the 2 lows are inside the range of 2 times of right period + { + accessDeniedLows = true ; + } + + } + } + + if(accessDeniedLows == false) + { + + + LowFractal* currentFractal = new LowFractal(iLow(Symbol(),timeFramePeriod,i),leftPeriod,rightPeriod,TimeCurrent(),timeFramePeriod); + currentFractal.setDate(iTime(Symbol(),timeFramePeriod,i)); + currentFractal.setDistance(i); + int NumberOfCandle = i-1; + string NumberOfCandleText = IntegerToString(NumberOfCandle); + currentFractal.setArrowObjName(NumberOfCandleText); + lowsContainer.addLowFractal(currentFractal); + + } + + + } + + } + + + } */ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + +/*void initHighFractalsFromIndex(int _index,ENUM_TIMEFRAMES timeFramePeriod) + { + + for(int i=_index ; i> rightPeriod ; i--) + { + + bool accessDeniedHighs = false ; // variable for dealing with equal consecutive fractals + + + + if(isHighFractalByIndex(i,leftPeriod,rightPeriod,timeFramePeriod) == true) + { + + if(highsContainer.getFreeIndex() > 0) + { + + if(iHigh(Symbol(),timeFramePeriod,i) == highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getPrice()) // if high fractal is equal to the previous high fractal + { + + if(highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getDistance() - i < 2*rightPeriod) // if the 2 highs are inside the range of 2 times of right period + { + + accessDeniedHighs = true ; + } + + } + } + + if(accessDeniedHighs == false) + { + + + HighFractal* currentFractal = new HighFractal(iHigh(Symbol(),timeFramePeriod,i),leftPeriod,rightPeriod,TimeCurrent(),timeFramePeriod); + currentFractal.setDate(iTime(Symbol(),timeFramePeriod,i)); + currentFractal.setDistance(i); + int NumberOfCandle = i-1; + string NumberOfCandleText = IntegerToString(NumberOfCandle); + currentFractal.setArrowObjName(NumberOfCandleText); + highsContainer.addHighFractal(currentFractal); + + } + + + } + + } + + } */ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + + +/*void handleLowFractals(ENUM_TIMEFRAMES tf) + { + + bool accessDeniedLows = false ; // variable for dealing with equal consecutive fractals if its true, then the current fractal will not be added + + for(int x=0 ; x 0) + { + + if(iLow(Symbol(),tf,lowFractalIndex) == lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getPrice()) // if low fractal is equal to the previous low fractal + { + + if(lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getDistance() <= 2*rightPeriod) // if the 2 lows are inside the range of 2 times of right period + { + + accessDeniedLows = true ; + } + + } + } + + if(accessDeniedLows == false) + { + + LowFractal* currentFractal = new LowFractal(iLow(Symbol(),tf,lowFractalIndex),leftPeriod,rightPeriod,TimeCurrent(),tf); + + int NumberOfCandle = Bars(Symbol(),tf); + string NumberOfCandleText = IntegerToString(NumberOfCandle); + currentFractal.setArrowObjName(NumberOfCandleText); + lowsContainer.addLowFractal(currentFractal); + Print("added a new low fractal !"); + + } + + + } + + } */ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + + +/*void handleHighFractals(ENUM_TIMEFRAMES tf) + { + + + bool accessDeniedHighs = false ; // variable for dealing with equal consecutive fractals + + for(int x=0 ; x 0) + { + + if(iHigh(Symbol(),tf,highFractalIndex) == highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getPrice()) // if high fractal is equal to the previous high fractal + { + if(highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getDistance() <= 2*rightPeriod) // if the 2 highs are inside the range of 2 times of right period + { + accessDeniedHighs = true ; + } + + } + } + + if(accessDeniedHighs == false) + { + + + HighFractal* currentFractal = new HighFractal(iHigh(Symbol(),tf,highFractalIndex),leftPeriod,rightPeriod,TimeCurrent(),tf); + + int NumberOfCandle = Bars(Symbol(),tf); + string NumberOfCandleText = IntegerToString(NumberOfCandle); + currentFractal.setArrowObjName(NumberOfCandleText); + highsContainer.addHighFractal(currentFractal); + Print("added a new high fractal !"); + } + + + } + + + } */ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +string MarketTest(string symbol, datetime testTime) + { + + return symbol + " " + TimeToString(testTime, TIME_DATE|TIME_MINUTES|TIME_SECONDS) + " " + IsMarketOpen(symbol, testTime) + " " + IsMarketOpen2(symbol, testTime); + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool IsTradeAllowed() + { + + return ((bool)MQLInfoInteger(MQL_TRADE_ALLOWED) // Trading allowed in input dialog + && (bool)TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) // Trading allowed in terminal + && (bool)AccountInfoInteger(ACCOUNT_TRADE_ALLOWED) // Is account able to trade, not locked out + && (bool)AccountInfoInteger(ACCOUNT_TRADE_EXPERT) // Is account able to auto trade + ); + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool IsMarketOpen(string symbol, datetime time) + { + + MqlDateTime mtime; + TimeToStruct(time, mtime); + datetime seconds = mtime.hour*3600+mtime.min*60+mtime.sec; + + datetime fromTime; + datetime toTime; + + for(int session = 0;; session++) + { + if(!SymbolInfoSessionTrade(symbol, (ENUM_DAY_OF_WEEK)mtime.day_of_week, session, fromTime, toTime)) + return false; + if(fromTime<=seconds && seconds<=toTime) + return true; + } + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool IsMarketOpen2(string symbol, datetime time) + { + + static string lastSymbol = ""; + static bool isOpen = false; + static datetime sessionStart = 0; + static datetime sessionEnd = 0; + + if(lastSymbol==symbol && sessionEnd>sessionStart) + { + if((isOpen && time>=sessionStart && time<=sessionEnd) + || (!isOpen && time>sessionStart && timetoTime) // maybe a later session + { + sessionStart = dayStart + toTime; + continue; + } + + // at this point must be inside a session + sessionStart = dayStart + fromTime; + sessionEnd = dayStart + toTime; + isOpen = true; + return isOpen; + + } + + return false; + + } +//+------------------------------------------------------------------+ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void deleteZoneWithGUI(string _id) + { + + + if(zoneContainer.deleteZone(_id) == 1) + { + // delete from data structure + zoneContainer.findOrUpdatePivotEdgesOnDelete(); + Print("Deleted the object: " + + + "\n ID: " + _id); + + ChartRedraw(); + } + else + { + + } + + + if(!ObjectDelete(_Symbol,_id)) + { + Print("Failed to delete object error: " + GetLastError()); + } + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +void handleBuys(ENUM_TIMEFRAMES _timeFrame) + { + +// BUY CASE + + if((marketObserver.getClosestSupportZone() != NULL) && !(marketObserver.getClosestSupportZone().buyEntryManager.isWaitingForRejectionCandle()) && !(marketObserver.getClosestSupportZone().buyEntryManager.buyTradeTaken()) && !(marketObserver.getClosestSupportZone().buyEntryManager.isWaitingForRetracement())) // FIRST CASE : PRICE IS IN THE MIDDLE + { + if(marketObserver.bearishCandleClosedInsideClosestSupportZone(_timeFrame)) + { + Print("Bearish Candle closed inside closest support zone !"); + marketObserver.getClosestSupportZone().buyEntryManager.setWaitingForRejectionCandle(true); + + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THE CURRENT ZONE ** M1 Bearish candle closed inside the closest support zone, Symbol: " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + } + + } + + else + if((marketObserver.getClosestSupportZone() != NULL) && (marketObserver.getClosestSupportZone().buyEntryManager.isWaitingForRejectionCandle()) && !(marketObserver.getClosestSupportZone().buyEntryManager.buyTradeTaken())) // SECOND CASE : PRICE HAS CLOSED IN THE ZONE AND WAITING FOR REJECTION, AND THE TRADE HAS NOT BEEN TAKEN YET + { + if(marketObserver.getClosestSupportZone().buyEntryManager.buyRejectionDetector.rejectionByOneCandleFormed(_timeFrame)) + { + + + marketObserver.getClosestSupportZone().buyEntryManager.setWaitingForRejectionCandle(false); + double lastBullishCandleClosePrice = iClose(_Symbol,_timeFrame,1); + // let the market observer check where the rejection candle closed, was it inside the zone ? or outside ? if outside the zone was it too close to the zone? if too + + if(lastBullishCandleClosePrice > marketObserver.getClosestSupportZone().getHigherEdge()) // closed above the zone + { + + // now we need to check if closed twice as the zone height + + + if(lastBullishCandleClosePrice - marketObserver.getClosestSupportZone().getHigherEdge() > marketObserver.getClosestSupportZone().getZoneHeight()) + { + + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THE CURRENT ZONE ** Bullish rejection candle was formed, Price closed above the zone in a distance more than the height of the zone, in these cases i take an entry on imbalance fill or a retracement but at the moment im not trading these cases , Symbol: " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + marketObserver.getClosestSupportZone().buyEntryManager.setWaitingForRetracement(true); + } + else + { + + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THE CURRENT ZONE ** Bullish rejection candle was formed, Price Closed above the zone in a distance less than the height of the zone, im taking a buy now ! , Symbol: " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + + double stopLossPrice = marketObserver.getClosestSupportZone().getStopLossPrice(); + double lotsToTrade = lotSizeCalculator.calculateLotSize(riskDollars,stopLossPrice); + for(int i=0 ; i<3 ; i++) // after this loop, the trade id's array will be filled, and the 3 trades will be taken + { + double partialLotPercent ; + if(i == 0) + { + partialLotPercent = 0.5 ; + } + if(i == 1 || i == 2) + { + partialLotPercent = 0.25; + } + ulong currentEntryId = marketObserver.getClosestSupportZone().buyEntryManager.takeBuyTrade(partialLotPercent * lotsToTrade,stopLossPrice); + marketObserver.getClosestSupportZone().buyTradeManager.fillRejectionByOneCandleTradeArray(i,currentEntryId); + } + marketObserver.getClosestSupportZone().buyEntryManager.setTradeTakenStatus(true); + } + + } + else + if(lastBullishCandleClosePrice < marketObserver.getClosestSupportZone().getHigherEdge() && lastBullishCandleClosePrice > marketObserver.getClosestSupportZone().getLowerEdge()) // closed inside the zone + { + + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THE CURRENT ZONE ** Bullish Rejection Candle Closed inside the zone, im taking a buy now !, Symbol: " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + double stopLossPrice = marketObserver.getClosestSupportZone().getStopLossPrice(); + double lotsToTrade = lotSizeCalculator.calculateLotSize(riskDollars,stopLossPrice); + for(int i=0 ; i<3 ; i++) // after this loop, the trade id's array will be filled, and the 3 trades will be taken + { + double partialLotPercent ; + if(i == 0) + { + partialLotPercent = 0.5 ; + } + if(i == 1 || i == 2) + { + partialLotPercent = 0.25; + } + ulong currentEntryId = marketObserver.getClosestSupportZone().buyEntryManager.takeBuyTrade(partialLotPercent * lotsToTrade,stopLossPrice); + marketObserver.getClosestSupportZone().buyTradeManager.fillRejectionByOneCandleTradeArray(i,currentEntryId); + } + marketObserver.getClosestSupportZone().buyEntryManager.setTradeTakenStatus(true); + } + + // call trade manager + } + } + + else + if((marketObserver.getClosestSupportZone() != NULL) && (marketObserver.getClosestSupportZone().buyEntryManager.isWaitingForRetracement())) // THIRD CASE: WAITING FOR A RETRACEMENT BECAUSE THE REJECTION CANDLE CLOSED MORE THAN THE HEIGHT OF THE ZONE + { + + Print("Im waiting for retracement because the rejection candle closed more than the height of the zone, ** this messaage is just for testing, because i still do not take trades on these kind of setups **"); + + } + + if((marketObserver.getClosestSupportZone() != NULL) && marketObserver.candleClosedBelowClosestSupportZone(_timeFrame) && !(marketObserver.getClosestSupportZone().buyEntryManager.buyTradeTaken())) // FOURTH CASE: PRICE CLOSED UNDER THE ZONE, AND THE BUY IS STILL NOT TAKEN , SO WE DONT WANT TO ENTER + { + + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THIS ZONE ** A candle closed below the support zone, the trade is still not taken and im not gonna take it, Symbol: " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + string _idToDelete = marketObserver.getClosestSupportZone().getId(); + deleteZoneWithGUI(_idToDelete); + + } + else + if((marketObserver.getClosestSupportZone() != NULL) && marketObserver.candleClosedBelowClosestSupportZone(_timeFrame) && (marketObserver.getClosestSupportZone().buyEntryManager.buyTradeTaken())) // FIFTH CASE: PRICE CLOSED UNDER THE ZONE, AND THE BUY IS TAKEN , SO WE WANNA CLOSE THE ORDER + { + + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THIS ZONE ** A candle closed below the support zone, i am in a buy trade and im gonna close the position and delete the zone, Symbol: " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + marketObserver.getClosestSupportZone().buyEntryManager.setTradeTakenStatus(false); + + // Make sure that the trades didnt hit the stop loss first + marketObserver.getClosestSupportZone().buyTradeManager.cleanOrderDataStructures(); + for(int i=0; i<3; i++) + { + marketObserver.getClosestSupportZone().buyTradeManager.closeTrade(i); + } + + string _idToDelete = marketObserver.getClosestSupportZone().getId(); + deleteZoneWithGUI(_idToDelete); + } + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void handleSells(ENUM_TIMEFRAMES _timeFrame) + { + + + + +// SELL CASE + + if((marketObserver.getClosestResistanceZone() != NULL) && !(marketObserver.getClosestResistanceZone().sellEntryManager.isWaitingForRejectionCandle()) && !(marketObserver.getClosestResistanceZone().sellEntryManager.sellTradeTaken()) && !(marketObserver.getClosestResistanceZone().sellEntryManager.isWaitingForRetracement())) // FIRST CASE : PRICE IS IN THE MIDDLE + { + if(marketObserver.bullishCandleClosedInsideClosestResistanceZone(_timeFrame)) + { + marketObserver.getClosestResistanceZone().sellEntryManager.setWaitingForRejectionCandle(true); + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THE CURRENT ZONE ** M1 Bullish candle closed inside the resistance zone on " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + + } + + } + + else + if((marketObserver.getClosestResistanceZone() != NULL) && (marketObserver.getClosestResistanceZone().sellEntryManager.isWaitingForRejectionCandle()) && !(marketObserver.getClosestResistanceZone().sellEntryManager.sellTradeTaken())) // SECOND CASE : PRICE HAS CLOSED IN THE ZONE AND WAITING FOR REJECTION, AND THE TRADE HAS NOT BEEN TAKEN YET + { + + if(marketObserver.getClosestResistanceZone().sellEntryManager.sellRejectionDetector.rejectionByOneCandleFormed(_timeFrame)) + { + + + marketObserver.getClosestResistanceZone().sellEntryManager.setWaitingForRejectionCandle(false); + // let the market observer check where the rejection candle closed, was it inside the zone ? or outside ? if outside the zone was it too close to the zone? if too + double lastBearishCandleClosePrice = iClose(_Symbol,_timeFrame,1); + if(lastBearishCandleClosePrice < marketObserver.getClosestResistanceZone().getLowerEdge()) // rejection candle closed under the zone + { + + // now we need to check if closed twice as the zone height + + if((marketObserver.getClosestResistanceZone().getLowerEdge() - lastBearishCandleClosePrice) > marketObserver.getClosestResistanceZone().getZoneHeight()) // rejection candle closed in a distance more than the height of the zone + { + + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THE CURRENT ZONE ** Bearish rejection candle was formed, Price closed under the zone in a distance more than the height of the zone, in these cases i take an entry on imbalance fill or a retracement but at the moment im not trading these cases , Symbol: " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + marketObserver.getClosestResistanceZone().sellEntryManager.setWaitingForRetracement(true); + } + else // previous candle closed in a distance less than the height of the zone + { + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THE CURRENT ZONE ** Bearish rejection candle was formed, Price closed under the zone in a distance less than the height of the zone, im taking a sell now , Symbol: " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + + double stopLossPrice = marketObserver.getClosestResistanceZone().getStopLossPrice(); + double lotsToTrade = lotSizeCalculator.calculateLotSize(riskDollars,stopLossPrice); + for(int i=0 ; i<3 ; i++) // after this loop, the trade id's array will be filled, and the 3 trades will be taken + { + double partialLotPercent ; + if(i == 0) + { + partialLotPercent = 0.5 ; + } + if(i == 1 || i == 2) + { + partialLotPercent = 0.25; + } + ulong currentEntryId = marketObserver.getClosestResistanceZone().sellEntryManager.takeSellTrade(partialLotPercent * lotsToTrade,stopLossPrice); + marketObserver.getClosestResistanceZone().sellTradeManager.fillRejectionByOneCandleTradeArray(i,currentEntryId); + } + marketObserver.getClosestResistanceZone().sellEntryManager.setTradeTakenStatus(true); + + + } + + } + else + if(lastBearishCandleClosePrice < marketObserver.getClosestResistanceZone().getHigherEdge() && lastBearishCandleClosePrice > marketObserver.getClosestResistanceZone().getLowerEdge()) // rejection candle closed inside the zone + { + + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THE CURRENT ZONE ** Bearish Rejection Candle Closed inside the zone, im taking a sell now ! , Symbol: " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + double stopLossPrice = marketObserver.getClosestResistanceZone().getStopLossPrice(); + double lotsToTrade = lotSizeCalculator.calculateLotSize(riskDollars,stopLossPrice); + for(int i=0 ; i<3 ; i++) // after this loop, the trade id's array will be filled , and the 3 trades will be taken + { + double partialLotPercent ; + if(i == 0) + { + partialLotPercent = 0.5 ; + } + if(i == 1 || i == 2) + { + partialLotPercent = 0.25; + } + ulong currentEntryId = marketObserver.getClosestResistanceZone().sellEntryManager.takeSellTrade(partialLotPercent * lotsToTrade,stopLossPrice); + marketObserver.getClosestResistanceZone().sellTradeManager.fillRejectionByOneCandleTradeArray(i,currentEntryId); + } + marketObserver.getClosestResistanceZone().sellEntryManager.setTradeTakenStatus(true); + } + + // call trade manager + } + + } + + else + if((marketObserver.getClosestResistanceZone() != NULL) && marketObserver.getClosestResistanceZone().sellEntryManager.isWaitingForRetracement()) // THIRD CASE: WAITING FOR A RETRACEMENT BECAUSE THE REJECTION CANDLE CLOSED MORE THAN THE HEIGHT OF THE ZONE + { + + Print("Im waiting for retracement because the rejection candle closed more than the height of the zone, ** this messaage is just for testing, because i still do not take trades on these kind of setups **"); + + } + + + + + + if((marketObserver.getClosestResistanceZone() != NULL) && marketObserver.candleClosedAboveClosestResistanceZone(_timeFrame) && !(marketObserver.getClosestResistanceZone().sellEntryManager.sellTradeTaken())) // FOURTH CASE: PRICE CLOSED ABOVE THE ZONE, WE STILL HAVNT TOOK A TRADE, AND WE ARE NOT GONNA TAKE IT + { + + + + marketObserver.setClosestResistanceWaiting(true); + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THE CURRENT ZONE ** A candle closed above the resistance zone i havnet took a trade, im gonna delete the zone , Symbol: " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + + string _idToDelete = marketObserver.getClosestResistanceZone().getId(); + deleteZoneWithGUI(_idToDelete); + + + } + else + if((marketObserver.getClosestResistanceZone() != NULL) && marketObserver.candleClosedAboveClosestResistanceZone(_timeFrame) && (marketObserver.getClosestResistanceZone().sellEntryManager.sellTradeTaken())) // FIFTH CASE: PRICE CLOSED ABOVE THE ZONE, WE TOOK THE TRADE, AND WE NEED TO CLOSE IT + { + marketObserver.setClosestResistanceWaiting(true); + + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THE CURRENT ZONE ** A candle closed above the resistance zone im in a sell and im gonna close it, and delete the zone, Symbol: " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + marketObserver.getClosestResistanceZone().sellEntryManager.setTradeTakenStatus(false); + + // Make sure that the trades didnt hit the stop loss first + marketObserver.getClosestResistanceZone().sellTradeManager.cleanOrderDataStructures(); + for(int i=0; i<3; i++) + { + marketObserver.getClosestResistanceZone().sellTradeManager.closeTrade(i); + } + + string _idToDelete = marketObserver.getClosestResistanceZone().getId(); + deleteZoneWithGUI(_idToDelete); + + + } + + + } +//+------------------------------------------------------------------+ diff --git a/GraphicalObjectsManager.mqh b/GraphicalObjectsManager.mqh new file mode 100644 index 0000000..73c2cc8 --- /dev/null +++ b/GraphicalObjectsManager.mqh @@ -0,0 +1,1076 @@ +//+------------------------------------------------------------------+ +//| GraphicalObjectsManager.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +class GraphicalObjectsManager + { +private: + int verticalLineCounter ; +public: + GraphicalObjectsManager(); + ~GraphicalObjectsManager(); + + + void addZoneButton(); + void addStopLossButton(); + void addTakeProfitButton(); + void addSetTakeProfitButton(); + void addConfirmButton(); + void addDeleteButton(); + void addPrintFractalsButton(); + void addPrintZonesButton(); + void addTakeBuyTradeButton(); + void addTakeSellTradeButton(); + void addExitExperAdvisorButton(); + void drawRectangle(int _zoneId); + void drawRectangleInStrategyTester(int _zone_Id,datetime leftEdge, datetime rightEdge, double highEdgePrice, double lowEdgePrice,long _color); + void drawStopLossLine(string _zoneId); + void drawStopLossLineGandalf(); + void drawTakeProfitLine(string _zoneId); + void drawVerticalLine(long _color, datetime _time); + void drawHorizontalLine(long _color, string nameOfLine,double price); + void drawLowFractal(int _index,long _color); + void drawHighFractal(int _index,long _color); + + void addText (); + void addTextTiger(); + void addMarketDescriptionTextTiger(); + void addTotalRiskText (); + + bool EditTextGet(string &text, const long chart_ID=0, string name = "" ) ; + + + + + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +GraphicalObjectsManager::GraphicalObjectsManager() + { + verticalLineCounter = 0; + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +GraphicalObjectsManager::~GraphicalObjectsManager() + { + } +//+------------------------------------------------------------------+ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void GraphicalObjectsManager:: addZoneButton() + { + + + if(!ObjectCreate(0,"ZONE_ADD_BTN",OBJ_BUTTON,0,0,0)) + { + Print(__FUNCTION__, + ": failed to create the button! Error code = ",GetLastError()); + + } + else + { + ChartRedraw(); + //--- set button coordinates + ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_XDISTANCE,30); + ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_YDISTANCE,40); + //--- set button size + ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_XSIZE,120); + ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_YSIZE,50); + //--- set the chart's corner, relative to which point coordinates are defined + ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_CORNER,CORNER_LEFT_UPPER); + //--- set the text + ObjectSetString(0,"ZONE_ADD_BTN",OBJPROP_TEXT,"Add Zone"); + //--- set text font + ObjectSetString(0,"ZONE_ADD_BTN",OBJPROP_FONT,"Arial"); + //--- set font size + ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_FONTSIZE,10); + //--- set text color + ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_COLOR,clrWhite); + //--- set background color + ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_BGCOLOR,clrGray); + //--- set border color + ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_BORDER_COLOR,clrGray); + //--- display in the foreground (false) or background (true) + + //ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_BACK,back); + + //--- set button state + + //ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_STATE,state); + + //--- enable (true) or disable (false) the mode of moving the button by mouse + + //ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_SELECTABLE,selection); + //ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_SELECTED,selection); + + //--- hide (true) or display (false) graphical object name in the object list + + // ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_HIDDEN,hidden); + + //--- set the priority for receiving the event of a mouse click in the chart + + //ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_ZORDER,z_order); + + } + } + + + +void GraphicalObjectsManager:: addTakeBuyTradeButton(){ + + + + if(!ObjectCreate(0,"BUY_BTN",OBJ_BUTTON,0,0,0)) + { + Print(__FUNCTION__, + ": failed to create the button! Error code = ",GetLastError()); + + } + else + { + ChartRedraw(); + //--- set button coordinates + ObjectSetInteger(0,"BUY_BTN",OBJPROP_XDISTANCE,30); + ObjectSetInteger(0,"BUY_BTN",OBJPROP_YDISTANCE,40); + //--- set button size + ObjectSetInteger(0,"BUY_BTN",OBJPROP_XSIZE,120); + ObjectSetInteger(0,"BUY_BTN",OBJPROP_YSIZE,50); + //--- set the chart's corner, relative to which point coordinates are defined + ObjectSetInteger(0,"BUY_BTN",OBJPROP_CORNER,CORNER_LEFT_UPPER); + //--- set the text + ObjectSetString(0,"BUY_BTN",OBJPROP_TEXT,"Buy"); + //--- set text font + ObjectSetString(0,"BUY_BTN",OBJPROP_FONT,"Arial"); + //--- set font size + ObjectSetInteger(0,"BUY_BTN",OBJPROP_FONTSIZE,10); + //--- set text color + ObjectSetInteger(0,"BUY_BTN",OBJPROP_COLOR,clrWhite); + //--- set background color + ObjectSetInteger(0,"BUY_BTN",OBJPROP_BGCOLOR,clrGray); + //--- set border color + ObjectSetInteger(0,"BUY_BTN",OBJPROP_BORDER_COLOR,clrGray); + //--- display in the foreground (false) or background (true) + + //ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_BACK,back); + + //--- set button state + + //ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_STATE,state); + + //--- enable (true) or disable (false) the mode of moving the button by mouse + + //ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_SELECTABLE,selection); + //ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_SELECTED,selection); + + //--- hide (true) or display (false) graphical object name in the object list + + // ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_HIDDEN,hidden); + + //--- set the priority for receiving the event of a mouse click in the chart + + //ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_ZORDER,z_order); + + } + + +} + + + + + +void GraphicalObjectsManager:: addTakeSellTradeButton(){ + + + + if(!ObjectCreate(0,"SELL_BTN",OBJ_BUTTON,0,0,0)) + { + Print(__FUNCTION__, + ": failed to create the button! Error code = ",GetLastError()); + + } + else + { + ChartRedraw(); + //--- set button coordinates + ObjectSetInteger(0,"SELL_BTN",OBJPROP_XDISTANCE,170); + ObjectSetInteger(0,"SELL_BTN",OBJPROP_YDISTANCE,40); + //--- set button size + ObjectSetInteger(0,"SELL_BTN",OBJPROP_XSIZE,120); + ObjectSetInteger(0,"SELL_BTN",OBJPROP_YSIZE,50); + //--- set the chart's corner, relative to which point coordinates are defined + ObjectSetInteger(0,"SELL_BTN",OBJPROP_CORNER,CORNER_LEFT_UPPER); + //--- set the text + ObjectSetString(0,"SELL_BTN",OBJPROP_TEXT,"Sell"); + //--- set text font + ObjectSetString(0,"SELL_BTN",OBJPROP_FONT,"Arial"); + //--- set font size + ObjectSetInteger(0,"SELL_BTN",OBJPROP_FONTSIZE,10); + //--- set text color + ObjectSetInteger(0,"SELL_BTN",OBJPROP_COLOR,clrWhite); + //--- set background color + ObjectSetInteger(0,"SELL_BTN",OBJPROP_BGCOLOR,clrGray); + //--- set border color + ObjectSetInteger(0,"SELL_BTN",OBJPROP_BORDER_COLOR,clrGray); + //--- display in the foreground (false) or background (true) + + //ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_BACK,back); + + //--- set button state + + //ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_STATE,state); + + //--- enable (true) or disable (false) the mode of moving the button by mouse + + //ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_SELECTABLE,selection); + //ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_SELECTED,selection); + + //--- hide (true) or display (false) graphical object name in the object list + + // ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_HIDDEN,hidden); + + //--- set the priority for receiving the event of a mouse click in the chart + + //ObjectSetInteger(0,"ZONE_ADD_BTN",OBJPROP_ZORDER,z_order); + + } + + +} + + + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void GraphicalObjectsManager:: addConfirmButton() + { + + if(!ObjectCreate(0,"CONFIRM_BTN",OBJ_BUTTON,0,0,0)) + { + Print(__FUNCTION__, + ": failed to create the confirm button! Error code = ",GetLastError()); + + } + else + { + ChartRedraw(); + //--- set button coordinates + ObjectSetInteger(0,"CONFIRM_BTN",OBJPROP_XDISTANCE,470); + ObjectSetInteger(0,"CONFIRM_BTN",OBJPROP_YDISTANCE,40); + //--- set button size + ObjectSetInteger(0,"CONFIRM_BTN",OBJPROP_XSIZE,120); + ObjectSetInteger(0,"CONFIRM_BTN",OBJPROP_YSIZE,50); + //--- set the chart's corner, relative to which point coordinates are defined + ObjectSetInteger(0,"CONFIRM_BTN",OBJPROP_CORNER,CORNER_LEFT_UPPER); + //--- set the text + ObjectSetString(0,"CONFIRM_BTN",OBJPROP_TEXT,"Confirm Object"); + //--- set text font + ObjectSetString(0,"CONFIRM_BTN",OBJPROP_FONT,"Arial"); + //--- set font size + ObjectSetInteger(0,"CONFIRM_BTN",OBJPROP_FONTSIZE,10); + //--- set text color + ObjectSetInteger(0,"CONFIRM_BTN",OBJPROP_COLOR,clrWhite); + //--- set background color + ObjectSetInteger(0,"CONFIRM_BTN",OBJPROP_BGCOLOR,clrGray); + //--- set border color + ObjectSetInteger(0,"CONFIRM_BTN",OBJPROP_BORDER_COLOR,clrGray); + + } + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void GraphicalObjectsManager:: addDeleteButton() + { + if(!ObjectCreate(0,"DELETE_BTN",OBJ_BUTTON,0,0,0)) + { + Print(__FUNCTION__, + ": failed to create the delete button! Error code = ",GetLastError()); + + } + else + { + ChartRedraw(); + //--- set button coordinates + ObjectSetInteger(0,"DELETE_BTN",OBJPROP_XDISTANCE,310); + ObjectSetInteger(0,"DELETE_BTN",OBJPROP_YDISTANCE,40); + //--- set button size + ObjectSetInteger(0,"DELETE_BTN",OBJPROP_XSIZE,120); + ObjectSetInteger(0,"DELETE_BTN",OBJPROP_YSIZE,50); + //--- set the chart's corner, relative to which point coordinates are defined + ObjectSetInteger(0,"DELETE_BTN",OBJPROP_CORNER,CORNER_LEFT_UPPER); + //--- set the text + ObjectSetString(0,"DELETE_BTN",OBJPROP_TEXT,"Delete Object"); + //--- set text font + ObjectSetString(0,"DELETE_BTN",OBJPROP_FONT,"Arial"); + //--- set font size + ObjectSetInteger(0,"DELETE_BTN",OBJPROP_FONTSIZE,10); + //--- set text color + ObjectSetInteger(0,"DELETE_BTN",OBJPROP_COLOR,clrWhite); + //--- set background color + ObjectSetInteger(0,"DELETE_BTN",OBJPROP_BGCOLOR,clrGray); + //--- set border color + ObjectSetInteger(0,"DELETE_BTN",OBJPROP_BORDER_COLOR,clrGray); + + } + + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void GraphicalObjectsManager:: addExitExperAdvisorButton() + { + if(!ObjectCreate(0,"EXIT_BTN",OBJ_BUTTON,0,0,0)) + { + Print(__FUNCTION__, + ": failed to create the exit button! Error code = ",GetLastError()); + + } + else + { + ChartRedraw(); + //--- set button coordinates + ObjectSetInteger(0,"EXIT_BTN",OBJPROP_XDISTANCE,450); + ObjectSetInteger(0,"EXIT_BTN",OBJPROP_YDISTANCE,40); + //--- set button size + ObjectSetInteger(0,"EXIT_BTN",OBJPROP_XSIZE,120); + ObjectSetInteger(0,"EXIT_BTN",OBJPROP_YSIZE,50); + //--- set the chart's corner, relative to which point coordinates are defined + ObjectSetInteger(0,"EXIT_BTN",OBJPROP_CORNER,CORNER_LEFT_UPPER); + //--- set the text + ObjectSetString(0,"EXIT_BTN",OBJPROP_TEXT,"Remove Expert"); + //--- set text font + ObjectSetString(0,"EXIT_BTN",OBJPROP_FONT,"Arial"); + //--- set font size + ObjectSetInteger(0,"EXIT_BTN",OBJPROP_FONTSIZE,9); + //--- set text color + ObjectSetInteger(0,"EXIT_BTN",OBJPROP_COLOR,clrWhite); + //--- set background color + ObjectSetInteger(0,"EXIT_BTN",OBJPROP_BGCOLOR,clrGray); + //--- set border color + ObjectSetInteger(0,"EXIT_BTN",OBJPROP_BORDER_COLOR,clrGray); + + } + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void GraphicalObjectsManager:: addPrintFractalsButton() + { + + if(!ObjectCreate(0,"PRINT_FRACTAL_BTN",OBJ_BUTTON,0,0,0)) + { + Print(__FUNCTION__, + ": failed to create the print fractals button! Error code = ",GetLastError()); + + } + else + { + ChartRedraw(); + //--- set button coordinates + ObjectSetInteger(0,"PRINT_FRACTAL_BTN",OBJPROP_XDISTANCE,590); + ObjectSetInteger(0,"PRINT_FRACTAL_BTN",OBJPROP_YDISTANCE,40); + //--- set button size + ObjectSetInteger(0,"PRINT_FRACTAL_BTN",OBJPROP_XSIZE,120); + ObjectSetInteger(0,"PRINT_FRACTAL_BTN",OBJPROP_YSIZE,50); + //--- set the chart's corner, relative to which point coordinates are defined + ObjectSetInteger(0,"PRINT_FRACTAL_BTN",OBJPROP_CORNER,CORNER_LEFT_UPPER); + //--- set the text + ObjectSetString(0,"PRINT_FRACTAL_BTN",OBJPROP_TEXT,"Print Fractals"); + //--- set text font + ObjectSetString(0,"PRINT_FRACTAL_BTN",OBJPROP_FONT,"Arial"); + //--- set font size + ObjectSetInteger(0,"PRINT_FRACTAL_BTN",OBJPROP_FONTSIZE,10); + //--- set text color + ObjectSetInteger(0,"PRINT_FRACTAL_BTN",OBJPROP_COLOR,clrWhite); + //--- set background color + ObjectSetInteger(0,"PRINT_FRACTAL_BTN",OBJPROP_BGCOLOR,clrGray); + //--- set border color + ObjectSetInteger(0,"PRINT_FRACTAL_BTN",OBJPROP_BORDER_COLOR,clrGray); + + } + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void GraphicalObjectsManager:: addPrintZonesButton() + { + if(!ObjectCreate(0,"PRINT_ZONES_BTN",OBJ_BUTTON,0,0,0)) + { + Print(__FUNCTION__, + ": failed to create the print fractals button! Error code = ",GetLastError()); + + } + else + { + ChartRedraw(); + //--- set button coordinates + ObjectSetInteger(0,"PRINT_ZONES_BTN",OBJPROP_XDISTANCE,730); + ObjectSetInteger(0,"PRINT_ZONES_BTN",OBJPROP_YDISTANCE,40); + //--- set button size + ObjectSetInteger(0,"PRINT_ZONES_BTN",OBJPROP_XSIZE,120); + ObjectSetInteger(0,"PRINT_ZONES_BTN",OBJPROP_YSIZE,50); + //--- set the chart's corner, relative to which point coordinates are defined + ObjectSetInteger(0,"PRINT_ZONES_BTN",OBJPROP_CORNER,CORNER_LEFT_UPPER); + //--- set the text + ObjectSetString(0,"PRINT_ZONES_BTN",OBJPROP_TEXT,"Print Zones"); + //--- set text font + ObjectSetString(0,"PRINT_ZONES_BTN",OBJPROP_FONT,"Arial"); + //--- set font size + ObjectSetInteger(0,"PRINT_ZONES_BTN",OBJPROP_FONTSIZE,10); + //--- set text color + ObjectSetInteger(0,"PRINT_ZONES_BTN",OBJPROP_COLOR,clrWhite); + //--- set background color + ObjectSetInteger(0,"PRINT_ZONES_BTN",OBJPROP_BGCOLOR,clrGray); + //--- set border color + ObjectSetInteger(0,"PRINT_ZONES_BTN",OBJPROP_BORDER_COLOR,clrGray); + + } + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void GraphicalObjectsManager:: addStopLossButton() + { + if(!ObjectCreate(0,"ADD_SL_BTN",OBJ_BUTTON,0,0,0)) + { + Print(__FUNCTION__, + ": failed to create the stop loss button! Error code = ",GetLastError()); + + } + else + { + ChartRedraw(); + //--- set button coordinates + ObjectSetInteger(0,"ADD_SL_BTN",OBJPROP_XDISTANCE,30); + ObjectSetInteger(0,"ADD_SL_BTN",OBJPROP_YDISTANCE,100); + //--- set button size + ObjectSetInteger(0,"ADD_SL_BTN",OBJPROP_XSIZE,120); + ObjectSetInteger(0,"ADD_SL_BTN",OBJPROP_YSIZE,50); + //--- set the chart's corner, relative to which point coordinates are defined + ObjectSetInteger(0,"ADD_SL_BTN",OBJPROP_CORNER,CORNER_LEFT_UPPER); + //--- set the text + ObjectSetString(0,"ADD_SL_BTN",OBJPROP_TEXT,"Add SL"); + //--- set text font + ObjectSetString(0,"ADD_SL_BTN",OBJPROP_FONT,"Arial"); + //--- set font size + ObjectSetInteger(0,"ADD_SL_BTN",OBJPROP_FONTSIZE,10); + //--- set text color + ObjectSetInteger(0,"ADD_SL_BTN",OBJPROP_COLOR,clrWhite); + //--- set background color + ObjectSetInteger(0,"ADD_SL_BTN",OBJPROP_BGCOLOR,clrGray); + //--- set border color + ObjectSetInteger(0,"ADD_SL_BTN",OBJPROP_BORDER_COLOR,clrGray); + + } + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void GraphicalObjectsManager:: addTakeProfitButton() + { + + if(!ObjectCreate(0,"ADD_TP_BTN",OBJ_BUTTON,0,0,0)) + { + Print(__FUNCTION__, + ": failed to create the take profit button! Error code = ",GetLastError()); + + } + else + { + ChartRedraw(); + //--- set button coordinates + ObjectSetInteger(0,"ADD_TP_BTN",OBJPROP_XDISTANCE,170); + ObjectSetInteger(0,"ADD_TP_BTN",OBJPROP_YDISTANCE,100); + //--- set button size + ObjectSetInteger(0,"ADD_TP_BTN",OBJPROP_XSIZE,120); + ObjectSetInteger(0,"ADD_TP_BTN",OBJPROP_YSIZE,50); + //--- set the chart's corner, relative to which point coordinates are defined + ObjectSetInteger(0,"ADD_TP_BTN",OBJPROP_CORNER,CORNER_LEFT_UPPER); + //--- set the text + ObjectSetString(0,"ADD_TP_BTN",OBJPROP_TEXT,"Add TP"); + //--- set text font + ObjectSetString(0,"ADD_TP_BTN",OBJPROP_FONT,"Arial"); + //--- set font size + ObjectSetInteger(0,"ADD_TP_BTN",OBJPROP_FONTSIZE,10); + //--- set text color + ObjectSetInteger(0,"ADD_TP_BTN",OBJPROP_COLOR,clrWhite); + //--- set background color + ObjectSetInteger(0,"ADD_TP_BTN",OBJPROP_BGCOLOR,clrGray); + //--- set border color + ObjectSetInteger(0,"ADD_TP_BTN",OBJPROP_BORDER_COLOR,clrGray); + + } + } + + + +void GraphicalObjectsManager:: addSetTakeProfitButton(){ + if(!ObjectCreate(0,"SET_TP_BTN",OBJ_BUTTON,0,0,0)) + { + Print(__FUNCTION__, + ": failed to create the take profit button! Error code = ",GetLastError()); + + } + else + { + ChartRedraw(); + //--- set button coordinates + ObjectSetInteger(0,"SET_TP_BTN",OBJPROP_XDISTANCE,310); + ObjectSetInteger(0,"SET_TP_BTN",OBJPROP_YDISTANCE,100); + //--- set button size + ObjectSetInteger(0,"SET_TP_BTN",OBJPROP_XSIZE,120); + ObjectSetInteger(0,"SET_TP_BTN",OBJPROP_YSIZE,50); + //--- set the chart's corner, relative to which point coordinates are defined + ObjectSetInteger(0,"SET_TP_BTN",OBJPROP_CORNER,CORNER_LEFT_UPPER); + //--- set the text + ObjectSetString(0,"SET_TP_BTN",OBJPROP_TEXT,"Set TP"); + //--- set text font + ObjectSetString(0,"SET_TP_BTN",OBJPROP_FONT,"Arial"); + //--- set font size + ObjectSetInteger(0,"SET_TP_BTN",OBJPROP_FONTSIZE,10); + //--- set text color + ObjectSetInteger(0,"SET_TP_BTN",OBJPROP_COLOR,clrWhite); + //--- set background color + ObjectSetInteger(0,"SET_TP_BTN",OBJPROP_BGCOLOR,clrGray); + //--- set border color + ObjectSetInteger(0,"SET_TP_BTN",OBJPROP_BORDER_COLOR,clrGray); + + } + +} +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void GraphicalObjectsManager:: drawRectangle(int _zoneId) + { + + string nameInString = IntegerToString(_zoneId); + + + if(!ObjectCreate(_Symbol,nameInString,OBJ_RECTANGLE,0,iTime(_Symbol,PERIOD_CURRENT,20),iLow(_Symbol,PERIOD_CURRENT,20),iTime(_Symbol,PERIOD_CURRENT,10), iOpen(_Symbol,PERIOD_CURRENT,20))) + { + + Print(__FUNCTION__, + ": Failed to create a Zone! Error code = ",GetLastError()); + + } + + else + { + ChartRedraw(); + Print("Rectangle created successfully!"); + //--- set rectangle color + ObjectSetInteger(0,nameInString,OBJPROP_COLOR,clrDimGray); + ObjectSetInteger(0,nameInString,OBJPROP_FILL,clrDimGray); + + ObjectSetInteger(0,nameInString,OBJPROP_SELECTABLE,true); + + ObjectSetInteger(0,nameInString,OBJPROP_SELECTED,true); + + + ObjectSetInteger(0,nameInString,OBJPROP_XDISTANCE,700); + ObjectSetInteger(0,nameInString,OBJPROP_YDISTANCE,700); + + + } + + } + + + +void GraphicalObjectsManager:: drawRectangleInStrategyTester(int _zoneId,datetime leftEdge, datetime rightEdge, double highEdgePrice, double lowEdgePrice, long _color){ + + string nameInString = IntegerToString(_zoneId); + + + if(!ObjectCreate(_Symbol,nameInString,OBJ_RECTANGLE,0,leftEdge,lowEdgePrice,rightEdge, highEdgePrice)) + { + + Print(__FUNCTION__, + ": Failed to create a Zone! Error code = ",GetLastError()); + + } + + else + { + ChartRedraw(); + Print("Rectangle created successfully!"); + //--- set rectangle color + ObjectSetInteger(0,nameInString,OBJPROP_COLOR,_color); + ObjectSetInteger(0,nameInString,OBJPROP_FILL,_color); + ObjectSetInteger(0,nameInString,OBJPROP_BORDER_TYPE,0); + ObjectSetInteger(0,nameInString,OBJPROP_BACK,true); + + ObjectSetInteger(0,nameInString,OBJPROP_SELECTABLE,true); + + ObjectSetInteger(0,nameInString,OBJPROP_SELECTED,false); + + + ObjectSetInteger(0,nameInString,OBJPROP_XDISTANCE,700); + ObjectSetInteger(0,nameInString,OBJPROP_YDISTANCE,700); + + + + } + +} + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void GraphicalObjectsManager:: drawStopLossLine(string _zoneId) + { + + string lineName = "sl" + _zoneId ; +//--- create a horizontal line + if(!ObjectCreate(_Symbol,lineName,OBJ_HLINE,0,0,SymbolInfoDouble(_Symbol, SYMBOL_ASK))) + { + Print(__FUNCTION__, + ": failed to create a horizontal line! Error code = ",GetLastError()); + + } + ChartRedraw(); +//--- set line color + ObjectSetInteger(_Symbol,lineName,OBJPROP_COLOR,clrRed); +//--- set line display style + ObjectSetInteger(_Symbol,lineName,OBJPROP_STYLE,STYLE_SOLID); +//--- set line width + ObjectSetInteger(_Symbol,lineName,OBJPROP_WIDTH,1); +//--- display in the foreground (false) or background (true) + ObjectSetInteger(_Symbol,lineName,OBJPROP_BACK,true); +//--- enable (true) or disable (false) the mode of moving the line by mouse +//--- when creating a graphical object using ObjectCreate function, the object cannot be +//--- highlighted and moved by default. Inside this method, selection parameter +//--- is true by default making it possible to highlight and move the object + ObjectSetInteger(_Symbol,lineName,OBJPROP_SELECTABLE,true); + ObjectSetInteger(_Symbol,lineName,OBJPROP_SELECTED,false); +//--- hide (true) or display (false) graphical object name in the object list + ObjectSetInteger(_Symbol,lineName,OBJPROP_HIDDEN,false); + +//--- successful execution + } + + + void GraphicalObjectsManager:: drawTakeProfitLine(string _zoneId) + { + + string lineName = "tp" + _zoneId ; +//--- create a horizontal line + if(!ObjectCreate(_Symbol,lineName,OBJ_HLINE,0,0,SymbolInfoDouble(_Symbol, SYMBOL_ASK))) + { + Print(__FUNCTION__, + ": failed to create a horizontal line! Error code = ",GetLastError()); + + } + ChartRedraw(); +//--- set line color + ObjectSetInteger(_Symbol,lineName,OBJPROP_COLOR,clrAqua); +//--- set line display style + ObjectSetInteger(_Symbol,lineName,OBJPROP_STYLE,STYLE_SOLID); +//--- set line width + ObjectSetInteger(_Symbol,lineName,OBJPROP_WIDTH,0.5); +//--- display in the foreground (false) or background (true) + ObjectSetInteger(_Symbol,lineName,OBJPROP_BACK,true); +//--- enable (true) or disable (false) the mode of moving the line by mouse +//--- when creating a graphical object using ObjectCreate function, the object cannot be +//--- highlighted and moved by default. Inside this method, selection parameter +//--- is true by default making it possible to highlight and move the object + ObjectSetInteger(_Symbol,lineName,OBJPROP_SELECTABLE,true); + ObjectSetInteger(_Symbol,lineName,OBJPROP_SELECTED,false); +//--- hide (true) or display (false) graphical object name in the object list + ObjectSetInteger(_Symbol,lineName,OBJPROP_HIDDEN,false); + +//--- successful execution + } + + + +void GraphicalObjectsManager:: drawVerticalLine(long _color, datetime _time){ + Print("entered the drawvertical line function"); + string lineName = "vline" + IntegerToString(verticalLineCounter) ; + verticalLineCounter++; + + + + + if(!ObjectCreate(_Symbol,lineName,OBJ_VLINE,0,_time,0)) + { + Print(__FUNCTION__, + ": failed to create a horizontal line! Error code = ",GetLastError()); + + } + ChartRedraw(); +//--- set line color + ObjectSetInteger(_Symbol,lineName,OBJPROP_COLOR,_color); +//--- set line display style + ObjectSetInteger(_Symbol,lineName,OBJPROP_STYLE,STYLE_SOLID); +//--- set line width + ObjectSetInteger(_Symbol,lineName,OBJPROP_WIDTH,0.5); +//--- display in the foreground (false) or background (true) + ObjectSetInteger(_Symbol,lineName,OBJPROP_BACK,true); +//--- enable (true) or disable (false) the mode of moving the line by mouse +//--- when creating a graphical object using ObjectCreate function, the object cannot be +//--- highlighted and moved by default. Inside this method, selection parameter +//--- is true by default making it possible to highlight and move the object + ObjectSetInteger(_Symbol,lineName,OBJPROP_SELECTABLE,true); + ObjectSetInteger(_Symbol,lineName,OBJPROP_SELECTED,false); +//--- hide (true) or display (false) graphical object name in the object list + ObjectSetInteger(_Symbol,lineName,OBJPROP_HIDDEN,false); + + +} + + + +void GraphicalObjectsManager:: drawHorizontalLine(long _color, string nameOfLine,double price){ + + string lineName = nameOfLine; + + + + if(!ObjectCreate(_Symbol,lineName,OBJ_HLINE,0,TimeCurrent(),price)) + { + Print(__FUNCTION__, + ": failed to create a horizontal line! Error code = ",GetLastError()); + + } + ChartRedraw(); +//--- set line color + ObjectSetInteger(_Symbol,lineName,OBJPROP_COLOR,_color); +//--- set line display style + ObjectSetInteger(_Symbol,lineName,OBJPROP_STYLE,STYLE_SOLID); +//--- set line width + ObjectSetInteger(_Symbol,lineName,OBJPROP_WIDTH,0.5); +//--- display in the foreground (false) or background (true) + ObjectSetInteger(_Symbol,lineName,OBJPROP_BACK,true); +//--- enable (true) or disable (false) the mode of moving the line by mouse +//--- when creating a graphical object using ObjectCreate function, the object cannot be +//--- highlighted and moved by default. Inside this method, selection parameter +//--- is true by default making it possible to highlight and move the object + ObjectSetInteger(_Symbol,lineName,OBJPROP_SELECTABLE,true); + ObjectSetInteger(_Symbol,lineName,OBJPROP_SELECTED,false); +//--- hide (true) or display (false) graphical object name in the object list + ObjectSetInteger(_Symbol,lineName,OBJPROP_HIDDEN,false); + +} + +void GraphicalObjectsManager:: addText (){ + + if(!ObjectCreate(0,"textName",OBJ_EDIT,0,0,0)) + { + Print(__FUNCTION__, + ": failed to create a text! Error code = ",GetLastError()); + + } + + else{ + + + + ChartRedraw(); + + + //--- set button coordinates + ObjectSetInteger(0,"textName",OBJPROP_XDISTANCE,300); + ObjectSetInteger(0,"textName",OBJPROP_YDISTANCE,40); + //--- set button size + ObjectSetInteger(0,"textName",OBJPROP_XSIZE,120); + ObjectSetInteger(0,"textName",OBJPROP_YSIZE,50); + //--- set the chart's corner, relative to which point coordinates are defined + ObjectSetInteger(0,"textName",OBJPROP_CORNER,CORNER_LEFT_UPPER); + //--- set the text + ObjectSetString(0,"textName",OBJPROP_TEXT," Risk Amount"); + //--- set text font + ObjectSetString(0,"textName",OBJPROP_FONT,"Arial"); + //--- set font size + ObjectSetInteger(0,"textName",OBJPROP_FONTSIZE,10); + //--- set text color + ObjectSetInteger(0,"textName",OBJPROP_COLOR,clrWhite); + //--- set background color + ObjectSetInteger(0,"textName",OBJPROP_BGCOLOR,clrGray); + //--- set border color + ObjectSetInteger(0,"textName",OBJPROP_BORDER_COLOR,clrGray); + } + + + +} + + +void GraphicalObjectsManager:: addTextTiger (){ + + if(!ObjectCreate(0,"clockTextTiger",OBJ_EDIT,0,0,0)) + { + Print(__FUNCTION__, + ": failed to create a text! Error code = ",GetLastError()); + + } + + else{ + + + + ChartRedraw(); + + + //--- set button coordinates + ObjectSetInteger(0,"clockTextTiger",OBJPROP_XDISTANCE,300); + ObjectSetInteger(0,"clockTextTiger",OBJPROP_YDISTANCE,40); + //--- set button size + ObjectSetInteger(0,"clockTextTiger",OBJPROP_XSIZE,150); + ObjectSetInteger(0,"clockTextTiger",OBJPROP_YSIZE,100); + //--- set the chart's corner, relative to which point coordinates are defined + ObjectSetInteger(0,"clockTextTiger",OBJPROP_CORNER,CORNER_LEFT_UPPER); + //--- set the text + ObjectSetString(0,"clockTextTiger",OBJPROP_TEXT," "); + //--- set text font + ObjectSetString(0,"clockTextTiger",OBJPROP_FONT,"Arial"); + //--- set font size + ObjectSetInteger(0,"clockTextTiger",OBJPROP_FONTSIZE,20); + //--- set text color + ObjectSetInteger(0,"clockTextTiger",OBJPROP_COLOR,clrWhite); + //--- set background color + ObjectSetInteger(0,"clockTextTiger",OBJPROP_BGCOLOR,clrGray); + //--- set border color + ObjectSetInteger(0,"clockTextTiger",OBJPROP_BORDER_COLOR,clrGray); + } + + + +} + + + +void GraphicalObjectsManager:: addMarketDescriptionTextTiger(){ + + if(!ObjectCreate(0,"marketDescriptionText",OBJ_EDIT,0,0,0)) + { + Print(__FUNCTION__, + ": failed to create a text! Error code = ",GetLastError()); + + } + + else{ + + + + ChartRedraw(); + + + //--- set button coordinates + ObjectSetInteger(0,"marketDescriptionText",OBJPROP_XDISTANCE,50); + ObjectSetInteger(0,"marketDescriptionText",OBJPROP_YDISTANCE,150); + //--- set button size + ObjectSetInteger(0,"marketDescriptionText",OBJPROP_XSIZE,600); + ObjectSetInteger(0,"marketDescriptionText",OBJPROP_YSIZE,100); + //--- set the chart's corner, relative to which point coordinates are defined + ObjectSetInteger(0,"marketDescriptionText",OBJPROP_CORNER,CORNER_LEFT_UPPER); + //--- set the text + ObjectSetString(0,"marketDescriptionText",OBJPROP_TEXT," "); + //--- set text font + ObjectSetString(0,"marketDescriptionText",OBJPROP_FONT,"Arial"); + //--- set font size + ObjectSetInteger(0,"marketDescriptionText",OBJPROP_FONTSIZE,10); + //--- set text color + ObjectSetInteger(0,"marketDescriptionText",OBJPROP_COLOR,clrWhite); + //--- set background color + ObjectSetInteger(0,"marketDescriptionText",OBJPROP_BGCOLOR,clrGray); + //--- set border color + ObjectSetInteger(0,"marketDescriptionText",OBJPROP_BORDER_COLOR,clrGray); + } + + +} + + +void GraphicalObjectsManager:: addTotalRiskText (){ + + if(!ObjectCreate(0,"totalRiskText",OBJ_EDIT,0,0,0)) + { + Print(__FUNCTION__, + ": failed to create a text! Error code = ",GetLastError()); + + } + + else{ + + + + ChartRedraw(); + + + //--- set button coordinates + ObjectSetInteger(0,"totalRiskText",OBJPROP_XDISTANCE,700); + ObjectSetInteger(0,"totalRiskText",OBJPROP_YDISTANCE,40); + //--- set button size + ObjectSetInteger(0,"totalRiskText",OBJPROP_XSIZE,120); + ObjectSetInteger(0,"totalRiskText",OBJPROP_YSIZE,50); + //--- set the chart's corner, relative to which point coordinates are defined + ObjectSetInteger(0,"totalRiskText",OBJPROP_CORNER,CORNER_LEFT_UPPER); + //--- set the text + ObjectSetString(0,"totalRiskText",OBJPROP_TEXT,"Total Risk is: 0"); + //--- set text font + ObjectSetString(0,"totalRiskText",OBJPROP_FONT,"Arial"); + //--- set font size + ObjectSetInteger(0,"totalRiskText",OBJPROP_FONTSIZE,10); + //--- set text color + ObjectSetInteger(0,"totalRiskText",OBJPROP_COLOR,clrWhite); + //--- set background color + ObjectSetInteger(0,"totalRiskText",OBJPROP_BGCOLOR,clrBlack); + //--- set border color + ObjectSetInteger(0,"totalRiskText",OBJPROP_BORDER_COLOR,clrBlack); + + ObjectSetInteger(_Symbol,"totalRiskText",OBJPROP_SELECTABLE,false); + + + } + + + +} + + +bool GraphicalObjectsManager:: EditTextGet(string &text, const long chart_ID=0, string name = "") + { +//--- reset the error value + ResetLastError(); +//--- get object text + if(!ObjectGetString(chart_ID,name,OBJPROP_TEXT,0,text)) + { + Print(__FUNCTION__, + ": failed to get the text! Error code = ",GetLastError()); + return(false); + } +//--- successful execution + return(true); + } + + + +void GraphicalObjectsManager:: drawStopLossLineGandalf() + { + + string lineName = "sl" ; +//--- create a horizontal line + if(!ObjectCreate(_Symbol,lineName,OBJ_HLINE,0,0,SymbolInfoDouble(_Symbol, SYMBOL_ASK))) + { + Print(__FUNCTION__, + ": failed to create a horizontal line! Error code = ",GetLastError()); + + } + ChartRedraw(); +//--- set line color + ObjectSetInteger(_Symbol,lineName,OBJPROP_COLOR,clrRed); +//--- set line display style + ObjectSetInteger(_Symbol,lineName,OBJPROP_STYLE,STYLE_SOLID); +//--- set line width + ObjectSetInteger(_Symbol,lineName,OBJPROP_WIDTH,1); +//--- display in the foreground (false) or background (true) + ObjectSetInteger(_Symbol,lineName,OBJPROP_BACK,true); +//--- enable (true) or disable (false) the mode of moving the line by mouse +//--- when creating a graphical object using ObjectCreate function, the object cannot be +//--- highlighted and moved by default. Inside this method, selection parameter +//--- is true by default making it possible to highlight and move the object + ObjectSetInteger(_Symbol,lineName,OBJPROP_SELECTABLE,true); + ObjectSetInteger(_Symbol,lineName,OBJPROP_SELECTED,false); +//--- hide (true) or display (false) graphical object name in the object list + ObjectSetInteger(_Symbol,lineName,OBJPROP_HIDDEN,false); + +//--- successful execution + } + + + + +void GraphicalObjectsManager:: drawLowFractal(int _index,long _color){ + + string fractalName = "low_fractal" ; +//--- create a horizontal line + if(!ObjectCreate(_Symbol,fractalName,OBJ_ARROW_UP,0,iTime(_Symbol,PERIOD_CURRENT,_index),iLow(_Symbol,PERIOD_CURRENT,_index) - 0.25)) + { + + Print(__FUNCTION__, + ": failed to create an arrow object! Error code = ",GetLastError()); + + } + + ChartRedraw(); +//--- set line color + ObjectSetInteger(_Symbol,fractalName,OBJPROP_COLOR,_color); +//--- set line display style + ObjectSetInteger(_Symbol,fractalName,OBJPROP_STYLE,STYLE_SOLID); +//--- set line width + // ObjectSetInteger(_Symbol,fractalName,OBJPROP_WIDTH,1); +//--- display in the foreground (false) or background (true) + ObjectSetInteger(_Symbol,fractalName,OBJPROP_BACK,true); +//--- enable (true) or disable (false) the mode of moving the line by mouse +//--- when creating a graphical object using ObjectCreate function, the object cannot be +//--- highlighted and moved by default. Inside this method, selection parameter +//--- is true by default making it possible to highlight and move the object + //ObjectSetInteger(_Symbol,fractalName,OBJPROP_SELECTABLE,true); + ObjectSetInteger(_Symbol,fractalName,OBJPROP_SELECTED,false); +//--- hide (true) or display (false) graphical object name in the object list + ObjectSetInteger(_Symbol,fractalName,OBJPROP_HIDDEN,false); +} + + + +void GraphicalObjectsManager:: drawHighFractal(int _index,long _color){ + + string fractalName = "high_fractal" ; +//--- create a horizontal line + if(!ObjectCreate(_Symbol,fractalName,OBJ_ARROW_DOWN,0,iTime(_Symbol,PERIOD_CURRENT,_index),iHigh(_Symbol,PERIOD_CURRENT,_index) + 0.25)) + { + + Print(__FUNCTION__, + ": failed to create an arrow object! Error code = ",GetLastError()); + + } + + ChartRedraw(); +//--- set line color + ObjectSetInteger(_Symbol,fractalName,OBJPROP_COLOR,_color); +//--- set line display style + ObjectSetInteger(_Symbol,fractalName,OBJPROP_STYLE,STYLE_SOLID); +//--- set line width + // ObjectSetInteger(_Symbol,fractalName,OBJPROP_WIDTH,1); +//--- display in the foreground (false) or background (true) + ObjectSetInteger(_Symbol,fractalName,OBJPROP_BACK,true); +//--- enable (true) or disable (false) the mode of moving the line by mouse +//--- when creating a graphical object using ObjectCreate function, the object cannot be +//--- highlighted and moved by default. Inside this method, selection parameter +//--- is true by default making it possible to highlight and move the object + //ObjectSetInteger(_Symbol,fractalName,OBJPROP_SELECTABLE,true); + ObjectSetInteger(_Symbol,fractalName,OBJPROP_SELECTED,false); +//--- hide (true) or display (false) graphical object name in the object list + ObjectSetInteger(_Symbol,fractalName,OBJPROP_HIDDEN,false); +} \ No newline at end of file diff --git a/HighFractal.mqh b/HighFractal.mqh new file mode 100644 index 0000000..8fea724 --- /dev/null +++ b/HighFractal.mqh @@ -0,0 +1,254 @@ +//+------------------------------------------------------------------+ +//| HighFractal.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +class HighFractal + { + +private: + + double highPrice ; + int leftPeriod; + int rightPeriod; + + MqlDateTime dateStruct ; + datetime date ; + + double sellLimitPrice; // the fib level price , based on this fractal + double lowestPeak ; // the highest price reached, after the fractal was formed + int hour ; + int minute; + int distance ; // holds the number of candles from this fractal until the current live candle + string arrowObjName ; + double fibPrice ; + +public: + HighFractal(); + HighFractal(double _price, int _leftPeriod, int _rightPeriod, datetime _date,ENUM_TIMEFRAMES _tf); + ~HighFractal(); + + + + // GETTERS + + double getPrice(); + int getLeftPeriod(); + int getRightPeriod(); + int getHour(); + int getMinute(); + double getLowestPeak(); + int getDistance(); + string getArrowObjName(); + datetime getDate(); + // SETTERS + + void setPrice(double _price); + void setLeftPeriod(int _leftPeriod); + void setRightPeriod(int _rightPeriod); + void setHour(int _hour); + void setMinute(int _minute); + void setLowestPeak(double _highest); + void setArrowObjName(string _name); + void setDistance(int _dist); + void setDate(datetime _givenDate); + + + // OTHER FUNCTIONS + + double calculateFibPrice(double _fibLevel, double _highPrice, double _lowPrice); // calculate the fibonacci price based on the given level, and saves the price in the fibPrice88 variable in the object + void updateDistance(); + + + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +HighFractal::HighFractal() + { + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +HighFractal::HighFractal(double _price, int _leftPeriod, int _rightPeriod,datetime _date,ENUM_TIMEFRAMES _tf) + { +// the constructor sets the data to the attribues , and calculates the real time of the fractal , because the given minute and hour +// are not the real time, they are the time of when the fractal was "known to be a fractal", which is after _righPeriod amount of candles + + highPrice = _price ; + leftPeriod = _leftPeriod; + rightPeriod = _rightPeriod; + sellLimitPrice = -1 ; + distance = _rightPeriod+1; + arrowObjName = " " ; + lowestPeak = -1; + + + date = iTime(_Symbol,_tf,_rightPeriod+1); // bring the actual date of the fractal + TimeToStruct(date,dateStruct); // convert the actual date into a struct + + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +HighFractal::~HighFractal() + { + } +//+------------------------------------------------------------------+ + + + +double HighFractal:: getPrice() + { + + return highPrice ; + } +//+------------------------------------------------------------------+ + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int HighFractal:: getLeftPeriod() + { + + return leftPeriod ; + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int HighFractal:: getRightPeriod() + { + + return rightPeriod ; + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int HighFractal:: getHour() + { + + return dateStruct.hour ; + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int HighFractal:: getMinute() + { + return dateStruct.min ; + } + + +double HighFractal:: getLowestPeak(){ + + return lowestPeak ; +} + + + +int HighFractal:: getDistance(){ + + return distance ; +} + + +string HighFractal:: getArrowObjName(){ + return arrowObjName ; + +} + + +datetime HighFractal:: getDate(){ + + return date ; +} + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void HighFractal:: setPrice(double _price) + { + highPrice = _price ; + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void HighFractal:: setLeftPeriod(int _leftPeriod) + { + leftPeriod = _leftPeriod ; + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void HighFractal:: setRightPeriod(int _rightPeriod) + { + rightPeriod = _rightPeriod ; + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void HighFractal:: setHour(int _hour) + { + hour = _hour ; + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void HighFractal:: setMinute(int _minute) + { + minute = _minute ; + } + +//+------------------------------------------------------------------+ + +void HighFractal:: setArrowObjName(string _name){ + arrowObjName = _name ; + +} + + void HighFractal:: setDistance(int _dist){ + distance = _dist ; + } + + + +double HighFractal:: calculateFibPrice(double _fibLevel, double _highPrice, double _lowPrice){ + + double difference = _lowPrice - _highPrice ; + difference = difference*-1 ; + double retracement = _fibLevel * difference ; + double _fibPrice = _lowPrice + retracement ; + fibPrice = _fibPrice ; + return fibPrice; +} + + + +void HighFractal:: setLowestPeak(double _lowest){ + + lowestPeak = _lowest ; + +} + +void HighFractal:: setDate(datetime _givenDate){ + date = _givenDate; + TimeToStruct(date,dateStruct); // convert the actual date into a struct +} + +void HighFractal:: updateDistance(){ + + distance++ ; +} +//+------------------------------------------------------------------+ diff --git a/HighFractalContainer.mqh b/HighFractalContainer.mqh new file mode 100644 index 0000000..07321ae --- /dev/null +++ b/HighFractalContainer.mqh @@ -0,0 +1,131 @@ +//+------------------------------------------------------------------+ +//| HighFractalContainer.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +#include "HighFractal.mqh" +#include +#define SIZE 700 + +double input arrowDistanceHighs ; + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +class HighFractalContainer + { +private: + HighFractal* highFractals[SIZE]; + int freeIndex ; + double range ; + ENUM_TIMEFRAMES timeFrame ; +public: + HighFractalContainer(ENUM_TIMEFRAMES _timeFrame); + ~HighFractalContainer(); + + //GETTERS + + HighFractal* getHighFractal(int _index) {return highFractals[_index] ;} // returns the fractal using its index in the array + int getFreeIndex() {return freeIndex ; } + + //SETTERS + void setRange(double _range) {range = _range ;} + + // OTHER FUNCTIONS + void addHighFractal(HighFractal* _highFractal); // adds high fractal to the high fractals array + void printHighFractals(); // prints the data of every high fractal in the highFractals[] array + + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +HighFractalContainer::HighFractalContainer(ENUM_TIMEFRAMES _timeFrame) + { + timeFrame = _timeFrame; + freeIndex = 0 ; + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +HighFractalContainer::~HighFractalContainer() + { + + for(int i=0; i 0) + { + for(int i=0 ; i SymbolInfoDouble(_Symbol, SYMBOL_BID)) // we are calculating for a sell + { + difference = stopLossPrice - SymbolInfoDouble(_Symbol, SYMBOL_BID) ; + differenceInPoints = difference / SymbolInfoDouble(_Symbol, SYMBOL_POINT); + double pointValue = PointValue(_Symbol); + + // Situation 3, fixed risk amount and stop loss, how many lots to trade + double riskInPoints = differenceInPoints; + double riskLots = riskInMoney / (pointValue * riskInPoints); + + return riskLots; + } + + if(SymbolInfoDouble(_Symbol, SYMBOL_ASK) > stopLossPrice){ + difference = SymbolInfoDouble(_Symbol, SYMBOL_ASK) - stopLossPrice ; + differenceInPoints = difference / SymbolInfoDouble(_Symbol, SYMBOL_POINT); + double pointValue = PointValue(_Symbol); + double riskInPoints = differenceInPoints; + double riskLots = riskInMoney / (pointValue * riskInPoints); + return riskLots; + } + + + return 0 ; + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double LotSizeCalculator:: PointValue(string symbol) + { + + double tickSize = TickSize(symbol); + double tickValue = TickValue(symbol); + double point = Point(symbol); + double ticksPerPoint = tickSize / point; + double pointValue = tickValue / ticksPerPoint; + + PrintFormat("tickSize=%f, tickValue=%f, point=%f, ticksPerPoint=%f, pointValue=%f", + tickSize, tickValue, point, ticksPerPoint, pointValue); + + return (pointValue); + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void LotSizeCalculator:: Test(string symbol) + { + + PrintFormat("Base currency is %s", BaseCurrency()); + PrintFormat("Testing for symbol %s", symbol); + + double pointValue = PointValue(symbol); + + PrintFormat("ValuePerPoint for %s is %f", symbol, pointValue); + +// Situation 3, fixed risk amount and stop loss, how many lots to trade + double riskAmount = 100; + double riskPoints = 5000; + double riskLots = riskAmount / (pointValue * riskPoints); + PrintFormat("Risk lots for %s value %f and stop loss at %f points is %f", + symbol, riskAmount, riskPoints, riskLots); + } +//+------------------------------------------------------------------+ diff --git a/LowFractal.mqh b/LowFractal.mqh new file mode 100644 index 0000000..96244f9 --- /dev/null +++ b/LowFractal.mqh @@ -0,0 +1,255 @@ +//+------------------------------------------------------------------+ +//| LowFractal.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +class LowFractal + { +private: + +private: + + double lowPrice ; + int leftPeriod; + int rightPeriod; + + MqlDateTime dateStruct ; + datetime date ; + + double buyLimitPrice; // the fib level price , based on this fractal + double highestPeak ; // the highest price reached, after the fractal was formed + int hour ; + int minute; + int distance ; // holds the number of candles from this fractal until the current live candle + string arrowObjName ; + double fibPrice ; + +public: + LowFractal(); + LowFractal(double _price, int _leftPeriod, int _rightPeriod, datetime _date,ENUM_TIMEFRAMES _tf); + ~LowFractal(); + + + + // GETTERS + + double getPrice(); + int getLeftPeriod(); + int getRightPeriod(); + int getHour(); + int getMinute(); + double getHighestPeak(); + int getDistance(); + string getArrowObjName(); + datetime getDate(); + // SETTERS + + void setPrice(double _price); + void setLeftPeriod(int _leftPeriod); + void setRightPeriod(int _rightPeriod); + void setHour(int _hour); + void setMinute(int _minute); + void setHighestPeak(double _highest); + void setArrowObjName(string _name); + void setDistance(int _dist); + void setDate(datetime _givenDate); + + + // OTHER FUNCTIONS + + double calculateFibPrice(double _fibLevel, double _lowPrice, double _highPrice); // calculate the fibonacci price based on the given level, and saves the price in the fibPrice88 variable in the object + void updateDistance(); + + + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +LowFractal::LowFractal() + { + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +LowFractal::LowFractal(double _price, int _leftPeriod, int _rightPeriod,datetime _date, ENUM_TIMEFRAMES _tf) + { +// the constructor sets the data to the attribues , and calculates the real time of the fractal , because the given minute and hour +// are not the real time, they are the time of when the fractal was "known to be a fractal", which is after _righPeriod amount of candles + + lowPrice = _price ; + leftPeriod = _leftPeriod; + rightPeriod = _rightPeriod; + buyLimitPrice = -1 ; + distance = _rightPeriod+1; + arrowObjName = " " ; + highestPeak = -1; + + + date = iTime(_Symbol,_tf,_rightPeriod+1); // bring the actual date of the fractal + TimeToStruct(date,dateStruct); // convert the actual date into a struct + + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +LowFractal::~LowFractal() + { + } +//+------------------------------------------------------------------+ + + + +double LowFractal:: getPrice() + { + + return lowPrice ; + } +//+------------------------------------------------------------------+ + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int LowFractal:: getLeftPeriod() + { + + return leftPeriod ; + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int LowFractal:: getRightPeriod() + { + + return rightPeriod ; + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int LowFractal:: getHour() + { + + return dateStruct.hour ; + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int LowFractal:: getMinute() + { + return dateStruct.min ; + } + + +double LowFractal:: getHighestPeak(){ + + return highestPeak ; +} + + + +int LowFractal:: getDistance(){ + + return distance ; +} + + +string LowFractal:: getArrowObjName(){ + return arrowObjName ; + +} + + +datetime LowFractal:: getDate(){ + + return date ; +} + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void LowFractal:: setPrice(double _price) + { + lowPrice = _price ; + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void LowFractal:: setLeftPeriod(int _leftPeriod) + { + leftPeriod = _leftPeriod ; + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void LowFractal:: setRightPeriod(int _rightPeriod) + { + rightPeriod = _rightPeriod ; + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void LowFractal:: setHour(int _hour) + { + hour = _hour ; + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void LowFractal:: setMinute(int _minute) + { + minute = _minute ; + } + +//+------------------------------------------------------------------+ + +void LowFractal:: setArrowObjName(string _name){ + arrowObjName = _name ; + +} + + void LowFractal:: setDistance(int _dist){ + distance = _dist ; + } + + + +double LowFractal:: calculateFibPrice(double _fibLevel, double _lowPrice, double _highPrice){ + + double difference = _highPrice - _lowPrice ; + double retracement = _fibLevel * difference ; + double _fibPrice = _highPrice - retracement ; + fibPrice = _fibPrice ; + return fibPrice; +} + + + +void LowFractal:: setHighestPeak(double _highest){ + + highestPeak = _highest ; + +} + +void LowFractal:: setDate(datetime _givenDate){ + date = _givenDate; + TimeToStruct(date,dateStruct); // convert the actual date into a struct +} + +void LowFractal:: updateDistance(){ + + distance++ ; +} + + diff --git a/LowFractalContainer.mqh b/LowFractalContainer.mqh new file mode 100644 index 0000000..e343409 --- /dev/null +++ b/LowFractalContainer.mqh @@ -0,0 +1,137 @@ +//+------------------------------------------------------------------+ +//| LowFractalContainer.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +#include "LowFractal.mqh" +#include +#define SIZE 700 + +double input arrowDistanceLows ; + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +class LowFractalContainer + { +private: + LowFractal* lowFractals[SIZE]; + int freeIndex ; + double range ; + ENUM_TIMEFRAMES timeFrame ; +public: + LowFractalContainer(ENUM_TIMEFRAMES _timeFrame); + ~LowFractalContainer(); + + //GETTERS + + LowFractal* getLowFractal(int _index) {return lowFractals[_index] ;} // returns the fractal using its index in the array + int getFreeIndex() {return freeIndex ; } + + //SETTERS + void setRange(double _range) {range = _range ;} + + // OTHER FUNCTIONS + void addLowFractal(LowFractal* _lowFractal); // adds low fractal to the low fractals array + void printLowFractals(); // prints all low fractals data + + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +LowFractalContainer::LowFractalContainer(ENUM_TIMEFRAMES _timeFrame) + { + timeFrame = _timeFrame ; + freeIndex = 0 ; + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +LowFractalContainer::~LowFractalContainer() + { + + for(int i=0; i 0) + { + + for(int i=0 ; i= zoneContainer.getZoneByIndex(currentResistanceZoneIndex).getLowerEdge()) + { + + Print("Reached the current resistance zone !"); + return "TYPE_RESISTANCE" ; + + } + + if(SymbolInfoDouble(_Symbol, SYMBOL_ASK) <= zoneContainer.getZoneByIndex(currentSupportZoneIndex).getHigherEdge()) + { + Print("Reached the current support zone !"); + return "TYPE_SUPPORT" ; + + } + } + + + return "" ; + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool MarketObserver:: reachedClosestSupportZone() + { + + int currentSupportZoneIndex = zoneContainer.getLowZonePivot(); + + if(currentSupportZoneIndex != -1) + { + if(SymbolInfoDouble(_Symbol, SYMBOL_ASK) <= zoneContainer.getZoneByIndex(currentSupportZoneIndex).getHigherEdge()) + { + return true ; + + } + + } + + return false ; + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool MarketObserver:: reachedClosestResistanceZone() + { + + int currentResistanceZoneIndex = zoneContainer.getHighZonePivot(); + + if(currentResistanceZoneIndex != -1) + { + + if(SymbolInfoDouble(_Symbol, SYMBOL_ASK) >= zoneContainer.getZoneByIndex(currentResistanceZoneIndex).getLowerEdge()) + { + return true ; + + } + } + + + return false ; + + } + + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool MarketObserver:: bullishCandleClosedInsideClosestResistanceZone(ENUM_TIMEFRAMES tf) + { + + double previousCandleClose = iClose(_Symbol,tf,1); + double previousCandleOpen = iOpen(_Symbol,tf,1); + + if(zoneContainer.getHighZonePivot() != -1) // means if there is a pivot zone + { + + if((previousCandleClose > previousCandleOpen) && (previousCandleClose > zoneContainer.getZoneByIndex(zoneContainer.getHighZonePivot()).getLowerEdge()) && (previousCandleClose < zoneContainer.getZoneByIndex(zoneContainer.getHighZonePivot()).getHigherEdge())) // means if previous the candle is bullish and closed inside the resistance zone + { + + return true ; + } + } + + return false ; + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool MarketObserver:: bearishCandleClosedInsideClosestSupportZone(ENUM_TIMEFRAMES tf) + { + + double previousCandleClose = iClose(_Symbol,tf,1); + double previousCandleOpen = iOpen(_Symbol,tf,1); + + if(zoneContainer.getLowZonePivot() != -1) + { + if((previousCandleClose < previousCandleOpen) && (previousCandleClose < zoneContainer.getZoneByIndex(zoneContainer.getLowZonePivot()).getHigherEdge()) && (previousCandleClose > zoneContainer.getZoneByIndex(zoneContainer.getLowZonePivot()).getLowerEdge())) // means if previous the candle is breaish and closed inside the support zone + { + return true ; + } + + } + return false ; + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +string MarketObserver:: giveMarketReport() + { + + + return " " ; + } + +//+------------------------------------------------------------------+ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool MarketObserver:: candleClosedBelowClosestSupportZone(ENUM_TIMEFRAMES tf) + { + + double previousCandleClose = iClose(_Symbol,tf,1); + double previousCandleOpen = iOpen(_Symbol,tf,1); + + + if(zoneContainer.getLowZonePivot() != -1) + { + if((previousCandleClose < zoneContainer.getZoneByIndex(zoneContainer.getLowZonePivot()).getLowerEdge())) // means if the previous candle closed below the support zone + { + + return true ; + } + + } + return false ; + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool MarketObserver:: candleClosedAboveClosestResistanceZone(ENUM_TIMEFRAMES tf) + { + + double previousCandleClose = iClose(_Symbol,tf,1); + double previousCandleOpen = iOpen(_Symbol,tf,1); + + if(zoneContainer.getHighZonePivot() != -1) // means if there is a pivot zone + { + + if((previousCandleClose > zoneContainer.getZoneByIndex(zoneContainer.getHighZonePivot()).getHigherEdge())) // means if previous the candle closed above the resistance zone + { + + return true ; + } + } + return false ; + + } + + + bool MarketObserver:: candleClosedAboveResistanceByIndex(int _index,ENUM_TIMEFRAMES tf){ + + double previousCandleClose = iClose(_Symbol,tf,1); + + if((previousCandleClose > zoneContainer.getZoneByIndex(_index).getHigherEdge())){ + + return true ; + } + + return false ; + } +//+------------------------------------------------------------------+ diff --git a/MarketObserverTiger.mqh b/MarketObserverTiger.mqh new file mode 100644 index 0000000..17a709b --- /dev/null +++ b/MarketObserverTiger.mqh @@ -0,0 +1,105 @@ +//+------------------------------------------------------------------+ +//| MarketObserverTiger.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +//+------------------------------------------------------------------+ +//| defines | +//+------------------------------------------------------------------+ +// #define MacrosHello "Hello, world!" +// #define MacrosYear 2010 +//+------------------------------------------------------------------+ +//| DLL imports | +//+------------------------------------------------------------------+ +// #import "user32.dll" +// int SendMessageA(int hWnd,int Msg,int wParam,int lParam); +// #import "my_expert.dll" +// int ExpertRecalculate(int wParam,int lParam); +// #import +//+------------------------------------------------------------------+ +//| EX5 imports | +//+------------------------------------------------------------------+ +// #import "stdlib.ex5" +// string ErrorDescription(int error_code); +// #import +//+------------------------------------------------------------------+ +#include "Zone.mqh" +#include "ZoneContainer.mqh" + + +// ALGORITHM CLASSES INCLUDES + +#include "NewCandleDetector.mqh" + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +class MarketObserverTiger + { + // THIS CLASS HAS ACCESS TO ZONE CONTAINER, HOWEVER IT MUST NOT CHANGE IT IT ONLY READS FROM THE ZONECONTAINER CLASS +private: + + + +public: + MarketObserverTiger(); + ~MarketObserverTiger(); + + string zoneReached(); + bool candleClosedAboveResistanceByIndex(int _index,ENUM_TIMEFRAMES tf,ZoneContainer& resistanceZoneContainer); // the index is a specific zone from the zones container + bool candleClosedBelowSupportByIndex(int _index,ENUM_TIMEFRAMES tf,ZoneContainer& supportZoneContainer); // the index is a specific zone from the zones container + + + + + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +MarketObserverTiger::MarketObserverTiger() + { + + + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +MarketObserverTiger::~MarketObserverTiger() + { + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool MarketObserverTiger:: candleClosedAboveResistanceByIndex(int _index,ENUM_TIMEFRAMES tf,ZoneContainer& resistanceZoneContainer) + { + + double previousCandleClose = iClose(_Symbol,tf,1); + + if((previousCandleClose > resistanceZoneContainer.getZoneByIndex(_index).getHigherEdge())) + { + + return true ; + } + + return false ; + } + + + +bool MarketObserverTiger:: candleClosedBelowSupportByIndex(int _index, ENUM_TIMEFRAMES tf, ZoneContainer& supportZoneContainer){ + + + double previousCandleClose = iClose(_Symbol,tf,1); + if(previousCandleClose < supportZoneContainer.getZoneByIndex(_index).getLowerEdge()){ + return true ; + } + + return false ; +} diff --git a/NewCandleDetector.mqh b/NewCandleDetector.mqh new file mode 100644 index 0000000..678a7b4 --- /dev/null +++ b/NewCandleDetector.mqh @@ -0,0 +1,378 @@ +//+------------------------------------------------------------------+ +//| NewCandleDetector.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +class NewCandleDetector + { +private: + string timeFrame ; + datetime beginDate ; // this datetime gets initialized only after the first call of the isNewCandle() function + MqlDateTime currTimeStruct; + MqlDateTime beginDateStruct; + bool firstCallHappened; +public: + NewCandleDetector(string _timeFrame); + + ~NewCandleDetector(); + + // GETTERS + datetime getBeginDate() {return beginDate;} + + void setTimeFrame(string _timeFrame) {timeFrame = _timeFrame;} + bool isNewCandle(); + + }; +//+------------------------------------------------------------------+ + +NewCandleDetector::NewCandleDetector(string _timeFrame) + { + + timeFrame = _timeFrame ; + firstCallHappened = false; + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +NewCandleDetector::~NewCandleDetector() + { + } +//+------------------------------------------------------------------+ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool NewCandleDetector:: isNewCandle() + { + + + + if(timeFrame == "PERIOD_M1") + { + + if(firstCallHappened == false) + { + + beginDate = iTime(_Symbol,PERIOD_M1,0); + firstCallHappened = true; + } + + if(firstCallHappened == true) + { + datetime currTime = iTime(_Symbol,PERIOD_M1,0); + TimeToStruct(beginDate,beginDateStruct); + TimeToStruct(currTime,currTimeStruct); + + if(beginDateStruct.min == currTimeStruct.min) + { + + return false; + } + else + { + //Print("in a new candle !, asset: " + _Symbol); + beginDate = currTime; + return true ; + + } + } + + + + } + else + if(timeFrame == "PERIOD_M2") + { + + } + + else + if(timeFrame == "PERIOD_M3") + { + + } + else + if(timeFrame == "PERIOD_M4") + { + + } + else + if(timeFrame == "PERIOD_M5") + { + + if(firstCallHappened == false) + { + beginDate = iTime(_Symbol,PERIOD_M5,0); + firstCallHappened = true; + } + + if(firstCallHappened == true) + { + datetime currTime = iTime(_Symbol,PERIOD_M5,0); + TimeToStruct(beginDate,beginDateStruct); + TimeToStruct(currTime,currTimeStruct); + + if(beginDateStruct.min == currTimeStruct.min) + { + + return false; + } + else + { + Print("in a new candle !, asset: " + _Symbol); + beginDate = currTime; + return true ; + + } + } + + } + else + if(timeFrame == "PERIOD_M6") + { + + } + else + if(timeFrame == "PERIOD_M10") + { + + } + else + if(timeFrame == "PERIOD_M12") + { + + } + else + if(timeFrame == "PERIOD_M15") + { + + if(firstCallHappened == false) + { + beginDate = iTime(_Symbol,PERIOD_M15,0); + firstCallHappened = true; + } + + if(firstCallHappened == true) + { + datetime currTime = iTime(_Symbol,PERIOD_M15,0); + TimeToStruct(beginDate,beginDateStruct); + TimeToStruct(currTime,currTimeStruct); + + if(beginDateStruct.min == currTimeStruct.min) + { + + return false; + } + else + { + + beginDate = currTime; + return true ; + + } + } + + } + else + if(timeFrame == "PERIOD_M20") + { + + } + else + if(timeFrame == "PERIOD_M30") + { + if(firstCallHappened == false) + { + beginDate = iTime(_Symbol,PERIOD_M30,0); + firstCallHappened = true; + } + + if(firstCallHappened == true) + { + datetime currTime = iTime(_Symbol,PERIOD_M30,0); + TimeToStruct(beginDate,beginDateStruct); + TimeToStruct(currTime,currTimeStruct); + + if(beginDateStruct.min == currTimeStruct.min) + { + + return false; + } + else + { + + beginDate = currTime; + return true ; + + } + } + } + else + if(timeFrame == "PERIOD_H1") + { + if(firstCallHappened == false) + { + beginDate = iTime(_Symbol,PERIOD_H1,0); + firstCallHappened = true; + } + + if(firstCallHappened == true) + { + datetime currTime = iTime(_Symbol,PERIOD_H1,0); + TimeToStruct(beginDate,beginDateStruct); + TimeToStruct(currTime,currTimeStruct); + + if(beginDateStruct.hour == currTimeStruct.hour) + { + + return false; + } + else + { + + beginDate = currTime; + return true ; + + } + } + + } + else + if(timeFrame == "PERIOD_H2") + { + + } + else + if(timeFrame == "PERIOD_H3") + { + + } + else + if(timeFrame == "PERIOD_H4") + { + if(firstCallHappened == false) + { + beginDate = iTime(_Symbol,PERIOD_H4,0); + firstCallHappened = true; + } + + if(firstCallHappened == true) + { + datetime currTime = iTime(_Symbol,PERIOD_H4,0); + TimeToStruct(beginDate,beginDateStruct); + TimeToStruct(currTime,currTimeStruct); + + if(beginDateStruct.hour == currTimeStruct.hour) + { + + return false; + } + else + { + + beginDate = currTime; + return true ; + + } + } + } + else + if(timeFrame == "PERIOD_H6") + { + + } + else + if(timeFrame == "PERIOD_H8") + { + + } + else + if(timeFrame == "PERIOD_H12") + { + + } + else + if(timeFrame == "PERIOD_D1") + { + + if(firstCallHappened == false) + { + beginDate = iTime(_Symbol,PERIOD_D1,0); + firstCallHappened = true; + } + + if(firstCallHappened == true) + { + datetime currTime = iTime(_Symbol,PERIOD_D1,0); + TimeToStruct(beginDate,beginDateStruct); + TimeToStruct(currTime,currTimeStruct); + + if(beginDateStruct.day == currTimeStruct.day) + { + + return false; + } + else + { + + beginDate = currTime; + return true ; + + } + } + + } + else + if(timeFrame == "PERIOD_W1") + { + + + if(firstCallHappened == false) + { + beginDate = iTime(_Symbol,PERIOD_W1,0); + firstCallHappened = true; + } + + if(firstCallHappened == true) + { + datetime currTime = iTime(_Symbol,PERIOD_W1,0); + TimeToStruct(beginDate,beginDateStruct); + TimeToStruct(currTime,currTimeStruct); + + if(beginDateStruct.day == currTimeStruct.day) + { + + return false; + } + else + { + + beginDate = currTime; + return true ; + + } + } + + } + else + if(timeFrame == "PERIOD_MN1") + { + + } + + + + return true; + } +//+------------------------------------------------------------------+ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ diff --git a/NewGenTest.ex5 b/NewGenTest.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..26600d19c789967784d57e0aafa8036ed8305841 GIT binary patch literal 97590 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 U;2V)#fKrgxlv|jpNulkqO)?q1%K!iX literal 0 HcmV?d00001 diff --git a/NewGenTest.mq5 b/NewGenTest.mq5 new file mode 100644 index 0000000..49d1571 --- /dev/null +++ b/NewGenTest.mq5 @@ -0,0 +1,1643 @@ +//+------------------------------------------------------------------+ +//| ZoneScanner.mq5 | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + + +// INPUT VARIABLES +//input ENUM_TIMEFRAMES inputTimeFrameFractals ; + + + +// FRACTALS DATA + +//input int leftPeriod; +//input int rightPeriod; +//input int weekPeriodToInitialize; +//input int initFractalsPeriod ; +//int lowFractalIndex ; +//int highFractalIndex ; +//#include "LowFractal.mqh" +//#include "HighFractal.mqh" +//#include "LowFractalContainer.mqh" +//#include "HighFractalContainer.mqh" + + + +#property script_show_inputs + +input datetime InpStartTime = __DATETIME__; +input bool REJECTION_M1_ONLY ; + +// GUI CLASSES INCLUDES +#include "GraphicalObjectsManager.mqh" +#include "ObjectConfirmationUnit.mqh" +#include "TempObjectAttributes.mqh" +#include "TempLineObjectAttributes.mqh" + + +// DATA STRUCTURE CLASSES INCLUDES +#include "Zone.mqh" +#include "ZoneContainer.mqh" + + + +// ALGORITHM CLASSES INCLUDES + +#include "NewCandleDetector.mqh" +#include "MarketObserver.mqh" +#include "LotSizeCalculator.mqh" + + +// TRADE RELATED CLASSES INCLUDES +#include "BuyEntryManager.mqh" +#include "SellEntryManager.mqh" +#include "BuyTradeManager.mqh" +#include "SellTradeManager.mqh" + +// LIBRARIES INCLUDES +#include + +// Telegram Connection include +#include + +// SCRIPTS INCLUDES + + + + +// GUI CLASSES INITIALIZATION +GraphicalObjectsManager* objectsManager = new GraphicalObjectsManager(); +ObjectConfirmationUnit* objectConfUnit = new ObjectConfirmationUnit(); +TempObjectAttributes* tempObjectAttr = new TempObjectAttributes(); +TempLineObjectAttributes* tempLineObjectAttr = new TempLineObjectAttributes(); + + +// CONTAINERS INITIALIZATION +ZoneContainer* zoneContainer = new ZoneContainer() ; +//LowFractalContainer* lowsContainer = new LowFractalContainer(inputTimeFrameFractals) ; + +//HighFractalContainer* highsContainer = new HighFractalContainer(inputTimeFrameFractals) ; + + +// ALGORITHM CLASSES INITIALIZATION +MarketObserver* marketObserver = new MarketObserver(zoneContainer); +LotSizeCalculator lotSizeCalculator ; + + + +// GENERAL CHART VARIABLES INITIALIZATION +bool initialized = false ; +bool firstCandleAfterStart = true ; + + +// ENTRY VARIABLES +string entryZoneType ; +bool lookForBuy = false ; +bool lookForSell = false ; + + +// LIVE FORMING FRACTALS HANDLER CLASS +NewCandleDetector* newCandleDetectorLive ; + + +// NEW CANDLE CLASSES INITIALIZATION +NewCandleDetector* newCandleDetector_H4; +NewCandleDetector* newCandleDetector_H1; +NewCandleDetector* newCandleDetector_M30; +NewCandleDetector* newCandleDetector_M15; +NewCandleDetector* newCandleDetector_M5; +NewCandleDetector* newCandleDetector_M1; + + + +// Trade MANAGING VARIABLES +bool priceInMiddle = true ; +bool buyOnWait = false ; +bool buyOnAction = false; +bool sellOnWait = false; +bool sellOnAction = false ; + +bool telegramTested = false ; +input bool testTelegram ; +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- create timer + EventSetTimer(60); +// Added because bmp files seem to have stopped working, possibly a file format issue +//fileType = "png"; +//fileName = "MyScreenshot." + fileType; + + + if(telegramTested == false && testTelegram == true) + { + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"This is just a test ! " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + telegramTested = true ; + } + + +// THIS IS FOR SETTING THE NEW CANDLE DETECTOR TIMEFRAME FOR THE LIVE FRACTALS . (IN ORDER TO KNOW WHICH TIMEFRAME OF THE LIVE FRACTALS TO TAKE) + + + + + + /* if(inputTimeFrameFractals == PERIOD_M1) + { + + newCandleDetectorLive = new NewCandleDetector("PERIOD_M1"); + + } + else + if(inputTimeFrameFractals == PERIOD_M5) + { + + newCandleDetectorLive = new NewCandleDetector("PERIOD_M5"); + } + else + if(inputTimeFrameFractals == PERIOD_M15) + { + newCandleDetectorLive = new NewCandleDetector("PERIOD_M15"); + + } + else + if(inputTimeFrameFractals == PERIOD_M30) + { + + newCandleDetectorLive = new NewCandleDetector("PERIOD_M30"); + } + else + if(inputTimeFrameFractals == PERIOD_H1) + { + newCandleDetectorLive = new NewCandleDetector("PERIOD_H1"); + + } + else + if(inputTimeFrameFractals == PERIOD_H4) + { + newCandleDetectorLive = new NewCandleDetector("PERIOD_H4"); + + } + else + if(inputTimeFrameFractals == PERIOD_D1) + { + newCandleDetectorLive = new NewCandleDetector("PERIOD_D1"); + + } */ + + + if(initialized == false) + { + Print("Shark Initialized successfully on " + Symbol()); + + // ADD THE BUTTONS TO THE SCREEN + objectsManager.addZoneButton(); + objectsManager.addConfirmButton(); + objectsManager.addDeleteButton(); + objectsManager.addExitExperAdvisorButton(); + objectsManager.addPrintFractalsButton(); + objectsManager.addPrintZonesButton(); + objectsManager.addStopLossButton(); + objectsManager.addTakeProfitButton(); + objectsManager.addSetTakeProfitButton(); + + // INIT FRACTAL VARIABLES + + //lowFractalIndex = rightPeriod+1 ; // this is used for the fractals + //highFractalIndex = rightPeriod+1; // this is used for the fractals + //initLowFractalsFromIndex(initFractalsPeriod,inputTimeFrameFractals); + //initHighFractalsFromIndex(initFractalsPeriod,inputTimeFrameFractals); + + // INITIALIZATION FLAG + + + newCandleDetector_H4 = new NewCandleDetector("PERIOD_H4"); + newCandleDetector_H1 = new NewCandleDetector("PERIOD_H1"); + newCandleDetector_M30 = new NewCandleDetector("PERIOD_M30"); + newCandleDetector_M15 = new NewCandleDetector("PERIOD_M15"); + newCandleDetector_M5 = new NewCandleDetector("PERIOD_M5"); + newCandleDetector_M1 = new NewCandleDetector("PERIOD_M1"); + + initialized = true ; + + + } + + + + +//--- + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- destroy timer + /*Print("Low Fractals:"); + lowsContainer.printLowFractals(); + Print(" "); + Print("High Fractals:"); + highsContainer.printhighFractals(); + Print(" "); */ + + + + + + + + + + EventKillTimer(); + + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { + + + if(!IsTradeAllowed()) + { + + return ; + } + + if(!IsMarketOpen2(Symbol(),TimeCurrent())) + { + + return ; + } + + + + if((marketObserver.getClosestResistanceZone() != NULL) && (marketObserver.getClosestResistanceZone().sellEntryManager.sellTradeTaken())) + { + marketObserver.getClosestResistanceZone().sellTradeManager.checkAndSecureTradeIfNeeded(firstSecureRatio,riskDollars); + } + + if((marketObserver.getClosestSupportZone() != NULL) && (marketObserver.getClosestSupportZone().buyEntryManager.buyTradeTaken())) + { + marketObserver.getClosestSupportZone().buyTradeManager.checkAndSecureTradeIfNeeded(firstSecureRatio,riskDollars); + } + + + + + /*if(newCandleDetector_M1.isNewCandle()) + { + + + handleBuys(PERIOD_M1); + handleSells(PERIOD_M1); + }*/ + + + if(REJECTION_M1_ONLY == true) + { + if(newCandleDetector_M1.isNewCandle()) + { + + /* ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"this is just a test " + _Symbol + " " + TimeToString(TimeLocal()), fileName); */ + Print("Im in new candle !"); + handleBuys(PERIOD_M1); + handleSells(PERIOD_M1); + } + } + else + { + + if(newCandleDetector_H1.isNewCandle()) + { + + /* ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"this is just a test " + _Symbol + " " + TimeToString(TimeLocal()), fileName); */ + handleBuys(PERIOD_H1); + handleSells(PERIOD_H1); + } + + } + } + + + +//+------------------------------------------------------------------+ +//| Timer function | +//+------------------------------------------------------------------+ +void OnTimer() + { +//--- + + } +//+------------------------------------------------------------------+ +//| Trade function | +//+------------------------------------------------------------------+ +void OnTrade() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TradeTransaction function | +//+------------------------------------------------------------------+ +void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) + { +//--- + + } +//+------------------------------------------------------------------+ +//| Tester function | +//+------------------------------------------------------------------+ +double OnTester() + { +//--- + double ret=0.0; +//--- + +//--- + return(ret); + } +//+------------------------------------------------------------------+ +//| TesterInit function | +//+------------------------------------------------------------------+ +void OnTesterInit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterPass function | +//+------------------------------------------------------------------+ +void OnTesterPass() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterDeinit function | +//+------------------------------------------------------------------+ +void OnTesterDeinit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| ChartEvent function | +//+------------------------------------------------------------------+ +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) + { +//--- +//--- left-clicking on a chart + + switch(id) + { + + case CHARTEVENT_CLICK: + { + + break; + } + + + + + //--- clicking on a graphical object + case CHARTEVENT_OBJECT_CLICK: + { + if(sparam == "ZONE_ADD_BTN") + { + + if(objectConfUnit.getWaitingStatus() == false) // THIS IS TO MAKE SURE THERE IS NO OTHER OBJECT SELECTED + { + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getZonesIdCounter(); + objectsManager.drawRectangle(currentIdCounter); // create a rectangle . set its name to be the current zonesIdCounter (and that would be the id of this current zone ) + objectConfUnit.setWaitingStatus(true); + objectConfUnit.setObjectType("OBJ_RECTANGLE"); + objectConfUnit.setConfirmationObjectId(currentIdCounter); + zoneContainer.incrementZonesIdCounter(); + + + + } + else + { + + Print("Failed to Add a new Object, Make sure to confirm the previous object first! ."); + } + + + + } + + else + if(sparam == "ADD_SL_BTN") + { + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THAT THERE IS A ZONE SELECTED TO ADD STOP LOSS TO + { + + if(objectConfUnit.getObjectType() != "OBJ_RECTANGLE") + { + Print("Please select a zone object only !"); + } + else + { + + objectsManager.drawStopLossLine(objectConfUnit.getConfirmationObjectId()); + } + + } + else + { + + Print("Please select a zone in order to add a stop loss line !"); + } + + + } + else + if(sparam == "ADD_TP_BTN") + { + + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THAT THERE IS A ZONE SELECTED TO ADD STOP LOSS TO + { + + if(objectConfUnit.getObjectType() != "OBJ_RECTANGLE") + { + Print("Please select a zone object only !"); + } + else + { + + objectsManager.drawTakeProfitLine(objectConfUnit.getConfirmationObjectId()); + } + + } + else + { + + Print("Please select a zone in order to add a stop loss line !"); + } + + } + else + if(sparam == "CONFIRM_BTN") + { + + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THAT THERE IS SOMETHING SELECTED TO BE CONFIRMED + { + + + if(objectConfUnit.getObjectType() == "OBJ_RECTANGLE") // CASE OF ZONE + { + + if(zoneContainer.getZoneIndex(objectConfUnit.getConfirmationObjectId()) != -1) // means the zone already in the data structure, in this case we just need to update it + { + + // update the zone attributes + // zoneContainer.UpdateZone(int id); + Zone* tempZone = new Zone(); + + + + tempZone.setHigherEdgePrice(tempObjectAttr.getHigherEdgePrice()) ; + tempZone.setLowerEdgePrice(tempObjectAttr.getLowerEdgePrice()); + tempZone.setLeftEdge(tempObjectAttr.getLeftEdgeTime()); + tempZone.setRightEdge(tempObjectAttr.getRightEdgeTime()); + tempZone.setTimeFrame(tempObjectAttr.getTimeFrame()); + + string idOfOriginalZone = objectConfUnit.getConfirmationObjectId(); + // no need to set the ID here because the ID belongs to the original zone and not this new temp one (this is just a temporary zone to check if the adjustment is valid or no) + + if(zoneContainer.updateZone(tempZone, idOfOriginalZone) ==1) + { + // in this case we successfully updated the zone + + Print("Updated the object:" + + "\n ID: " + objectConfUnit.getConfirmationObjectId() + + "\n Type: " + objectConfUnit.getObjectType() + + "\n Asset: " + tempObjectAttr.getSymbol() + + "\n Time Frame:" + tempObjectAttr.getTimeFrame() + + "\n Higher Edge Price: " + tempObjectAttr.getHigherEdgePrice() + + "\n Lower Edge Price: " + tempObjectAttr.getLowerEdgePrice() + + "\n Left Edge Date: " + tempObjectAttr.getLeftEdgeTime() + + "\n Right Edge Date: " + tempObjectAttr.getRightEdgeTime() + ); + + delete tempZone; + if(ObjectSetInteger(_Symbol,objectConfUnit.getConfirmationObjectId(),OBJPROP_SELECTED,false) == true) // this is to unselect the object once we finish using it + { + } + else + { + Print("Failed to unselect the object. Error: " + GetLastError()); + } + + // THIS IS TO CLEAN THE objectConfUnit + objectConfUnit.setWaitingStatus(false); + ChartRedraw(); + } + else + { + + Print("Failed to update the zone, please reposition it"); + } + + } + + else // means the zone is new so we need to add it + { + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(tempObjectAttr.getHigherEdgePrice()); + newZone.setLowerEdgePrice(tempObjectAttr.getLowerEdgePrice()); + newZone.setLeftEdge(tempObjectAttr.getLeftEdgeTime()); + newZone.setRightEdge(tempObjectAttr.getRightEdgeTime()); + newZone.setId(objectConfUnit.getConfirmationObjectId()); + newZone.setTimeFrame(tempObjectAttr.getTimeFrame()); + + + double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK) ; + double higherEdge = tempObjectAttr.getHigherEdgePrice(); + + Print("higher edge is: " + higherEdge + " ask is: " + ask); + if(tempObjectAttr.getHigherEdgePrice() < ask) // means its a support zone + { + newZone.setType("TYPE_SUPPORT"); + } + + + double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + double lowerEdge = tempObjectAttr.getLowerEdgePrice(); + Print("lower edge is: "+lowerEdge + " bidd i: " + bid); + if(tempObjectAttr.getLowerEdgePrice() > bid) // means its a resistance zone + { + + newZone.setType("TYPE_RESISTANCE"); + } + // add the zone to the data structure + if(zoneContainer.addZone(newZone) == 1) + { + zoneContainer.findOrUpdatePivotEdgesOnConfirm(ask,bid); // update the pivot edges + Print("Added the object:" + + "\n ID: " + objectConfUnit.getConfirmationObjectId() + + "\n Type: " + objectConfUnit.getObjectType() + + "\n Asset: " + tempObjectAttr.getSymbol() + + "\n Time Frame:" + tempObjectAttr.getTimeFrame() + + "\n Higher Edge Price: " + tempObjectAttr.getHigherEdgePrice() + + "\n Lower Edge Price: " + tempObjectAttr.getLowerEdgePrice() + + "\n Left Edge Date: " + tempObjectAttr.getLeftEdgeTime() + + "\n Right Edge Date: " + tempObjectAttr.getRightEdgeTime() + ); + + + + if(ObjectSetInteger(_Symbol,objectConfUnit.getConfirmationObjectId(),OBJPROP_SELECTED,false) == true) // this is to unselect the object once we finish using it + { + } + else + { + Print("Failed to unselect the object. Error: " + GetLastError()); + } + + // THIS IS TO CLEAN THE objectConfUnit + objectConfUnit.setWaitingStatus(false); + } + else + { + Print("Failed to add the zone, Error: 2 or more zones are crossing"); + } + + ChartRedraw(); + } + + + + + + } + + else + if(objectConfUnit.getObjectType() == "OBJ_TRENDLINE") // CASE OF TRENDLINE + { + + + + + } + else + if(objectConfUnit.getObjectType() == "OBJ_HLINE") // CASE OF HORIZNOTAL LINE + { + + if(StringSubstr(tempLineObjectAttr.getId(),0,2) == "sl") + { + + zoneContainer.searchZoneById(StringSubstr(tempLineObjectAttr.getId(),2,-1)).setStopLossPrice(tempLineObjectAttr.getPrice()); + Print("Stop loss for zone: " + StringSubstr(tempLineObjectAttr.getId(),2,-1) + " has been set at: " + tempLineObjectAttr.getPrice()); + if(ObjectDelete(_Symbol,tempLineObjectAttr.getId())) + { + + } + else + { + Print("Failed to delete the stop loss line ! Error: "+ GetLastError()); + } + + // THIS IS TO CLEAN THE objectConfUnit + objectConfUnit.setWaitingStatus(false); + + ChartRedraw(); + } + else + if(StringSubstr(tempLineObjectAttr.getId(),0,2) == "tp") + { + + + if(ObjectDelete(_Symbol,tempLineObjectAttr.getId())) + { + + } + else + { + Print("Failed to delete the stop loss line ! Error: "+ GetLastError()); + } + + // THIS IS TO CLEAN THE objectConfUnit + objectConfUnit.setWaitingStatus(false); + ChartRedraw(); + } + else + if(StringSubstr(tempLineObjectAttr.getId(),0,2) == "rl") + { + + Print("Relational level line for zone: " + StringSubstr(tempLineObjectAttr.getId(),2,-1) + " has been set at: " + tempLineObjectAttr.getPrice()); + ChartRedraw(); + + } + else + if(StringSubstr(tempLineObjectAttr.getId(),0,2) == "dl") + { + + Print("Daily indecision line for zone: " + StringSubstr(tempLineObjectAttr.getId(),2,-1) + " has been set at: " + tempLineObjectAttr.getPrice()); + ChartRedraw(); + + } + else + if(StringSubstr(tempLineObjectAttr.getId(),0,3) == "bos") + { + + Print("Break of structure line for zone: " + StringSubstr(tempLineObjectAttr.getId(),3,-1) + " has been set at: " + tempLineObjectAttr.getPrice()); + ChartRedraw(); + + } + + } + + + + } + else + { + + Print("Cannot confirm, Please select an object first !"); + } + + } + + else + if(sparam == "DELETE_BTN") + { + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THAT THERE IS SOMETHING SELECTED TO BE DELETED + { + if(ObjectDelete(_Symbol,objectConfUnit.getConfirmationObjectId())) + { + if(zoneContainer.deleteZone(objectConfUnit.getConfirmationObjectId()) == 1) + { + // delete from data structure + zoneContainer.findOrUpdatePivotEdgesOnDelete(); + Print("Deleted the object: " + + "\n Type: " + objectConfUnit.getObjectType() + + "\n ID: " + objectConfUnit.getConfirmationObjectId()); + + objectConfUnit.setWaitingStatus(false); + objectConfUnit.setObjectType("NO_OBJECT"); + objectConfUnit.setConfirmationObjectId(-2); + + ChartRedraw(); + } + else + { + objectConfUnit.setWaitingStatus(false); + objectConfUnit.setObjectType("NO_OBJECT"); + objectConfUnit.setConfirmationObjectId(-2); + } + } + + } + else + { + + Print("Cannot delete, Please select an object first !"); + } + + } + else + if(sparam == "EXIT_BTN") + { + delete objectsManager ; + delete objectConfUnit; + delete tempObjectAttr; + //delete lowsContainer; + //delete highsContainer; + + delete newCandleDetectorLive; + delete tempLineObjectAttr; + delete marketObserver; + + + zoneContainer.freeZonesSortedArray(); + delete zoneContainer ; + + delete newCandleDetector_H4; + delete newCandleDetector_H1; + delete newCandleDetector_M30; + delete newCandleDetector_M15; + delete newCandleDetector_M5 ; + delete newCandleDetector_M1; + + + + + + + ExpertRemove(); + } + else + if(sparam == "PRINT_FRACTAL_BTN") + { + Print("Low Fractals:"); + //lowsContainer.printLowFractals(); + Print("High Fractals:"); + //highsContainer.printHighFractals(); + } + + else + if(sparam == "PRINT_ZONES_BTN") + { + + zoneContainer.printZonesSortedArray(); + } + + else + if(sparam == "SET_TP_BTN") + { + if(objectConfUnit.getObjectType() != "OBJ_HLINE") + { + Print("Please select a TP line first !"); + + } + else + { + if(zoneContainer.searchZoneById(StringSubstr(tempLineObjectAttr.getId(),2,-1)).setTakeProfit(tempLineObjectAttr.getPrice())) + { + Print("TP for zone: " + StringSubstr(tempLineObjectAttr.getId(),2,-1) + " has been set at: " + tempLineObjectAttr.getPrice()); + } + else + { + Print("You have reached the max take profit lines !"); + } + + } + + + } + else // THIS is the case were we click on any object except for main Buttons on screen + { + + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THERE IS NO OTHER OBJECT SELECTED + { + Print("Cannot select the object clicked, Make sure to confirm a previous selected object first !"); + } + + + else + { + ObjectSetInteger(_Symbol,sparam,OBJPROP_SELECTED,true); + + if(ObjectGetInteger(_Symbol,sparam,OBJPROP_TYPE,0) == OBJ_RECTANGLE) // CASE OF SELECTING A RECTANGLE + { + Print("Selected the object:" + + "\n Type: OBJ_RECTANGLE" + + "\n ID: " + sparam); + objectConfUnit.setWaitingStatus(true) ; + objectConfUnit.setConfirmationObjectId(StringToInteger(sparam)); + objectConfUnit.setObjectType("OBJ_RECTANGLE"); + + double _higherEdgePrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,1); + double _lowerEdgePrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0); + datetime _leftEdgeTime = (datetime)ObjectGetInteger(_Symbol,sparam,OBJPROP_TIME,0); + datetime _rightEdgeTime = (datetime)ObjectGetInteger(_Symbol,sparam,OBJPROP_TIME,1); + + if(_higherEdgePrice < _lowerEdgePrice) // this is the case were the user flips the rectangle while adjusting it. + { + tempObjectAttr.setHigherEdgePrice(_lowerEdgePrice); + tempObjectAttr.setLowerEdgePrice(_higherEdgePrice); + } + else + { + tempObjectAttr.setHigherEdgePrice(_higherEdgePrice); + tempObjectAttr.setLowerEdgePrice(_lowerEdgePrice); + } + + + + + + tempObjectAttr.setLeftEdgeTime(_leftEdgeTime); + tempObjectAttr.setRightEdgeTime(_rightEdgeTime); + tempObjectAttr.setSymbol(); + tempObjectAttr.setTimeFrame(getChartTimeFrameInString()); + ChartRedraw(); + } + + + else + if(ObjectGetInteger(_Symbol,sparam,OBJPROP_TYPE,0) == OBJ_HLINE) // CASE OF SELECTING A HORIZONTAL LINE + { + + objectConfUnit.setWaitingStatus(true) ; + objectConfUnit.setConfirmationObjectId(StringToInteger(sparam)); + objectConfUnit.setObjectType("OBJ_HLINE"); + + //tempLineObjectAttr.setId(sparam); + //tempLineObjectAttr.setPrice( ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0)); + ChartRedraw(); + } + + + + + + } + + } + + + break; + } + + + //--- object moved or anchor point coordinates changed + case CHARTEVENT_OBJECT_DRAG: + { + + if(ObjectGetInteger(_Symbol,sparam,OBJPROP_TYPE,0) == OBJ_RECTANGLE) + { + + + double _higherEdgePrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,1); + double _lowerEdgePrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0); + + datetime _leftEdgeTime = (datetime)ObjectGetInteger(_Symbol,sparam,OBJPROP_TIME,0); + datetime _rightEdgeTime = (datetime)ObjectGetInteger(_Symbol,sparam,OBJPROP_TIME,1); + + if(_higherEdgePrice < _lowerEdgePrice) // this is the case were the user flips the rectangle while adjusting it. + { + tempObjectAttr.setHigherEdgePrice(_lowerEdgePrice); + tempObjectAttr.setLowerEdgePrice(_higherEdgePrice); + } + else + { + tempObjectAttr.setHigherEdgePrice(_higherEdgePrice); + tempObjectAttr.setLowerEdgePrice(_lowerEdgePrice); + } + + tempObjectAttr.setLeftEdgeTime(_leftEdgeTime); + tempObjectAttr.setRightEdgeTime(_rightEdgeTime); + tempObjectAttr.setSymbol(); + tempObjectAttr.setTimeFrame(getChartTimeFrameInString()); + break; + } + + else + if(ObjectGetInteger(_Symbol,sparam,OBJPROP_TYPE,0) == OBJ_HLINE) + { + + if(StringSubstr(sparam,0,2) == "sl") // case of sl line (attached to a zone) + { + double stopLossPrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0); + tempLineObjectAttr.setId(sparam); + tempLineObjectAttr.setPrice(stopLossPrice); + } + else + if(StringSubstr(sparam,0,2) == "tp") // case of tp line (attached to a zone) + { + double takeProfitPrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0); + tempLineObjectAttr.setId(sparam); + tempLineObjectAttr.setPrice(takeProfitPrice); + } + else + if(StringSubstr(sparam,0,2) == "rl") // case of relational point line (attached to a zone) + { + Print("dragging a relational point line"); + } + else + if(StringSubstr(sparam,0,2) == "dl") // case of daily line + { + Print("dragging a daily line"); + } + else + if(StringSubstr(sparam,0,3) == "bos") // case of break of structure line + { + Print("dragging a break of structure line"); + } + + } + } + } + + } + + +//+------------------------------------------------------------------+ +//| BookEvent function | +//+------------------------------------------------------------------+ +void OnBookEvent(const string &symbol) + { +//--- + + } +//+------------------------------------------------------------------+ + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + + +/*void initLowFractalsFromIndex(int _index,ENUM_TIMEFRAMES timeFramePeriod) + { + + for(int i=_index ; i> rightPeriod ; i--) + { + + bool accessDeniedLows = false ; // variable for dealing with equal consecutive fractals + + + + if(isLowFractalByIndex(i,leftPeriod,rightPeriod,timeFramePeriod) == true) + { + + if(lowsContainer.getFreeIndex() > 0) + { + + if(iLow(Symbol(),timeFramePeriod,i) == lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getPrice()) // if low fractal is equal to the previous low fractal + { + if(lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getDistance() - i < 2*rightPeriod) // if the 2 lows are inside the range of 2 times of right period + { + accessDeniedLows = true ; + } + + } + } + + if(accessDeniedLows == false) + { + + + LowFractal* currentFractal = new LowFractal(iLow(Symbol(),timeFramePeriod,i),leftPeriod,rightPeriod,TimeCurrent(),timeFramePeriod); + currentFractal.setDate(iTime(Symbol(),timeFramePeriod,i)); + currentFractal.setDistance(i); + int NumberOfCandle = i-1; + string NumberOfCandleText = IntegerToString(NumberOfCandle); + currentFractal.setArrowObjName(NumberOfCandleText); + lowsContainer.addLowFractal(currentFractal); + + } + + + } + + } + + + } */ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + +/*void initHighFractalsFromIndex(int _index,ENUM_TIMEFRAMES timeFramePeriod) + { + + for(int i=_index ; i> rightPeriod ; i--) + { + + bool accessDeniedHighs = false ; // variable for dealing with equal consecutive fractals + + + + if(isHighFractalByIndex(i,leftPeriod,rightPeriod,timeFramePeriod) == true) + { + + if(highsContainer.getFreeIndex() > 0) + { + + if(iHigh(Symbol(),timeFramePeriod,i) == highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getPrice()) // if high fractal is equal to the previous high fractal + { + + if(highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getDistance() - i < 2*rightPeriod) // if the 2 highs are inside the range of 2 times of right period + { + + accessDeniedHighs = true ; + } + + } + } + + if(accessDeniedHighs == false) + { + + + HighFractal* currentFractal = new HighFractal(iHigh(Symbol(),timeFramePeriod,i),leftPeriod,rightPeriod,TimeCurrent(),timeFramePeriod); + currentFractal.setDate(iTime(Symbol(),timeFramePeriod,i)); + currentFractal.setDistance(i); + int NumberOfCandle = i-1; + string NumberOfCandleText = IntegerToString(NumberOfCandle); + currentFractal.setArrowObjName(NumberOfCandleText); + highsContainer.addHighFractal(currentFractal); + + } + + + } + + } + + } */ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + + +/*void handleLowFractals(ENUM_TIMEFRAMES tf) + { + + bool accessDeniedLows = false ; // variable for dealing with equal consecutive fractals if its true, then the current fractal will not be added + + for(int x=0 ; x 0) + { + + if(iLow(Symbol(),tf,lowFractalIndex) == lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getPrice()) // if low fractal is equal to the previous low fractal + { + + if(lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getDistance() <= 2*rightPeriod) // if the 2 lows are inside the range of 2 times of right period + { + + accessDeniedLows = true ; + } + + } + } + + if(accessDeniedLows == false) + { + + LowFractal* currentFractal = new LowFractal(iLow(Symbol(),tf,lowFractalIndex),leftPeriod,rightPeriod,TimeCurrent(),tf); + + int NumberOfCandle = Bars(Symbol(),tf); + string NumberOfCandleText = IntegerToString(NumberOfCandle); + currentFractal.setArrowObjName(NumberOfCandleText); + lowsContainer.addLowFractal(currentFractal); + Print("added a new low fractal !"); + + } + + + } + + } */ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + + +/*void handleHighFractals(ENUM_TIMEFRAMES tf) + { + + + bool accessDeniedHighs = false ; // variable for dealing with equal consecutive fractals + + for(int x=0 ; x 0) + { + + if(iHigh(Symbol(),tf,highFractalIndex) == highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getPrice()) // if high fractal is equal to the previous high fractal + { + if(highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getDistance() <= 2*rightPeriod) // if the 2 highs are inside the range of 2 times of right period + { + accessDeniedHighs = true ; + } + + } + } + + if(accessDeniedHighs == false) + { + + + HighFractal* currentFractal = new HighFractal(iHigh(Symbol(),tf,highFractalIndex),leftPeriod,rightPeriod,TimeCurrent(),tf); + + int NumberOfCandle = Bars(Symbol(),tf); + string NumberOfCandleText = IntegerToString(NumberOfCandle); + currentFractal.setArrowObjName(NumberOfCandleText); + highsContainer.addHighFractal(currentFractal); + Print("added a new high fractal !"); + } + + + } + + + } */ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +string MarketTest(string symbol, datetime testTime) + { + + return symbol + " " + TimeToString(testTime, TIME_DATE|TIME_MINUTES|TIME_SECONDS) + " " + IsMarketOpen(symbol, testTime) + " " + IsMarketOpen2(symbol, testTime); + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool IsTradeAllowed() + { + + return ((bool)MQLInfoInteger(MQL_TRADE_ALLOWED) // Trading allowed in input dialog + && (bool)TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) // Trading allowed in terminal + && (bool)AccountInfoInteger(ACCOUNT_TRADE_ALLOWED) // Is account able to trade, not locked out + && (bool)AccountInfoInteger(ACCOUNT_TRADE_EXPERT) // Is account able to auto trade + ); + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool IsMarketOpen(string symbol, datetime time) + { + + MqlDateTime mtime; + TimeToStruct(time, mtime); + datetime seconds = mtime.hour*3600+mtime.min*60+mtime.sec; + + datetime fromTime; + datetime toTime; + + for(int session = 0;; session++) + { + if(!SymbolInfoSessionTrade(symbol, (ENUM_DAY_OF_WEEK)mtime.day_of_week, session, fromTime, toTime)) + return false; + if(fromTime<=seconds && seconds<=toTime) + return true; + } + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool IsMarketOpen2(string symbol, datetime time) + { + + static string lastSymbol = ""; + static bool isOpen = false; + static datetime sessionStart = 0; + static datetime sessionEnd = 0; + + if(lastSymbol==symbol && sessionEnd>sessionStart) + { + if((isOpen && time>=sessionStart && time<=sessionEnd) + || (!isOpen && time>sessionStart && timetoTime) // maybe a later session + { + sessionStart = dayStart + toTime; + continue; + } + + // at this point must be inside a session + sessionStart = dayStart + fromTime; + sessionEnd = dayStart + toTime; + isOpen = true; + return isOpen; + + } + + return false; + + } +//+------------------------------------------------------------------+ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void deleteZoneWithGUI(string _id) + { + + + if(zoneContainer.deleteZone(_id) == 1) + { + // delete from data structure + zoneContainer.findOrUpdatePivotEdgesOnDelete(); + Print("Deleted the object: " + + + "\n ID: " + _id); + + ChartRedraw(); + } + else + { + + } + + + if(!ObjectDelete(_Symbol,_id)) + { + Print("Failed to delete object error: " + GetLastError()); + } + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +void handleBuys(ENUM_TIMEFRAMES _timeFrame) + { + +// BUY CASE + + if((marketObserver.getClosestSupportZone() != NULL) && !(marketObserver.getClosestSupportZone().buyEntryManager.isWaitingForRejectionCandle()) && !(marketObserver.getClosestSupportZone().buyEntryManager.buyTradeTaken()) && !(marketObserver.getClosestSupportZone().buyEntryManager.isWaitingForRetracement())) // FIRST CASE : PRICE IS IN THE MIDDLE + { + if(marketObserver.bearishCandleClosedInsideClosestSupportZone(_timeFrame)) + { + Print("Bearish Candle closed inside closest support zone !"); + marketObserver.getClosestSupportZone().buyEntryManager.setWaitingForRejectionCandle(true); + + } + + } + + else + if((marketObserver.getClosestSupportZone() != NULL) && (marketObserver.getClosestSupportZone().buyEntryManager.isWaitingForRejectionCandle()) && !(marketObserver.getClosestSupportZone().buyEntryManager.buyTradeTaken())) // SECOND CASE : PRICE HAS CLOSED IN THE ZONE AND WAITING FOR REJECTION, AND THE TRADE HAS NOT BEEN TAKEN YET + { + if(marketObserver.getClosestSupportZone().buyEntryManager.buyRejectionDetector.rejectionByOneCandleFormed(_timeFrame)) + { + + + marketObserver.getClosestSupportZone().buyEntryManager.setWaitingForRejectionCandle(false); + double lastBullishCandleClosePrice = iClose(_Symbol,_timeFrame,1); + // let the market observer check where the rejection candle closed, was it inside the zone ? or outside ? if outside the zone was it too close to the zone? if too + + if(lastBullishCandleClosePrice > marketObserver.getClosestSupportZone().getHigherEdge()) // closed above the zone + { + + // now we need to check if closed twice as the zone height + + + if(lastBullishCandleClosePrice - marketObserver.getClosestSupportZone().getHigherEdge() > marketObserver.getClosestSupportZone().getZoneHeight()) + { + Print("Bullish rejection candle was formed, Price closed above the zone in a distance more than the height of the zone, in these cases i take an entry on imbalance fill or a retracement but at the moment im not trading these cases , Symbol: " + _Symbol); + + marketObserver.getClosestSupportZone().buyEntryManager.setWaitingForRetracement(true); + } + else + { + + Print(" Bullish rejection candle was formed, Price Closed above the zone in a distance less than the height of the zone, im taking a buy now ! , Symbol: " + _Symbol); + + double stopLossPrice = marketObserver.getClosestSupportZone().getStopLossPrice(); + double lotsToTrade = lotSizeCalculator.calculateLotSize(riskDollars,stopLossPrice); + for(int i=0 ; i<3 ; i++) // after this loop, the trade id's array will be filled, and the 3 trades will be taken + { + double partialLotPercent ; + if(i == 0) + { + partialLotPercent = 0.5 ; + } + if(i == 1 || i == 2) + { + partialLotPercent = 0.25; + } + ulong currentEntryId = marketObserver.getClosestSupportZone().buyEntryManager.takeBuyTrade(partialLotPercent * lotsToTrade,stopLossPrice); + marketObserver.getClosestSupportZone().buyTradeManager.fillRejectionByOneCandleTradeArray(i,currentEntryId); + } + marketObserver.getClosestSupportZone().buyEntryManager.setTradeTakenStatus(true); + } + + } + else + if(lastBullishCandleClosePrice < marketObserver.getClosestSupportZone().getHigherEdge() && lastBullishCandleClosePrice > marketObserver.getClosestSupportZone().getLowerEdge()) // closed inside the zone + { + + Print("Bullish Rejection Candle Closed inside the zone, im taking a buy now !, Symbol: " + _Symbol); + double stopLossPrice = marketObserver.getClosestSupportZone().getStopLossPrice(); + double lotsToTrade = lotSizeCalculator.calculateLotSize(riskDollars,stopLossPrice); + for(int i=0 ; i<3 ; i++) // after this loop, the trade id's array will be filled, and the 3 trades will be taken + { + double partialLotPercent ; + if(i == 0) + { + partialLotPercent = 0.5 ; + } + if(i == 1 || i == 2) + { + partialLotPercent = 0.25; + } + ulong currentEntryId = marketObserver.getClosestSupportZone().buyEntryManager.takeBuyTrade(partialLotPercent * lotsToTrade,stopLossPrice); + marketObserver.getClosestSupportZone().buyTradeManager.fillRejectionByOneCandleTradeArray(i,currentEntryId); + } + marketObserver.getClosestSupportZone().buyEntryManager.setTradeTakenStatus(true); + } + + // call trade manager + } + } + + else + if((marketObserver.getClosestSupportZone() != NULL) && (marketObserver.getClosestSupportZone().buyEntryManager.isWaitingForRetracement())) // THIRD CASE: WAITING FOR A RETRACEMENT BECAUSE THE REJECTION CANDLE CLOSED MORE THAN THE HEIGHT OF THE ZONE + { + + Print("Im waiting for retracement because the rejection candle closed more than the height of the zone, ** this messaage is just for testing, because i still do not take trades on these kind of setups **"); + + } + + if((marketObserver.getClosestSupportZone() != NULL) && marketObserver.candleClosedBelowClosestSupportZone(_timeFrame) && !(marketObserver.getClosestSupportZone().buyEntryManager.buyTradeTaken())) // FOURTH CASE: PRICE CLOSED UNDER THE ZONE, AND THE BUY IS STILL NOT TAKEN , SO WE DONT WANT TO ENTER + { + + Print("A candle closed below the support zone, the trade is still not taken and im not gonna take it, Symbol: " + _Symbol); + string _idToDelete = marketObserver.getClosestSupportZone().getId(); + deleteZoneWithGUI(_idToDelete); + + } + else + if((marketObserver.getClosestSupportZone() != NULL) && marketObserver.candleClosedBelowClosestSupportZone(_timeFrame) && (marketObserver.getClosestSupportZone().buyEntryManager.buyTradeTaken())) // FIFTH CASE: PRICE CLOSED UNDER THE ZONE, AND THE BUY IS TAKEN , SO WE WANNA CLOSE THE ORDER + { + + Print("A candle closed below the support zone, i am in a buy trade and im gonna close the position and delete the zone, Symbol: " + _Symbol); + marketObserver.getClosestSupportZone().buyEntryManager.setTradeTakenStatus(false); + + // Make sure that the trades didnt hit the stop loss first + marketObserver.getClosestSupportZone().buyTradeManager.cleanOrderDataStructures(); + for(int i=0; i<3; i++) + { + marketObserver.getClosestSupportZone().buyTradeManager.closeTrade(i); + } + + string _idToDelete = marketObserver.getClosestSupportZone().getId(); + deleteZoneWithGUI(_idToDelete); + } + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void handleSells(ENUM_TIMEFRAMES _timeFrame) + { + + + + +// SELL CASE + + if((marketObserver.getClosestResistanceZone() != NULL) && !(marketObserver.getClosestResistanceZone().sellEntryManager.isWaitingForRejectionCandle()) && !(marketObserver.getClosestResistanceZone().sellEntryManager.sellTradeTaken()) && !(marketObserver.getClosestResistanceZone().sellEntryManager.isWaitingForRetracement())) // FIRST CASE : PRICE IS IN THE MIDDLE + { + if(marketObserver.bullishCandleClosedInsideClosestResistanceZone(_timeFrame)) + { + marketObserver.getClosestResistanceZone().sellEntryManager.setWaitingForRejectionCandle(true); + Print("Bullish candle closed inside the resistance zone on " + _Symbol); + + } + + } + + else + if((marketObserver.getClosestResistanceZone() != NULL) && (marketObserver.getClosestResistanceZone().sellEntryManager.isWaitingForRejectionCandle()) && !(marketObserver.getClosestResistanceZone().sellEntryManager.sellTradeTaken())) // SECOND CASE : PRICE HAS CLOSED IN THE ZONE AND WAITING FOR REJECTION, AND THE TRADE HAS NOT BEEN TAKEN YET + { + + if(marketObserver.getClosestResistanceZone().sellEntryManager.sellRejectionDetector.rejectionByOneCandleFormed(_timeFrame)) + { + + + marketObserver.getClosestResistanceZone().sellEntryManager.setWaitingForRejectionCandle(false); + // let the market observer check where the rejection candle closed, was it inside the zone ? or outside ? if outside the zone was it too close to the zone? if too + double lastBearishCandleClosePrice = iClose(_Symbol,_timeFrame,1); + if(lastBearishCandleClosePrice < marketObserver.getClosestResistanceZone().getLowerEdge()) // rejection candle closed under the zone + { + + // now we need to check if closed twice as the zone height + + if((marketObserver.getClosestResistanceZone().getLowerEdge() - lastBearishCandleClosePrice) > marketObserver.getClosestResistanceZone().getZoneHeight()) // rejection candle closed in a distance more than the height of the zone + { + + Print("Bearish rejection candle was formed, Price closed under the zone in a distance more than the height of the zone, in these cases i take an entry on imbalance fill or a retracement but at the moment im not trading these cases , Symbol: " + _Symbol); + marketObserver.getClosestResistanceZone().sellEntryManager.setWaitingForRetracement(true); + } + else // previous candle closed in a distance less than the height of the zone + { + Print("Bearish rejection candle was formed, Price closed under the zone in a distance less than the height of the zone, im taking a sell now , Symbol: " + _Symbol); + + double stopLossPrice = marketObserver.getClosestResistanceZone().getStopLossPrice(); + double lotsToTrade = lotSizeCalculator.calculateLotSize(riskDollars,stopLossPrice); + for(int i=0 ; i<3 ; i++) // after this loop, the trade id's array will be filled, and the 3 trades will be taken + { + double partialLotPercent ; + if(i == 0) + { + partialLotPercent = 0.5 ; + } + if(i == 1 || i == 2) + { + partialLotPercent = 0.25; + } + ulong currentEntryId = marketObserver.getClosestResistanceZone().sellEntryManager.takeSellTrade(partialLotPercent * lotsToTrade,stopLossPrice); + marketObserver.getClosestResistanceZone().sellTradeManager.fillRejectionByOneCandleTradeArray(i,currentEntryId); + } + marketObserver.getClosestResistanceZone().sellEntryManager.setTradeTakenStatus(true); + + + } + + } + else + if(lastBearishCandleClosePrice < marketObserver.getClosestResistanceZone().getHigherEdge() && lastBearishCandleClosePrice > marketObserver.getClosestResistanceZone().getLowerEdge()) // rejection candle closed inside the zone + { + + Print("Bearish Rejection Candle Closed inside the zone, im taking a sell now ! , Symbol: " + _Symbol); + double stopLossPrice = marketObserver.getClosestResistanceZone().getStopLossPrice(); + double lotsToTrade = lotSizeCalculator.calculateLotSize(riskDollars,stopLossPrice); + for(int i=0 ; i<3 ; i++) // after this loop, the trade id's array will be filled , and the 3 trades will be taken + { + double partialLotPercent ; + if(i == 0) + { + partialLotPercent = 0.5 ; + } + if(i == 1 || i == 2) + { + partialLotPercent = 0.25; + } + ulong currentEntryId = marketObserver.getClosestResistanceZone().sellEntryManager.takeSellTrade(partialLotPercent * lotsToTrade,stopLossPrice); + marketObserver.getClosestResistanceZone().sellTradeManager.fillRejectionByOneCandleTradeArray(i,currentEntryId); + } + marketObserver.getClosestResistanceZone().sellEntryManager.setTradeTakenStatus(true); + } + + // call trade manager + } + + } + + else + if((marketObserver.getClosestResistanceZone() != NULL) && marketObserver.getClosestResistanceZone().sellEntryManager.isWaitingForRetracement()) // THIRD CASE: WAITING FOR A RETRACEMENT BECAUSE THE REJECTION CANDLE CLOSED MORE THAN THE HEIGHT OF THE ZONE + { + + Print("Im waiting for retracement because the rejection candle closed more than the height of the zone, ** this messaage is just for testing, because i still do not take trades on these kind of setups **"); + + } + + + + + + if((marketObserver.getClosestResistanceZone() != NULL) && marketObserver.candleClosedAboveClosestResistanceZone(_timeFrame) && !(marketObserver.getClosestResistanceZone().sellEntryManager.sellTradeTaken())) // FOURTH CASE: PRICE CLOSED ABOVE THE ZONE, WE STILL HAVNT TOOK A TRADE, AND WE ARE NOT GONNA TAKE IT + { + + + + marketObserver.setClosestResistanceWaiting(true); + Print("A candle closed above the resistance zone i havnet took a trade, im gonna delete the zone , Symbol: " + _Symbol); + + string _idToDelete = marketObserver.getClosestResistanceZone().getId(); + deleteZoneWithGUI(_idToDelete); + + + } + else + if((marketObserver.getClosestResistanceZone() != NULL) && marketObserver.candleClosedAboveClosestResistanceZone(_timeFrame) && (marketObserver.getClosestResistanceZone().sellEntryManager.sellTradeTaken())) // FIFTH CASE: PRICE CLOSED ABOVE THE ZONE, WE TOOK THE TRADE, AND WE NEED TO CLOSE IT + { + marketObserver.setClosestResistanceWaiting(true); + + Print("A candle closed above the resistance zone im in a sell and im gonna close it, and delete the zone, Symbol: " + _Symbol); + marketObserver.getClosestResistanceZone().sellEntryManager.setTradeTakenStatus(false); + + // Make sure that the trades didnt hit the stop loss first + marketObserver.getClosestResistanceZone().sellTradeManager.cleanOrderDataStructures(); + for(int i=0; i<3; i++) + { + marketObserver.getClosestResistanceZone().sellTradeManager.closeTrade(i); + } + + string _idToDelete = marketObserver.getClosestResistanceZone().getId(); + deleteZoneWithGUI(_idToDelete); + + + } + + + } +//+------------------------------------------------------------------+ diff --git a/ObjectConfirmationUnit.mqh b/ObjectConfirmationUnit.mqh new file mode 100644 index 0000000..7ffdd76 --- /dev/null +++ b/ObjectConfirmationUnit.mqh @@ -0,0 +1,50 @@ +//+------------------------------------------------------------------+ +//| ObjectConfirmationUnit.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +/* + This class is responsible for all the proccess of confirming a new object. it prevents adding new objects if the previous was not confirmed. +*/ + +class ObjectConfirmationUnit + { +private: + string confirmationObjectID ; + string objectType ; + bool waitingToBeConfirmed ; + + +public: + ObjectConfirmationUnit(); + ~ObjectConfirmationUnit(); + + // GETTERS + string getObjectType(){ return objectType ;} + bool getWaitingStatus(){ return waitingToBeConfirmed ;} + string getConfirmationObjectId(){return confirmationObjectID;} + + // SETTERS + void setObjectType(string _type){ objectType = _type ;} + void setWaitingStatus(bool _waitStatus){ waitingToBeConfirmed = _waitStatus ;} + void setConfirmationObjectId(int _Id){ confirmationObjectID = IntegerToString(_Id) ;} + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +ObjectConfirmationUnit::ObjectConfirmationUnit() + { + waitingToBeConfirmed = false ; // initialize with false value + + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +ObjectConfirmationUnit::~ObjectConfirmationUnit() + { + } +//+------------------------------------------------------------------+ diff --git a/Phoenix_Functions.mqh b/Phoenix_Functions.mqh new file mode 100644 index 0000000..ba50e5c --- /dev/null +++ b/Phoenix_Functions.mqh @@ -0,0 +1,618 @@ +//+------------------------------------------------------------------+ +//| Phoenix_Functions.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#define NUM_MAX_ALLOWED_TRADES 4 +#include "library_functions.mqh" +#include "NewCandleDetector.mqh" +#include "GraphicalObjectsManager.mqh" +#include "Zone.mqh" +#include "ZoneContainer.mqh" +#include "LotSizeCalculator.mqh" +#include "MarketObserverTiger.mqh" + +#include "BuyEntryManager.mqh" +#include "SellEntryManager.mqh" +#include "BuyTradeManagerTiger.mqh" +#include "SellTradeManagerTiger.mqh" + + +//input group "Range Related Variables" +//input double rangeDistanceBetweenZones ; +//input double cleanRangeUponEntry ; +//input double potentialRR; + +input group "Zone Related Settings" +input double resistanceExtendAboveCandle; +input double resistanceLowerEdgeExtend ; +input double supportExtendBelowCandle ; +input double supportHigherEdgeExtend; +input int firstZoneShift ; +input datetime rightEdge ; + +//input group "Zone TimeFrames" +//input bool APPLY_M30_STRUCTURE ; +//input bool APPLY_H1_STRUCTURE; + + + +//input group "Candle Body Variables" +//input double WICK_RATIO_REJECTION; +//input double SIZE_OF_BREAKER_CANDLE_BODY; + +input group "Trade Related Variables 2" +input double riskManagementPartial ; +input double firstPartialCloseFactor ; +input double firstPartialProfitInPips; +input bool BUYS_ALLOWED = true ; +input bool SELLS_ALLOWED = true ; +input double lotSize ; +input int riskManagementCandlesCount ; +input double rrFactor ; +input bool APPLY_TRAIL ; +input ENUM_TIMEFRAMES TRAIL_TIME_FRAME ; + + +//input group "Trading Sessions" +//input bool TRADE_NEW_YORK_ALLOWED = true ; +//input bool TRADE_LONDON_ALLOWED = true ; + +input group "Fractal Related Variables" +//input int leftFractalPeriod ; +//input int rightFractalPeriod ; +input ENUM_TIMEFRAMES TIME_FRAME_TO_TRADE; +input int fractalsPeriod ; +input int stopLossFractalsPeriod ; +input ENUM_TIMEFRAMES stopLossTimeFrame ; + +// GUI CLASSES INITIALIZATION +GraphicalObjectsManager* objectsManager = new GraphicalObjectsManager(); + + + +// ALGORITHM CLASSES INITIALIZATION +MarketObserverTiger* marketObserverTiger = new MarketObserverTiger(); + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +NewCandleDetector newCandleDetectorWeekly("PERIOD_W1"); +NewCandleDetector newCandleDetectorDaily("PERIOD_D1"); +NewCandleDetector newCandleDetectorH4("PERIOD_H4"); +NewCandleDetector newCandleDetectorH1("PERIOD_H1"); +NewCandleDetector newCandleDetectorM30("PERIOD_M30"); +NewCandleDetector newCandleDetectorM15("PERIOD_M15"); +NewCandleDetector newCandleDetectorM5("PERIOD_M5"); +NewCandleDetector newCandleDetectorM1("PERIOD_M1"); +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ + +Zone* temporaryRestestSupportZone = new Zone(); + + + +// TRADE CLASSES +BuyEntryManager buyEntryManager ; +SellEntryManager sellEntryManager ; + + +// LotSizeCalculator class +LotSizeCalculator lsCalc ; + + +// TRADE VARIABLS +bool securedRisk = false ; +ulong activeTradeId ; +BuyTradeManagerTiger* BuyActiveTradesArray[NUM_MAX_ALLOWED_TRADES]; +SellTradeManagerTiger* SellActiveTradesArray[NUM_MAX_ALLOWED_TRADES]; +int buysCount = 0 ; +int sellsCount = 0 ; +bool waitForBottomWick = false ; +bool bottomWickFormed = false; +bool topWickFormed = false; +bool waitForTopWick = false ; + + +double currentResistanceHighEdge = -1 ; +double currentResistanceLowEdge = -1 ; +double currentSupportHighEdge = -1 ; +double currentSupportLowerEdge = -1; + + +double currentSupportZonePrice ; +double currentResistanceZonePrice; + +int indexToNewTrade ; + + +// DATA STRUCTURES + +double lastLowFractalPrice ; +double lastHighFractalPrice ; + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double supportExtendBelowCandleActual = supportExtendBelowCandle * Point(); +double supportHigherEdgeExtendActual = supportHigherEdgeExtend * Point(); +double resistanceExtendAboveCandleActual = resistanceExtendAboveCandle * Point(); +double resistanceLowerEdgeExtendActual = resistanceLowerEdgeExtend * Point(); + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double stopLossAboveWickByActual = stopLossAboveWickBy * Point() ; +double stopLossUnderWickByActual = stopLossUnderWickBy * Point() ; + + +//double cleanRangeUponEntryActual = cleanRangeUponEntry * Point() ; + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +//double rangeDistanceBetweenZonesActual_H4 = rangeDistanceBetweenZones_4H * Point(); +//double rangeDistanceBetweenZonesActual_M30 = rangeDistanceBetweenZones_M30 * Point(); + +double maxPipsRiskAmountActual = maxPipsRiskAmount * Point(); + +double firstPartialProfitInPipsActual = firstPartialProfitInPips * Point(); + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double detectSupportFromLastLowFractal(int _index) + { + double lastLowestSupportPrice = 99999; + for(int i= _index ; i > 1 ; i--) + { + if((candleClosedBearish(PERIOD_CURRENT,i) && candleClosedBullish(PERIOD_CURRENT,i-1))|| (candleClosedBearish(PERIOD_CURRENT,i) && candleClosedDoji(PERIOD_CURRENT,i-1))) + { + if(iClose(_Symbol,PERIOD_CURRENT,i) < lastLowestSupportPrice) + { + lastLowestSupportPrice = iClose(_Symbol,PERIOD_CURRENT,i); + + } + } + } + + return lastLowestSupportPrice ; + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double detectResistanceFromLastHighFractal(int _index) + { + + + double lastHighestResistancePrice = -1; + for(int i= _index ; i > 1 ; i--) + { + if((candleClosedBullish(PERIOD_CURRENT,i) && candleClosedBearish(PERIOD_CURRENT,i-1))|| (candleClosedBullish(PERIOD_CURRENT,i) && candleClosedDoji(PERIOD_CURRENT,i-1))) + { + if(iClose(_Symbol,PERIOD_CURRENT,i) > lastHighestResistancePrice) + { + lastHighestResistancePrice = iClose(_Symbol,PERIOD_CURRENT,i); + + } + } + } + + return lastHighestResistancePrice ; + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void findAndDrawFractalsAndZones(ENUM_TIMEFRAMES _timeFrame, string _timeFrameStr) + { + if(isLowFractalByIndex(fractalsPeriod+1,fractalsPeriod,fractalsPeriod,_timeFrame)) // SUPPORTS + { + objectsManager.drawLowFractal(fractalsPeriod+1,clrRed); + lastLowFractalPrice = iLow(_Symbol,PERIOD_CURRENT,fractalsPeriod+1); + currentSupportZonePrice = detectSupportFromLastLowFractal(fractalsPeriod+5); + + datetime _leftEdge = iTime(_Symbol,PERIOD_CURRENT,fractalsPeriod+1); + datetime _rightEdge =rightEdge; + double _higherEdgePrice = currentSupportZonePrice + supportHigherEdgeExtendActual; + double _lowerEdgePrice = currentSupportZonePrice - supportExtendBelowCandleActual; + + currentSupportLowerEdge = _lowerEdgePrice; + currentSupportHighEdge = _higherEdgePrice ; + + Zone* supportZoneObject = new Zone("support_zone",_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,_timeFrameStr,"TYPE_SUPPORT_BREAKOUT"); + objectsManager.drawRectangleInStrategyTester(1,_leftEdge,_rightEdge,_higherEdgePrice,_lowerEdgePrice,clrAliceBlue); + + if(candleClosedBelowSupportZone(_timeFrame)) + { + Comment("Im taking a sell !"); + if(((indexToNewTrade = findAvailableSpotInSellManagerArr())!= -1)) + { + + + double stopLossPrice ; + if(currentResistanceHighEdge != -1) + { + // stopLossPrice = currentResistanceHighEdge + stopLossAboveWickByActual ; + stopLossPrice = lastHighFractalPrice + stopLossAboveWickByActual; + } + //stopLossPrice = iHigh(_Symbol,_timeFrame,1) + stopLossAboveWickByActual; + + if(stopLossIsValidSells(stopLossPrice,maxPipsRiskAmountActual)) + { + double stopLossInPips = stopLossPrice - SymbolInfoDouble(_Symbol,SYMBOL_BID) ; + double netTp = rrFactor * stopLossInPips ; + double lotsToTrade = lsCalc.calculateLotSize(riskDollars,stopLossPrice); + activeTradeId = sellEntryManager.takeSellTradeTiger(lotsToTrade,stopLossPrice,SymbolInfoDouble(_Symbol,SYMBOL_BID)- netTp) ; + + SellTradeManagerTiger* tempTigerManagerSell= new SellTradeManagerTiger(activeTradeId); // create an object of type sellTradeManagerTiger + + tempTigerManagerSell.setBrokenSupportHigherEdge(currentSupportHighEdge); + tempTigerManagerSell.setBrokenSupportLowerEdge(currentSupportLowerEdge); + SellActiveTradesArray[indexToNewTrade] = tempTigerManagerSell ;// put the new object in the array + + sellsCount++; + } + else + { + Print("stop loss is not valid sells!"); + } + + + } + else + { + + Comment("i cant take a trade because the arrray is full"); + } + + currentSupportLowerEdge = -1; + currentSupportHighEdge = -1 ; + } + + + + } + + if(isHighFractalByIndex(fractalsPeriod+1,fractalsPeriod,fractalsPeriod,_timeFrame)) // RESISTANCES + { + objectsManager.drawHighFractal(fractalsPeriod+1,clrAliceBlue); + lastHighFractalPrice = iHigh(_Symbol,PERIOD_CURRENT,fractalsPeriod+1); + currentResistanceZonePrice = detectResistanceFromLastHighFractal(fractalsPeriod+5); + + datetime _leftEdge = iTime(_Symbol,PERIOD_CURRENT,fractalsPeriod+1); + datetime _rightEdge =rightEdge; + double _higherEdgePrice = currentResistanceZonePrice + resistanceExtendAboveCandleActual; + double _lowerEdgePrice = currentResistanceZonePrice - resistanceLowerEdgeExtendActual; + + currentResistanceHighEdge = _higherEdgePrice; + currentResistanceLowEdge = _lowerEdgePrice; + Zone* supportZoneObject = new Zone("resistance_zone",_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,_timeFrameStr,"TYPE_RESISTANCE_BREAKOUT"); + objectsManager.drawRectangleInStrategyTester(2,_leftEdge,_rightEdge,_higherEdgePrice,_lowerEdgePrice,clrAliceBlue); + + if(candleClosedAboveResistanceZone(_timeFrame)) + { + Comment("Im taking a buy !"); + + if(((indexToNewTrade = findAvailableSpotInBuyManagerArr()) != -1)) + { + + Print("indexToNewTrade:--------------------------------------- " + indexToNewTrade); + double stopLossPrice ; + if(currentSupportLowerEdge != -1) + { + // stopLossPrice = currentSupportLowerEdge - stopLossUnderWickByActual ; + stopLossPrice = lastLowFractalPrice - stopLossUnderWickByActual ; + } + + //stopLossPrice = iLow(_Symbol,_timeFrame,1) - stopLossUnderWickByActual; // if there is no lower zone , take the last m30 candle's low + + if(stopLossIsValidBuys(stopLossPrice,maxPipsRiskAmountActual)) + { + double stopLossInPips = SymbolInfoDouble(_Symbol,SYMBOL_ASK) - stopLossPrice ; + double netTp = rrFactor * stopLossInPips ; + double lotsToTrade = lsCalc.calculateLotSize(riskDollars,stopLossPrice); + activeTradeId = buyEntryManager.takeBuyTradeTiger(lotsToTrade,stopLossPrice,SymbolInfoDouble(_Symbol,SYMBOL_ASK)+ netTp) ; + + BuyTradeManagerTiger* tempTigerManagerBuy= new BuyTradeManagerTiger(activeTradeId); // create an object of type sellTradeManagerTiger + tempTigerManagerBuy.setBrokenResistanceHigherEdge(currentResistanceHighEdge); + tempTigerManagerBuy.setBrokenResistancetLowerEdge(currentResistanceLowEdge); + BuyActiveTradesArray[indexToNewTrade] = tempTigerManagerBuy ;// put the new object in the array + + buysCount++; + } + else + { + Print("stop loss is not valid buys !"); + } + + } + else + { + + Comment("i cant take a trade because the arrray is full"); + } + + currentResistanceHighEdge = -1; + currentResistanceLowEdge = -1 ; + } + + } + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool candleClosedBelowSupportZone(ENUM_TIMEFRAMES _timeFrame) + { + if(candleClosedBearish(_timeFrame,1) && (iClose(_Symbol,_timeFrame,1) < currentSupportLowerEdge) && (currentSupportLowerEdge != -1) && (currentSupportZonePrice != 99999)) + { + return true ; + } + return false ; + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool candleClosedAboveResistanceZone(ENUM_TIMEFRAMES _timeFrame) + { + + if(candleClosedBullish(_timeFrame,1) && (iClose(_Symbol,_timeFrame,1) > currentResistanceHighEdge) && (currentResistanceHighEdge != -1) && (currentResistanceZonePrice != 0)) + { + + return true ; + } + return false ; + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int findAvailableSpotInBuyManagerArr() // returns the index , or -1 if all are full + { + + for(int i=0 ; i < NUM_MAX_ALLOWED_TRADES ; i++) + { + if(BuyActiveTradesArray[i] == NULL) + { + return i; + + } + + } + return -1 ; + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int findAvailableSpotInSellManagerArr() // returns the index , or -1 if all are full + { + + for(int i=0 ; i BuyActiveTradesArray[i].getBrokenResistanceHigherEdge()) + { + BuyActiveTradesArray[i].setRiskManagementCandleCounter(0); + } + + if(BuyActiveTradesArray[i].getRiskManagementCandleCounter() >= riskManagementCandlesCount) + { + // Close the trade + tradeLong.PositionClose(BuyActiveTradesArray[i].getTradeId()); + } + } + + + + + if(SellActiveTradesArray[i] != NULL) + { + if(candleClosedBullish(PERIOD_M5,1) && (iClose(_Symbol,PERIOD_M5,1) > SellActiveTradesArray[i].getBrokenSupportHigherEdge())) + { + SellActiveTradesArray[i].incrementRiskManagementCandleCoutner(); + + } + else + if((iClose(_Symbol,PERIOD_M5,1)) < SellActiveTradesArray[i].getBrokenSupportLowerEdge()) + { + SellActiveTradesArray[i].setRiskManagementCandleCounter(0); + } + + if(SellActiveTradesArray[i].getRiskManagementCandleCounter() >= riskManagementCandlesCount) + { + // Close the trade + tradeShort.PositionClose(SellActiveTradesArray[i].getTradeId()); + } + } + } + + } +//+------------------------------------------------------------------+ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double calculateStopLossBasedOnFractalsBuys(int _fractalsPeriod, ENUM_TIMEFRAMES _timeFrame) + { + + + + for(int i=0 ; 300 ; i++) // scan the last 200 candles + { + if(isLowFractalByIndex(i,_fractalsPeriod,_fractalsPeriod,_timeFrame)) + { + + return iLow(_Symbol,_timeFrame,i); + } + } + + return -1 ; + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double calculateStopLossBasedOnFractalsSells(int _fractalsPeriod,ENUM_TIMEFRAMES _timeFrame) + { + for(int i=0 ; 300 ; i++) // scan the last 200 candles + { + if(isHighFractalByIndex(i,_fractalsPeriod,_fractalsPeriod,_timeFrame)) + { + return iHigh(_Symbol,_timeFrame,i); + } + } + + return -1 ; + } +//+------------------------------------------------------------------+ + + +void trailAllOpenPositionsIfNeeded(ENUM_TIMEFRAMES _timeFrame) + { + + for(int i=0 ; i< NUM_MAX_ALLOWED_TRADES ; i++) // CHECK TRAIL FOR BUYS + { + if((BuyActiveTradesArray[i] != NULL)) + { + double newStopLoss = iLow(_Symbol,_timeFrame,1); + newStopLoss = newStopLoss - stopLossUnderWickByActual ; + if(newStopLoss > positionStopLoss(BuyActiveTradesArray[i].getTradeId())) // if new stop loss is higher than the current position's stop loss + { + if(SymbolInfoDouble(_Symbol,SYMBOL_BID) <= newStopLoss){ // close the trade because the bid is lower than the stop loss (and the modify will fail)) + tradeLong.PositionClose(BuyActiveTradesArray[i].getTradeId()); + } + positionTrailStopLoss(BuyActiveTradesArray[i].getTradeId(),newStopLoss,0); + } + } + + + + if((SellActiveTradesArray[i] != NULL)) // CHECK TRAIL FOR SELLS + { + double newStopLoss = iHigh(_Symbol,_timeFrame,1); + newStopLoss = newStopLoss + stopLossAboveWickByActual ; + if(newStopLoss < positionStopLoss(SellActiveTradesArray[i].getTradeId())) // if new stop loss is lower than the current position's stop loss + { + if(SymbolInfoDouble(_Symbol,SYMBOL_ASK) >= newStopLoss){ // close the trade because the ask is higher than the stop loss (and the modify will fail)) + tradeShort.PositionClose(SellActiveTradesArray[i].getTradeId()); + } + positionTrailStopLoss(SellActiveTradesArray[i].getTradeId(),newStopLoss,0); + } + } + + + } + } \ No newline at end of file diff --git a/Phoenix_Reborn.ex5 b/Phoenix_Reborn.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..fb050220c53dd0111462420bf6341514bfcbab92 GIT binary patch literal 33828 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

8mxA*zcrBON|xti5sN{*A?yi^a<|h*==p-#wac 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

  • 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%0A|IO2& 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 literal 0 HcmV?d00001 diff --git a/PositionEntryTest.mq5 b/PositionEntryTest.mq5 new file mode 100644 index 0000000..3e553df --- /dev/null +++ b/PositionEntryTest.mq5 @@ -0,0 +1,1676 @@ +//+------------------------------------------------------------------+ +//| ZoneScanner.mq5 | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + + +// INPUT VARIABLES +//input ENUM_TIMEFRAMES inputTimeFrameFractals ; + + + +// FRACTAL VARIABLES INITIALIZATION + +//input int leftPeriod; +//input int rightPeriod; +//input int weekPeriodToInitialize; +//input int initFractalsPeriod ; +int lowFractalIndex ; +int highFractalIndex ; + + +#property script_show_inputs + +input datetime InpStartTime = __DATETIME__; + +// GUI CLASSES INCLUDES +#include "GraphicalObjectsManager.mqh" +#include "ObjectConfirmationUnit.mqh" +#include "TempObjectAttributes.mqh" +#include "TempLineObjectAttributes.mqh" + + +// DATA STRUCTURE CLASSES INCLUDES +#include "Zone.mqh" +#include "ZoneContainer.mqh" +//#include "LowFractal.mqh" +//#include "HighFractal.mqh" +//#include "LowFractalContainer.mqh" +//#include "HighFractalContainer.mqh" + + +// ALGORITHM CLASSES INCLUDES + +#include "NewCandleDetector.mqh" +#include "MarketObserver.mqh" +#include "LotSizeCalculator.mqh" + + +// TRADE RELATED CLASSES INCLUDES +#include "BuyEntryManager.mqh" +#include "SellEntryManager.mqh" +#include "BuyTradeManager.mqh" +#include "SellTradeManager.mqh" + +// LIBRARIES INCLUDES +#include + + + +// SCRIPTS INCLUDES +//#include "Telegram_Exporter.mq5" + + +// GUI CLASSES INITIALIZATION +GraphicalObjectsManager* objectsManager = new GraphicalObjectsManager(); +ObjectConfirmationUnit* objectConfUnit = new ObjectConfirmationUnit(); +TempObjectAttributes* tempObjectAttr = new TempObjectAttributes(); +TempLineObjectAttributes* tempLineObjectAttr = new TempLineObjectAttributes(); + + +// CONTAINERS INITIALIZATION +ZoneContainer* zoneContainer = new ZoneContainer() ; +//LowFractalContainer* lowsContainer = new LowFractalContainer(inputTimeFrameFractals) ; + +//HighFractalContainer* highsContainer = new HighFractalContainer(inputTimeFrameFractals) ; + + +// ALGORITHM CLASSES INITIALIZATION +MarketObserver* marketObserver = new MarketObserver(zoneContainer); +LotSizeCalculator lotSizeCalculator ; + + +// TRADE RELATED CLASSES INITIALIZATION +//BuyEntryManager* buyEntryManager = new BuyEntryManager(); +//BuyTradeManager* buyTradeManager = new BuyTradeManager(); + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +//SellEntryManager* sellEntryManager = new SellEntryManager(); +//SellTradeManager* sellTradeManager = new SellTradeManager(); + + +// GENERAL CHART VARIABLES INITIALIZATION +bool initialized = false ; +bool firstCandleAfterStart = true ; + + +// ENTRY VARIABLES +string entryZoneType ; +bool lookForBuy = false ; +bool lookForSell = false ; + +// NEW CANDLE CLASSES INITIALIZATION + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + +/*NewCandleDetector* newCandleDetectorM1 = new NewCandleDetector("PERIOD_M1"); +NewCandleDetector* newCandleDetectorM5 = new NewCandleDetector("PERIOD_M5"); +NewCandleDetector* newCandleDetectorM15 = new NewCandleDetector("PERIOD_M15"); +NewCandleDetector* newCandleDetectorM30 = new NewCandleDetector("PERIOD_M30"); +NewCandleDetector* newCandleDetectorH1 = new NewCandleDetector("PERIOD_H1"); +NewCandleDetector* newCandleDetectorH4 = new NewCandleDetector("PERIOD_H4"); +NewCandleDetector* newCandleDetectorD1 = new NewCandleDetector("PERIOD_D1"); */ + + + +// LIVE FORMING FRACTALS HANDLER CLASS +NewCandleDetector* newCandleDetectorLive ; +NewCandleDetector* newCandleDetector_H4; +NewCandleDetector* newCandleDetector_H1; +NewCandleDetector* newCandleDetector_M30; +NewCandleDetector* newCandleDetector_M15; +NewCandleDetector* newCandleDetector_M5; +NewCandleDetector* newCandleDetector_M1; + +NewCandleDetector* newCandleDetectorTest ; + + + +// Trade MANAGING VARIABLES +bool priceInMiddle = true ; +bool buyOnWait = false ; +bool buyOnAction = false; +bool sellOnWait = false; +bool sellOnAction = false ; + +input datetime zoneLeftEdge ; +input double zoneHighEdge; +input double zoneLowEdge; +input double stopLosssPrice; +input double takeProfittPrice ; +input double takeProfittPrice2; + + + +//#property copyright "Copyright 2022, Orchard Forex" +//#property link "https://www.orchardforex.com" + +//#property script_show_inputs +//#property script_show_confirm + +//const string TelegramBotToken = "6245008777:AAHfUg-t4vhPPX6MioVSaZYB2Hc_QCm4acI"; +//const string ChatId = "-1001943701147"; +//const string TelegramApiUrl = "https://api.telegram.org"; // Add this to Allow URLs + +//const int UrlDefinedErrorMt4 = 4066 ; // this url defined error is for MT4 +//const int UrlDefinedError = 4014; // Because MT4 and MT5 are different + + + + +// VARIABLES FOR TELEGRAM PUBLISHER +//string fileType ; +//string fileName; + +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- create timer + EventSetTimer(60); + + + objectsManager.drawRectangleInStrategyTester(1,iTime(Symbol(),PERIOD_CURRENT,130),iTime(Symbol(),PERIOD_CURRENT,0),zoneHighEdge,zoneLowEdge); + zoneContainer.incrementZonesIdCounter(); + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(zoneHighEdge); + newZone.setLowerEdgePrice(zoneLowEdge); + newZone.setLeftEdge(iTime(Symbol(),PERIOD_CURRENT,130)); + newZone.setRightEdge(iTime(Symbol(),PERIOD_CURRENT,0)); + newZone.setId(objectConfUnit.getConfirmationObjectId()); + newZone.setTimeFrame(getChartTimeFrameInString()); + + + + double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK) ; + double higherEdge = tempObjectAttr.getHigherEdgePrice(); + + Print("higher edge is: " + higherEdge + " ask is: " + ask); + if(zoneHighEdge < ask) // means its a support zone + { + newZone.setType("TYPE_SUPPORT"); + } + + + double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + double lowerEdge = tempObjectAttr.getLowerEdgePrice(); + Print("lower edge is: "+lowerEdge + " bidd i: " + bid); + if(zoneLowEdge > bid) // means its a resistance zone + { + + newZone.setType("TYPE_RESISTANCE"); + } +// add the zone to the data structure + if(zoneContainer.addZone(newZone) == 1) + { + zoneContainer.findOrUpdatePivotEdgesOnConfirm(ask,bid); // update the pivot edges + + } + else + { + Print("Failed to add the zone, Error: 2 or more zones are crossing"); + } + + newZone.setStopLossPrice(stopLosssPrice); + newZone.setTakeProfit(takeProfittPrice); + newZone.setTakeProfit(takeProfittPrice2); + + newZone.printTradeManagerData(); + zoneContainer.printZonesSortedArray(); + +// ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ + + + if(initialized == false) + { + Print("Shark Initialized successfully on " + Symbol()); + + // ADD THE BUTTONS TO THE SCREEN + objectsManager.addZoneButton(); + objectsManager.addConfirmButton(); + objectsManager.addDeleteButton(); + objectsManager.addExitExperAdvisorButton(); + objectsManager.addPrintFractalsButton(); + objectsManager.addPrintZonesButton(); + objectsManager.addStopLossButton(); + objectsManager.addTakeProfitButton(); + objectsManager.addSetTakeProfitButton(); + + + // INITIALIZATION FLAG + + + newCandleDetector_H4 = new NewCandleDetector("PERIOD_H4"); + newCandleDetector_H1 = new NewCandleDetector("PERIOD_H1"); + newCandleDetector_M30 = new NewCandleDetector("PERIOD_M30"); + newCandleDetector_M15 = new NewCandleDetector("PERIOD_M15"); + newCandleDetector_M5 = new NewCandleDetector("PERIOD_M5"); + newCandleDetector_M1 = new NewCandleDetector("PERIOD_M1"); + + + initialized = true ; + + + } + + + + +//--- + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- destroy timer + /*Print("Low Fractals:"); + lowsContainer.printLowFractals(); + Print(" "); + Print("High Fractals:"); + highsContainer.printhighFractals(); + Print(" "); */ + + + + EventKillTimer(); + + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { + + + if(!IsTradeAllowed()) + { + + return ; + } + + if(!IsMarketOpen2(Symbol(),TimeCurrent())) + { + + return ; + } + + + + if((marketObserver.getClosestResistanceZone() != NULL) && (marketObserver.getClosestResistanceZone().sellEntryManager.sellTradeTaken())) + { + marketObserver.getClosestResistanceZone().sellTradeManager.checkAndSecureTradeIfNeeded(firstSecureRatio,riskDollars); + } + + if((marketObserver.getClosestSupportZone() != NULL) && (marketObserver.getClosestSupportZone().buyEntryManager.buyTradeTaken())) + { + marketObserver.getClosestSupportZone().buyTradeManager.checkAndSecureTradeIfNeeded(firstSecureRatio,riskDollars); + } + + + + + /*if(newCandleDetector_M1.isNewCandle()) + { + + + handleBuys(PERIOD_M1); + handleSells(PERIOD_M1); + }*/ + + + if(newCandleDetector_H1.isNewCandle()) + { + + /* ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"this is just a test " + _Symbol + " " + TimeToString(TimeLocal()), fileName); */ + handleBuys(PERIOD_H1); + handleSells(PERIOD_H1); + } + + + } + + + +//+------------------------------------------------------------------+ +//| Timer function | +//+------------------------------------------------------------------+ +void OnTimer() + { +//--- + + } +//+------------------------------------------------------------------+ +//| Trade function | +//+------------------------------------------------------------------+ +void OnTrade() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TradeTransaction function | +//+------------------------------------------------------------------+ +void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) + { +//--- + + } +//+------------------------------------------------------------------+ +//| Tester function | +//+------------------------------------------------------------------+ +double OnTester() + { +//--- + double ret=0.0; +//--- + +//--- + return(ret); + } +//+------------------------------------------------------------------+ +//| TesterInit function | +//+------------------------------------------------------------------+ +void OnTesterInit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterPass function | +//+------------------------------------------------------------------+ +void OnTesterPass() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterDeinit function | +//+------------------------------------------------------------------+ +void OnTesterDeinit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| ChartEvent function | +//+------------------------------------------------------------------+ +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) + { +//--- +//--- left-clicking on a chart + + switch(id) + { + + case CHARTEVENT_CLICK: + { + + break; + } + + + + + //--- clicking on a graphical object + case CHARTEVENT_OBJECT_CLICK: + { + if(sparam == "ZONE_ADD_BTN") + { + + if(objectConfUnit.getWaitingStatus() == false) // THIS IS TO MAKE SURE THERE IS NO OTHER OBJECT SELECTED + { + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getZonesIdCounter(); + objectsManager.drawRectangle(currentIdCounter); // create a rectangle . set its name to be the current zonesIdCounter (and that would be the id of this current zone ) + objectConfUnit.setWaitingStatus(true); + objectConfUnit.setObjectType("OBJ_RECTANGLE"); + objectConfUnit.setConfirmationObjectId(currentIdCounter); + zoneContainer.incrementZonesIdCounter(); + + + + } + else + { + + Print("Failed to Add a new Object, Make sure to confirm the previous object first! ."); + } + + + + } + + else + if(sparam == "ADD_SL_BTN") + { + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THAT THERE IS A ZONE SELECTED TO ADD STOP LOSS TO + { + + if(objectConfUnit.getObjectType() != "OBJ_RECTANGLE") + { + Print("Please select a zone object only !"); + } + else + { + + objectsManager.drawStopLossLine(objectConfUnit.getConfirmationObjectId()); + } + + } + else + { + + Print("Please select a zone in order to add a stop loss line !"); + } + + + } + else + if(sparam == "ADD_TP_BTN") + { + + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THAT THERE IS A ZONE SELECTED TO ADD STOP LOSS TO + { + + if(objectConfUnit.getObjectType() != "OBJ_RECTANGLE") + { + Print("Please select a zone object only !"); + } + else + { + + objectsManager.drawTakeProfitLine(objectConfUnit.getConfirmationObjectId()); + } + + } + else + { + + Print("Please select a zone in order to add a stop loss line !"); + } + + } + else + if(sparam == "CONFIRM_BTN") + { + + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THAT THERE IS SOMETHING SELECTED TO BE CONFIRMED + { + + + if(objectConfUnit.getObjectType() == "OBJ_RECTANGLE") // CASE OF ZONE + { + + if(zoneContainer.getZoneIndex(objectConfUnit.getConfirmationObjectId()) != -1) // means the zone already in the data structure, in this case we just need to update it + { + + // update the zone attributes + // zoneContainer.UpdateZone(int id); + Zone* tempZone = new Zone(); + + + + tempZone.setHigherEdgePrice(tempObjectAttr.getHigherEdgePrice()) ; + tempZone.setLowerEdgePrice(tempObjectAttr.getLowerEdgePrice()); + tempZone.setLeftEdge(tempObjectAttr.getLeftEdgeTime()); + tempZone.setRightEdge(tempObjectAttr.getRightEdgeTime()); + tempZone.setTimeFrame(tempObjectAttr.getTimeFrame()); + + string idOfOriginalZone = objectConfUnit.getConfirmationObjectId(); + // no need to set the ID here because the ID belongs to the original zone and not this new temp one (this is just a temporary zone to check if the adjustment is valid or no) + + if(zoneContainer.updateZone(tempZone, idOfOriginalZone) ==1) + { + // in this case we successfully updated the zone + + Print("Updated the object:" + + "\n ID: " + objectConfUnit.getConfirmationObjectId() + + "\n Type: " + objectConfUnit.getObjectType() + + "\n Asset: " + tempObjectAttr.getSymbol() + + "\n Time Frame:" + tempObjectAttr.getTimeFrame() + + "\n Higher Edge Price: " + tempObjectAttr.getHigherEdgePrice() + + "\n Lower Edge Price: " + tempObjectAttr.getLowerEdgePrice() + + "\n Left Edge Date: " + tempObjectAttr.getLeftEdgeTime() + + "\n Right Edge Date: " + tempObjectAttr.getRightEdgeTime() + ); + + delete tempZone; + if(ObjectSetInteger(_Symbol,objectConfUnit.getConfirmationObjectId(),OBJPROP_SELECTED,false) == true) // this is to unselect the object once we finish using it + { + } + else + { + Print("Failed to unselect the object. Error: " + GetLastError()); + } + + // THIS IS TO CLEAN THE objectConfUnit + objectConfUnit.setWaitingStatus(false); + ChartRedraw(); + } + else + { + + Print("Failed to update the zone, please reposition it"); + } + + } + + else // means the zone is new so we need to add it + { + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(tempObjectAttr.getHigherEdgePrice()); + newZone.setLowerEdgePrice(tempObjectAttr.getLowerEdgePrice()); + newZone.setLeftEdge(tempObjectAttr.getLeftEdgeTime()); + newZone.setRightEdge(tempObjectAttr.getRightEdgeTime()); + newZone.setId(objectConfUnit.getConfirmationObjectId()); + newZone.setTimeFrame(tempObjectAttr.getTimeFrame()); + + + double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK) ; + double higherEdge = tempObjectAttr.getHigherEdgePrice(); + + Print("higher edge is: " + higherEdge + " ask is: " + ask); + if(tempObjectAttr.getHigherEdgePrice() < ask) // means its a support zone + { + newZone.setType("TYPE_SUPPORT"); + } + + + double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); + double lowerEdge = tempObjectAttr.getLowerEdgePrice(); + Print("lower edge is: "+lowerEdge + " bidd i: " + bid); + if(tempObjectAttr.getLowerEdgePrice() > bid) // means its a resistance zone + { + + newZone.setType("TYPE_RESISTANCE"); + } + // add the zone to the data structure + if(zoneContainer.addZone(newZone) == 1) + { + zoneContainer.findOrUpdatePivotEdgesOnConfirm(ask,bid); // update the pivot edges + Print("Added the object:" + + "\n ID: " + objectConfUnit.getConfirmationObjectId() + + "\n Type: " + objectConfUnit.getObjectType() + + "\n Asset: " + tempObjectAttr.getSymbol() + + "\n Time Frame:" + tempObjectAttr.getTimeFrame() + + "\n Higher Edge Price: " + tempObjectAttr.getHigherEdgePrice() + + "\n Lower Edge Price: " + tempObjectAttr.getLowerEdgePrice() + + "\n Left Edge Date: " + tempObjectAttr.getLeftEdgeTime() + + "\n Right Edge Date: " + tempObjectAttr.getRightEdgeTime() + ); + + + + if(ObjectSetInteger(_Symbol,objectConfUnit.getConfirmationObjectId(),OBJPROP_SELECTED,false) == true) // this is to unselect the object once we finish using it + { + } + else + { + Print("Failed to unselect the object. Error: " + GetLastError()); + } + + // THIS IS TO CLEAN THE objectConfUnit + objectConfUnit.setWaitingStatus(false); + } + else + { + Print("Failed to add the zone, Error: 2 or more zones are crossing"); + } + + ChartRedraw(); + } + + + + + + } + + else + if(objectConfUnit.getObjectType() == "OBJ_TRENDLINE") // CASE OF TRENDLINE + { + + + + + } + else + if(objectConfUnit.getObjectType() == "OBJ_HLINE") // CASE OF HORIZNOTAL LINE + { + + if(StringSubstr(tempLineObjectAttr.getId(),0,2) == "sl") + { + + zoneContainer.searchZoneById(StringSubstr(tempLineObjectAttr.getId(),2,-1)).setStopLossPrice(tempLineObjectAttr.getPrice()); + Print("Stop loss for zone: " + StringSubstr(tempLineObjectAttr.getId(),2,-1) + " has been set at: " + tempLineObjectAttr.getPrice()); + if(ObjectDelete(_Symbol,tempLineObjectAttr.getId())) + { + + } + else + { + Print("Failed to delete the stop loss line ! Error: "+ GetLastError()); + } + + // THIS IS TO CLEAN THE objectConfUnit + objectConfUnit.setWaitingStatus(false); + + ChartRedraw(); + } + else + if(StringSubstr(tempLineObjectAttr.getId(),0,2) == "tp") + { + + + if(ObjectDelete(_Symbol,tempLineObjectAttr.getId())) + { + + } + else + { + Print("Failed to delete the stop loss line ! Error: "+ GetLastError()); + } + + // THIS IS TO CLEAN THE objectConfUnit + objectConfUnit.setWaitingStatus(false); + ChartRedraw(); + } + else + if(StringSubstr(tempLineObjectAttr.getId(),0,2) == "rl") + { + + Print("Relational level line for zone: " + StringSubstr(tempLineObjectAttr.getId(),2,-1) + " has been set at: " + tempLineObjectAttr.getPrice()); + ChartRedraw(); + + } + else + if(StringSubstr(tempLineObjectAttr.getId(),0,2) == "dl") + { + + Print("Daily indecision line for zone: " + StringSubstr(tempLineObjectAttr.getId(),2,-1) + " has been set at: " + tempLineObjectAttr.getPrice()); + ChartRedraw(); + + } + else + if(StringSubstr(tempLineObjectAttr.getId(),0,3) == "bos") + { + + Print("Break of structure line for zone: " + StringSubstr(tempLineObjectAttr.getId(),3,-1) + " has been set at: " + tempLineObjectAttr.getPrice()); + ChartRedraw(); + + } + + } + + + + } + else + { + + Print("Cannot confirm, Please select an object first !"); + } + + } + + else + if(sparam == "DELETE_BTN") + { + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THAT THERE IS SOMETHING SELECTED TO BE DELETED + { + if(ObjectDelete(_Symbol,objectConfUnit.getConfirmationObjectId())) + { + if(zoneContainer.deleteZone(objectConfUnit.getConfirmationObjectId()) == 1) + { + // delete from data structure + zoneContainer.findOrUpdatePivotEdgesOnDelete(); + Print("Deleted the object: " + + "\n Type: " + objectConfUnit.getObjectType() + + "\n ID: " + objectConfUnit.getConfirmationObjectId()); + + objectConfUnit.setWaitingStatus(false); + objectConfUnit.setObjectType("NO_OBJECT"); + objectConfUnit.setConfirmationObjectId(-2); + + ChartRedraw(); + } + else + { + objectConfUnit.setWaitingStatus(false); + objectConfUnit.setObjectType("NO_OBJECT"); + objectConfUnit.setConfirmationObjectId(-2); + } + } + + } + else + { + + Print("Cannot delete, Please select an object first !"); + } + + } + else + if(sparam == "EXIT_BTN") + { + delete objectsManager ; + delete objectConfUnit; + delete tempObjectAttr; + //delete lowsContainer; + //delete highsContainer; + + delete newCandleDetectorLive; + delete tempLineObjectAttr; + delete marketObserver; + + + zoneContainer.freeZonesSortedArray(); + delete zoneContainer ; + + delete newCandleDetector_H4; + delete newCandleDetector_H1; + delete newCandleDetector_M30; + delete newCandleDetector_M15; + delete newCandleDetector_M5 ; + delete newCandleDetector_M1; + + + + + + + ExpertRemove(); + } + else + if(sparam == "PRINT_FRACTAL_BTN") + { + Print("Low Fractals:"); + //lowsContainer.printLowFractals(); + Print("High Fractals:"); + //highsContainer.printHighFractals(); + } + + else + if(sparam == "PRINT_ZONES_BTN") + { + + zoneContainer.printZonesSortedArray(); + } + + else + if(sparam == "SET_TP_BTN") + { + if(objectConfUnit.getObjectType() != "OBJ_HLINE") + { + Print("Please select a TP line first !"); + + } + else + { + if(zoneContainer.searchZoneById(StringSubstr(tempLineObjectAttr.getId(),2,-1)).setTakeProfit(tempLineObjectAttr.getPrice())) + { + Print("TP for zone: " + StringSubstr(tempLineObjectAttr.getId(),2,-1) + " has been set at: " + tempLineObjectAttr.getPrice()); + } + else + { + Print("You have reached the max take profit lines !"); + } + + } + + + } + else // THIS is the case were we click on any object except for main Buttons on screen + { + + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THERE IS NO OTHER OBJECT SELECTED + { + Print("Cannot select the object clicked, Make sure to confirm a previous selected object first !"); + } + + + else + { + ObjectSetInteger(_Symbol,sparam,OBJPROP_SELECTED,true); + + if(ObjectGetInteger(_Symbol,sparam,OBJPROP_TYPE,0) == OBJ_RECTANGLE) // CASE OF SELECTING A RECTANGLE + { + Print("Selected the object:" + + "\n Type: OBJ_RECTANGLE" + + "\n ID: " + sparam); + objectConfUnit.setWaitingStatus(true) ; + objectConfUnit.setConfirmationObjectId(StringToInteger(sparam)); + objectConfUnit.setObjectType("OBJ_RECTANGLE"); + + double _higherEdgePrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,1); + double _lowerEdgePrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0); + datetime _leftEdgeTime = (datetime)ObjectGetInteger(_Symbol,sparam,OBJPROP_TIME,0); + datetime _rightEdgeTime = (datetime)ObjectGetInteger(_Symbol,sparam,OBJPROP_TIME,1); + + if(_higherEdgePrice < _lowerEdgePrice) // this is the case were the user flips the rectangle while adjusting it. + { + tempObjectAttr.setHigherEdgePrice(_lowerEdgePrice); + tempObjectAttr.setLowerEdgePrice(_higherEdgePrice); + } + else + { + tempObjectAttr.setHigherEdgePrice(_higherEdgePrice); + tempObjectAttr.setLowerEdgePrice(_lowerEdgePrice); + } + + + + + + tempObjectAttr.setLeftEdgeTime(_leftEdgeTime); + tempObjectAttr.setRightEdgeTime(_rightEdgeTime); + tempObjectAttr.setSymbol(); + tempObjectAttr.setTimeFrame(getChartTimeFrameInString()); + ChartRedraw(); + } + + + else + if(ObjectGetInteger(_Symbol,sparam,OBJPROP_TYPE,0) == OBJ_HLINE) // CASE OF SELECTING A HORIZONTAL LINE + { + + objectConfUnit.setWaitingStatus(true) ; + objectConfUnit.setConfirmationObjectId(StringToInteger(sparam)); + objectConfUnit.setObjectType("OBJ_HLINE"); + + //tempLineObjectAttr.setId(sparam); + //tempLineObjectAttr.setPrice( ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0)); + ChartRedraw(); + } + + + + + + } + + } + + + break; + } + + + //--- object moved or anchor point coordinates changed + case CHARTEVENT_OBJECT_DRAG: + { + + if(ObjectGetInteger(_Symbol,sparam,OBJPROP_TYPE,0) == OBJ_RECTANGLE) + { + + + double _higherEdgePrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,1); + double _lowerEdgePrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0); + + datetime _leftEdgeTime = (datetime)ObjectGetInteger(_Symbol,sparam,OBJPROP_TIME,0); + datetime _rightEdgeTime = (datetime)ObjectGetInteger(_Symbol,sparam,OBJPROP_TIME,1); + + if(_higherEdgePrice < _lowerEdgePrice) // this is the case were the user flips the rectangle while adjusting it. + { + tempObjectAttr.setHigherEdgePrice(_lowerEdgePrice); + tempObjectAttr.setLowerEdgePrice(_higherEdgePrice); + } + else + { + tempObjectAttr.setHigherEdgePrice(_higherEdgePrice); + tempObjectAttr.setLowerEdgePrice(_lowerEdgePrice); + } + + tempObjectAttr.setLeftEdgeTime(_leftEdgeTime); + tempObjectAttr.setRightEdgeTime(_rightEdgeTime); + tempObjectAttr.setSymbol(); + tempObjectAttr.setTimeFrame(getChartTimeFrameInString()); + break; + } + + else + if(ObjectGetInteger(_Symbol,sparam,OBJPROP_TYPE,0) == OBJ_HLINE) + { + + if(StringSubstr(sparam,0,2) == "sl") // case of sl line (attached to a zone) + { + double stopLossPrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0); + tempLineObjectAttr.setId(sparam); + tempLineObjectAttr.setPrice(stopLossPrice); + } + else + if(StringSubstr(sparam,0,2) == "tp") // case of tp line (attached to a zone) + { + double takeProfitPrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0); + tempLineObjectAttr.setId(sparam); + tempLineObjectAttr.setPrice(takeProfitPrice); + } + else + if(StringSubstr(sparam,0,2) == "rl") // case of relational point line (attached to a zone) + { + Print("dragging a relational point line"); + } + else + if(StringSubstr(sparam,0,2) == "dl") // case of daily line + { + Print("dragging a daily line"); + } + else + if(StringSubstr(sparam,0,3) == "bos") // case of break of structure line + { + Print("dragging a break of structure line"); + } + + } + } + } + + } + + +//+------------------------------------------------------------------+ +//| BookEvent function | +//+------------------------------------------------------------------+ +void OnBookEvent(const string &symbol) + { +//--- + + } +//+------------------------------------------------------------------+ + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + + +/*void initLowFractalsFromIndex(int _index,ENUM_TIMEFRAMES timeFramePeriod) + { + + for(int i=_index ; i> rightPeriod ; i--) + { + + bool accessDeniedLows = false ; // variable for dealing with equal consecutive fractals + + + + if(isLowFractalByIndex(i,leftPeriod,rightPeriod,timeFramePeriod) == true) + { + + if(lowsContainer.getFreeIndex() > 0) + { + + if(iLow(Symbol(),timeFramePeriod,i) == lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getPrice()) // if low fractal is equal to the previous low fractal + { + if(lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getDistance() - i < 2*rightPeriod) // if the 2 lows are inside the range of 2 times of right period + { + accessDeniedLows = true ; + } + + } + } + + if(accessDeniedLows == false) + { + + + LowFractal* currentFractal = new LowFractal(iLow(Symbol(),timeFramePeriod,i),leftPeriod,rightPeriod,TimeCurrent(),timeFramePeriod); + currentFractal.setDate(iTime(Symbol(),timeFramePeriod,i)); + currentFractal.setDistance(i); + int NumberOfCandle = i-1; + string NumberOfCandleText = IntegerToString(NumberOfCandle); + currentFractal.setArrowObjName(NumberOfCandleText); + lowsContainer.addLowFractal(currentFractal); + + } + + + } + + } + + + } */ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + +/*void initHighFractalsFromIndex(int _index,ENUM_TIMEFRAMES timeFramePeriod) + { + + for(int i=_index ; i> rightPeriod ; i--) + { + + bool accessDeniedHighs = false ; // variable for dealing with equal consecutive fractals + + + + if(isHighFractalByIndex(i,leftPeriod,rightPeriod,timeFramePeriod) == true) + { + + if(highsContainer.getFreeIndex() > 0) + { + + if(iHigh(Symbol(),timeFramePeriod,i) == highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getPrice()) // if high fractal is equal to the previous high fractal + { + + if(highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getDistance() - i < 2*rightPeriod) // if the 2 highs are inside the range of 2 times of right period + { + + accessDeniedHighs = true ; + } + + } + } + + if(accessDeniedHighs == false) + { + + + HighFractal* currentFractal = new HighFractal(iHigh(Symbol(),timeFramePeriod,i),leftPeriod,rightPeriod,TimeCurrent(),timeFramePeriod); + currentFractal.setDate(iTime(Symbol(),timeFramePeriod,i)); + currentFractal.setDistance(i); + int NumberOfCandle = i-1; + string NumberOfCandleText = IntegerToString(NumberOfCandle); + currentFractal.setArrowObjName(NumberOfCandleText); + highsContainer.addHighFractal(currentFractal); + + } + + + } + + } + + } */ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + + +/*void handleLowFractals(ENUM_TIMEFRAMES tf) + { + + bool accessDeniedLows = false ; // variable for dealing with equal consecutive fractals if its true, then the current fractal will not be added + + for(int x=0 ; x 0) + { + + if(iLow(Symbol(),tf,lowFractalIndex) == lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getPrice()) // if low fractal is equal to the previous low fractal + { + + if(lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getDistance() <= 2*rightPeriod) // if the 2 lows are inside the range of 2 times of right period + { + + accessDeniedLows = true ; + } + + } + } + + if(accessDeniedLows == false) + { + + LowFractal* currentFractal = new LowFractal(iLow(Symbol(),tf,lowFractalIndex),leftPeriod,rightPeriod,TimeCurrent(),tf); + + int NumberOfCandle = Bars(Symbol(),tf); + string NumberOfCandleText = IntegerToString(NumberOfCandle); + currentFractal.setArrowObjName(NumberOfCandleText); + lowsContainer.addLowFractal(currentFractal); + Print("added a new low fractal !"); + + } + + + } + + } */ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + + +/*void handleHighFractals(ENUM_TIMEFRAMES tf) + { + + + bool accessDeniedHighs = false ; // variable for dealing with equal consecutive fractals + + for(int x=0 ; x 0) + { + + if(iHigh(Symbol(),tf,highFractalIndex) == highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getPrice()) // if high fractal is equal to the previous high fractal + { + if(highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getDistance() <= 2*rightPeriod) // if the 2 highs are inside the range of 2 times of right period + { + accessDeniedHighs = true ; + } + + } + } + + if(accessDeniedHighs == false) + { + + + HighFractal* currentFractal = new HighFractal(iHigh(Symbol(),tf,highFractalIndex),leftPeriod,rightPeriod,TimeCurrent(),tf); + + int NumberOfCandle = Bars(Symbol(),tf); + string NumberOfCandleText = IntegerToString(NumberOfCandle); + currentFractal.setArrowObjName(NumberOfCandleText); + highsContainer.addHighFractal(currentFractal); + Print("added a new high fractal !"); + } + + + } + + + } */ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +string MarketTest(string symbol, datetime testTime) + { + + return symbol + " " + TimeToString(testTime, TIME_DATE|TIME_MINUTES|TIME_SECONDS) + " " + IsMarketOpen(symbol, testTime) + " " + IsMarketOpen2(symbol, testTime); + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool IsTradeAllowed() + { + + return ((bool)MQLInfoInteger(MQL_TRADE_ALLOWED) // Trading allowed in input dialog + && (bool)TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) // Trading allowed in terminal + && (bool)AccountInfoInteger(ACCOUNT_TRADE_ALLOWED) // Is account able to trade, not locked out + && (bool)AccountInfoInteger(ACCOUNT_TRADE_EXPERT) // Is account able to auto trade + ); + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool IsMarketOpen(string symbol, datetime time) + { + + MqlDateTime mtime; + TimeToStruct(time, mtime); + datetime seconds = mtime.hour*3600+mtime.min*60+mtime.sec; + + datetime fromTime; + datetime toTime; + + for(int session = 0;; session++) + { + if(!SymbolInfoSessionTrade(symbol, (ENUM_DAY_OF_WEEK)mtime.day_of_week, session, fromTime, toTime)) + return false; + if(fromTime<=seconds && seconds<=toTime) + return true; + } + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool IsMarketOpen2(string symbol, datetime time) + { + + static string lastSymbol = ""; + static bool isOpen = false; + static datetime sessionStart = 0; + static datetime sessionEnd = 0; + + if(lastSymbol==symbol && sessionEnd>sessionStart) + { + if((isOpen && time>=sessionStart && time<=sessionEnd) + || (!isOpen && time>sessionStart && timetoTime) // maybe a later session + { + sessionStart = dayStart + toTime; + continue; + } + + // at this point must be inside a session + sessionStart = dayStart + fromTime; + sessionEnd = dayStart + toTime; + isOpen = true; + return isOpen; + + } + + return false; + + } +//+------------------------------------------------------------------+ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void deleteZoneWithGUI(string _id) + { + + + if(zoneContainer.deleteZone(_id) == 1) + { + // delete from data structure + zoneContainer.findOrUpdatePivotEdgesOnDelete(); + Print("Deleted the object: " + + + "\n ID: " + _id); + + ChartRedraw(); + } + else + { + + } + + + if(!ObjectDelete(_Symbol,_id)) + { + Print("Failed to delete object error: " + GetLastError()); + } + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +void handleBuys(ENUM_TIMEFRAMES _timeFrame) + { + +// BUY CASE + + if((marketObserver.getClosestSupportZone() != NULL) && !(marketObserver.getClosestSupportZone().buyEntryManager.isWaitingForRejectionCandle()) && !(marketObserver.getClosestSupportZone().buyEntryManager.buyTradeTaken()) && !(marketObserver.getClosestSupportZone().buyEntryManager.isWaitingForRetracement())) // FIRST CASE : PRICE IS IN THE MIDDLE + { + if(marketObserver.bearishCandleClosedInsideClosestSupportZone(_timeFrame)) + { + Print("Bearish Candle closed inside closest support zone !"); + marketObserver.getClosestSupportZone().buyEntryManager.setWaitingForRejectionCandle(true); + + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THE CURRENT ZONE ** M1 Bearish candle closed inside the closest support zone, Symbol: " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + } + + } + + else + if((marketObserver.getClosestSupportZone() != NULL) && (marketObserver.getClosestSupportZone().buyEntryManager.isWaitingForRejectionCandle()) && !(marketObserver.getClosestSupportZone().buyEntryManager.buyTradeTaken())) // SECOND CASE : PRICE HAS CLOSED IN THE ZONE AND WAITING FOR REJECTION, AND THE TRADE HAS NOT BEEN TAKEN YET + { + if(marketObserver.getClosestSupportZone().buyEntryManager.buyRejectionDetector.rejectionByOneCandleFormed(_timeFrame)) + { + + + marketObserver.getClosestSupportZone().buyEntryManager.setWaitingForRejectionCandle(false); + double lastBullishCandleClosePrice = iClose(_Symbol,_timeFrame,1); + // let the market observer check where the rejection candle closed, was it inside the zone ? or outside ? if outside the zone was it too close to the zone? if too + + if(lastBullishCandleClosePrice > marketObserver.getClosestSupportZone().getHigherEdge()) // closed above the zone + { + + // now we need to check if closed twice as the zone height + + + if(lastBullishCandleClosePrice - marketObserver.getClosestSupportZone().getHigherEdge() > marketObserver.getClosestSupportZone().getZoneHeight()) + { + + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THE CURRENT ZONE ** Bullish rejection candle was formed, Price closed above the zone in a distance more than the height of the zone, in these cases i take an entry on imbalance fill or a retracement but at the moment im not trading these cases , Symbol: " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + marketObserver.getClosestSupportZone().buyEntryManager.setWaitingForRetracement(true); + } + else + { + + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THE CURRENT ZONE ** Bullish rejection candle was formed, Price Closed above the zone in a distance less than the height of the zone, im taking a buy now ! , Symbol: " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + + double stopLossPrice = marketObserver.getClosestSupportZone().getStopLossPrice(); + double lotsToTrade = lotSizeCalculator.calculateLotSize(riskDollars,stopLossPrice); + for(int i=0 ; i<3 ; i++) // after this loop, the trade id's array will be filled, and the 3 trades will be taken + { + double partialLotPercent ; + if(i == 0) + { + partialLotPercent = 0.5 ; + } + if(i == 1 || i == 2) + { + partialLotPercent = 0.25; + } + ulong currentEntryId = marketObserver.getClosestSupportZone().buyEntryManager.takeBuyTrade(partialLotPercent * lotsToTrade,stopLossPrice); + marketObserver.getClosestSupportZone().buyTradeManager.fillRejectionByOneCandleTradeArray(i,currentEntryId); + } + marketObserver.getClosestSupportZone().buyEntryManager.setTradeTakenStatus(true); + } + + } + else + if(lastBullishCandleClosePrice < marketObserver.getClosestSupportZone().getHigherEdge() && lastBullishCandleClosePrice > marketObserver.getClosestSupportZone().getLowerEdge()) // closed inside the zone + { + + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THE CURRENT ZONE ** Bullish Rejection Candle Closed inside the zone, im taking a buy now !, Symbol: " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + double stopLossPrice = marketObserver.getClosestSupportZone().getStopLossPrice(); + double lotsToTrade = lotSizeCalculator.calculateLotSize(riskDollars,stopLossPrice); + for(int i=0 ; i<3 ; i++) // after this loop, the trade id's array will be filled, and the 3 trades will be taken + { + double partialLotPercent ; + if(i == 0) + { + partialLotPercent = 0.5 ; + } + if(i == 1 || i == 2) + { + partialLotPercent = 0.25; + } + ulong currentEntryId = marketObserver.getClosestSupportZone().buyEntryManager.takeBuyTrade(partialLotPercent * lotsToTrade,stopLossPrice); + marketObserver.getClosestSupportZone().buyTradeManager.fillRejectionByOneCandleTradeArray(i,currentEntryId); + } + marketObserver.getClosestSupportZone().buyEntryManager.setTradeTakenStatus(true); + } + + // call trade manager + } + } + + else + if((marketObserver.getClosestSupportZone() != NULL) && (marketObserver.getClosestSupportZone().buyEntryManager.isWaitingForRetracement())) // THIRD CASE: WAITING FOR A RETRACEMENT BECAUSE THE REJECTION CANDLE CLOSED MORE THAN THE HEIGHT OF THE ZONE + { + + Print("Im waiting for retracement because the rejection candle closed more than the height of the zone, ** this messaage is just for testing, because i still do not take trades on these kind of setups **"); + + } + + if((marketObserver.getClosestSupportZone() != NULL) && marketObserver.candleClosedBelowClosestSupportZone(_timeFrame) && !(marketObserver.getClosestSupportZone().buyEntryManager.buyTradeTaken())) // FOURTH CASE: PRICE CLOSED UNDER THE ZONE, AND THE BUY IS STILL NOT TAKEN , SO WE DONT WANT TO ENTER + { + + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THIS ZONE ** A candle closed below the support zone, the trade is still not taken and im not gonna take it, Symbol: " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + string _idToDelete = marketObserver.getClosestSupportZone().getId(); + deleteZoneWithGUI(_idToDelete); + + } + else + if((marketObserver.getClosestSupportZone() != NULL) && marketObserver.candleClosedBelowClosestSupportZone(_timeFrame) && (marketObserver.getClosestSupportZone().buyEntryManager.buyTradeTaken())) // FIFTH CASE: PRICE CLOSED UNDER THE ZONE, AND THE BUY IS TAKEN , SO WE WANNA CLOSE THE ORDER + { + + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THIS ZONE ** A candle closed below the support zone, i am in a buy trade and im gonna close the position and delete the zone, Symbol: " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + marketObserver.getClosestSupportZone().buyEntryManager.setTradeTakenStatus(false); + + // Make sure that the trades didnt hit the stop loss first + marketObserver.getClosestSupportZone().buyTradeManager.cleanOrderDataStructures(); + for(int i=0; i<3; i++) + { + marketObserver.getClosestSupportZone().buyTradeManager.closeTrade(i); + } + + string _idToDelete = marketObserver.getClosestSupportZone().getId(); + deleteZoneWithGUI(_idToDelete); + } + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void handleSells(ENUM_TIMEFRAMES _timeFrame) + { + + + + +// SELL CASE + + if((marketObserver.getClosestResistanceZone() != NULL) && !(marketObserver.getClosestResistanceZone().sellEntryManager.isWaitingForRejectionCandle()) && !(marketObserver.getClosestResistanceZone().sellEntryManager.sellTradeTaken()) && !(marketObserver.getClosestResistanceZone().sellEntryManager.isWaitingForRetracement())) // FIRST CASE : PRICE IS IN THE MIDDLE + { + if(marketObserver.bullishCandleClosedInsideClosestResistanceZone(_timeFrame)) + { + marketObserver.getClosestResistanceZone().sellEntryManager.setWaitingForRejectionCandle(true); + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THE CURRENT ZONE ** M1 Bullish candle closed inside the resistance zone on " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + + } + + } + + else + if((marketObserver.getClosestResistanceZone() != NULL) && (marketObserver.getClosestResistanceZone().sellEntryManager.isWaitingForRejectionCandle()) && !(marketObserver.getClosestResistanceZone().sellEntryManager.sellTradeTaken())) // SECOND CASE : PRICE HAS CLOSED IN THE ZONE AND WAITING FOR REJECTION, AND THE TRADE HAS NOT BEEN TAKEN YET + { + + if(marketObserver.getClosestResistanceZone().sellEntryManager.sellRejectionDetector.rejectionByOneCandleFormed(_timeFrame)) + { + + + marketObserver.getClosestResistanceZone().sellEntryManager.setWaitingForRejectionCandle(false); + // let the market observer check where the rejection candle closed, was it inside the zone ? or outside ? if outside the zone was it too close to the zone? if too + double lastBearishCandleClosePrice = iClose(_Symbol,_timeFrame,1); + if(lastBearishCandleClosePrice < marketObserver.getClosestResistanceZone().getLowerEdge()) // rejection candle closed under the zone + { + + // now we need to check if closed twice as the zone height + + if((marketObserver.getClosestResistanceZone().getLowerEdge() - lastBearishCandleClosePrice) > marketObserver.getClosestResistanceZone().getZoneHeight()) // rejection candle closed in a distance more than the height of the zone + { + + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THE CURRENT ZONE ** Bearish rejection candle was formed, Price closed under the zone in a distance more than the height of the zone, in these cases i take an entry on imbalance fill or a retracement but at the moment im not trading these cases , Symbol: " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + marketObserver.getClosestResistanceZone().sellEntryManager.setWaitingForRetracement(true); + } + else // previous candle closed in a distance less than the height of the zone + { + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THE CURRENT ZONE ** Bearish rejection candle was formed, Price closed under the zone in a distance less than the height of the zone, im taking a sell now , Symbol: " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + + double stopLossPrice = marketObserver.getClosestResistanceZone().getStopLossPrice(); + double lotsToTrade = lotSizeCalculator.calculateLotSize(riskDollars,stopLossPrice); + for(int i=0 ; i<3 ; i++) // after this loop, the trade id's array will be filled, and the 3 trades will be taken + { + double partialLotPercent ; + if(i == 0) + { + partialLotPercent = 0.5 ; + } + if(i == 1 || i == 2) + { + partialLotPercent = 0.25; + } + ulong currentEntryId = marketObserver.getClosestResistanceZone().sellEntryManager.takeSellTrade(partialLotPercent * lotsToTrade,stopLossPrice); + marketObserver.getClosestResistanceZone().sellTradeManager.fillRejectionByOneCandleTradeArray(i,currentEntryId); + } + marketObserver.getClosestResistanceZone().sellEntryManager.setTradeTakenStatus(true); + + + } + + } + else + if(lastBearishCandleClosePrice < marketObserver.getClosestResistanceZone().getHigherEdge() && lastBearishCandleClosePrice > marketObserver.getClosestResistanceZone().getLowerEdge()) // rejection candle closed inside the zone + { + + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THE CURRENT ZONE ** Bearish Rejection Candle Closed inside the zone, im taking a sell now ! , Symbol: " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + double stopLossPrice = marketObserver.getClosestResistanceZone().getStopLossPrice(); + double lotsToTrade = lotSizeCalculator.calculateLotSize(riskDollars,stopLossPrice); + for(int i=0 ; i<3 ; i++) // after this loop, the trade id's array will be filled , and the 3 trades will be taken + { + double partialLotPercent ; + if(i == 0) + { + partialLotPercent = 0.5 ; + } + if(i == 1 || i == 2) + { + partialLotPercent = 0.25; + } + ulong currentEntryId = marketObserver.getClosestResistanceZone().sellEntryManager.takeSellTrade(partialLotPercent * lotsToTrade,stopLossPrice); + marketObserver.getClosestResistanceZone().sellTradeManager.fillRejectionByOneCandleTradeArray(i,currentEntryId); + } + marketObserver.getClosestResistanceZone().sellEntryManager.setTradeTakenStatus(true); + } + + // call trade manager + } + + } + + else + if((marketObserver.getClosestResistanceZone() != NULL) && marketObserver.getClosestResistanceZone().sellEntryManager.isWaitingForRetracement()) // THIRD CASE: WAITING FOR A RETRACEMENT BECAUSE THE REJECTION CANDLE CLOSED MORE THAN THE HEIGHT OF THE ZONE + { + + Print("Im waiting for retracement because the rejection candle closed more than the height of the zone, ** this messaage is just for testing, because i still do not take trades on these kind of setups **"); + + } + + + + + + if((marketObserver.getClosestResistanceZone() != NULL) && marketObserver.candleClosedAboveClosestResistanceZone(_timeFrame) && !(marketObserver.getClosestResistanceZone().sellEntryManager.sellTradeTaken())) // FOURTH CASE: PRICE CLOSED ABOVE THE ZONE, WE STILL HAVNT TOOK A TRADE, AND WE ARE NOT GONNA TAKE IT + { + + + + marketObserver.setClosestResistanceWaiting(true); + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THE CURRENT ZONE ** A candle closed above the resistance zone i havnet took a trade, im gonna delete the zone , Symbol: " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + + string _idToDelete = marketObserver.getClosestResistanceZone().getId(); + deleteZoneWithGUI(_idToDelete); + + + } + else + if((marketObserver.getClosestResistanceZone() != NULL) && marketObserver.candleClosedAboveClosestResistanceZone(_timeFrame) && (marketObserver.getClosestResistanceZone().sellEntryManager.sellTradeTaken())) // FIFTH CASE: PRICE CLOSED ABOVE THE ZONE, WE TOOK THE TRADE, AND WE NEED TO CLOSE IT + { + marketObserver.setClosestResistanceWaiting(true); + + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId,"** THIS MESSAGE SHOULD BE SEEN ONCE FOR THE CURRENT ZONE ** A candle closed above the resistance zone im in a sell and im gonna close it, and delete the zone, Symbol: " + _Symbol + " " + TimeToString(TimeLocal()), fileName); + marketObserver.getClosestResistanceZone().sellEntryManager.setTradeTakenStatus(false); + + // Make sure that the trades didnt hit the stop loss first + marketObserver.getClosestResistanceZone().sellTradeManager.cleanOrderDataStructures(); + for(int i=0; i<3; i++) + { + marketObserver.getClosestResistanceZone().sellTradeManager.closeTrade(i); + } + + string _idToDelete = marketObserver.getClosestResistanceZone().getId(); + deleteZoneWithGUI(_idToDelete); + + + } + + + } +//+----------------------- diff --git a/SellEntryManager.mqh b/SellEntryManager.mqh new file mode 100644 index 0000000..85f3e8d --- /dev/null +++ b/SellEntryManager.mqh @@ -0,0 +1,119 @@ +//+------------------------------------------------------------------+ +//| SellEntryManager.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + + +#include "SellRejectionDetector.mqh" +#include + + + + + +CTrade tradeShort ; + +class SellEntryManager + { +private: + + bool shortTradeTaken ; + bool waitingForRejectionCandle ; + bool waitingForRetracement ; + bool liquiditySweepEntryTaken ; + +public: + SellEntryManager(); + ~SellEntryManager(); + + SellRejectionDetector* sellRejectionDetector ; + + bool isWaitingForRejectionCandle(){return waitingForRejectionCandle ;} + void setWaitingForRejectionCandle(bool _setting){waitingForRejectionCandle = _setting ; } + + bool isWaitingForRetracement(){return waitingForRetracement;} + void setWaitingForRetracement(bool _setting){waitingForRetracement = _setting ;} + + + bool sellTradeTaken(); + void setTradeTakenStatus(bool _status){shortTradeTaken = _status ;} + + bool liqEntryIsTaken(){return liquiditySweepEntryTaken;} + void setLiquiditySweepEntryTaken(bool _entryStatus){liquiditySweepEntryTaken = _entryStatus ;} + + + + + ulong takeSellTrade(double _lots,double _stopLoss); + ulong takeSellTradeTiger(double _lots, double _stopLoss, double _takeProfit); + ulong takeSellTradeTiger(double _lots, double _stopLoss); + + + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +SellEntryManager::SellEntryManager() + { + + sellRejectionDetector = new SellRejectionDetector(); + shortTradeTaken = false ; + waitingForRejectionCandle = false ; + bool waitingForRetracement = false; + liquiditySweepEntryTaken = false; + + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +SellEntryManager::~SellEntryManager() + { + delete sellRejectionDetector; + } +//+------------------------------------------------------------------+ + +bool SellEntryManager:: sellTradeTaken(){ + + return shortTradeTaken ; +} + +ulong SellEntryManager:: takeSellTrade(double _lots, double _stopLoss){ + + tradeShort.Sell(NormalizeDouble(_lots,2),_Symbol,SymbolInfoDouble(_Symbol, SYMBOL_BID),_stopLoss); + ulong tradeTicket = tradeShort.ResultOrder(); + + Print("Sell entry manager has taken a trade, ticket: " + tradeTicket); + return tradeTicket; + + +} + + +ulong SellEntryManager:: takeSellTradeTiger(double _lots, double _stopLoss, double _takeProfit){ + + double netTp = SymbolInfoDouble(_Symbol, SYMBOL_BID); + netTp = netTp - _takeProfit ; + + tradeShort.Sell(NormalizeDouble(_lots,2),_Symbol,SymbolInfoDouble(_Symbol, SYMBOL_BID),_stopLoss,SymbolInfoDouble(_Symbol, SYMBOL_BID) - netTp); + + + ulong tradeTicket = tradeShort.ResultOrder(); + + Print("sELL entry manager has taken a trade, ticket: " + tradeTicket); + return tradeTicket; + +} + + +ulong SellEntryManager:: takeSellTradeTiger(double _lots, double _stopLoss){ + + tradeShort.Sell(NormalizeDouble(_lots,2),_Symbol,SymbolInfoDouble(_Symbol, SYMBOL_BID),_stopLoss); + ulong tradeTicket = tradeShort.ResultOrder(); + Print("sELL entry manager has taken a trade, ticket: " + tradeTicket); + return tradeTicket; + +} \ No newline at end of file diff --git a/SellGandalf.mqh b/SellGandalf.mqh new file mode 100644 index 0000000..a1c0560 --- /dev/null +++ b/SellGandalf.mqh @@ -0,0 +1,79 @@ +//+------------------------------------------------------------------+ +//| SellGandalf.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + + +#include + +CTrade tradeShort ; + +class SellGandalf + { +private: + bool shortTradeTaken ; + ulong longTrades[10] ; + +public: + SellGandalf(); + ~SellGandalf(); + + bool sellTradeTaken(); + void setTradeTakenStatus(bool _status){shortTradeTaken = _status ; Print("long trade taken flag has been set to true");} + + + ulong takeSellTrade(double _lots,double _stopLoss); + ulong takeSellTradeGandalf(double _lots,double _stopLoss); + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +SellGandalf::SellGandalf() + { + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +SellGandalf::~SellGandalf() + { + } +//+------------------------------------------------------------------+ + + +bool SellGandalf:: sellTradeTaken(){ + + +return shortTradeTaken ; +} + + + +ulong SellGandalf:: takeSellTrade(double _lots, double _stopLoss){ + + tradeShort.Sell(NormalizeDouble(_lots,2),_Symbol,SymbolInfoDouble(_Symbol, SYMBOL_BID),_stopLoss); + + ulong tradeTicket = tradeShort.ResultOrder(); + + Print("Sell entry manager has taken a trade, ticket: " + tradeTicket); + return tradeTicket; + + +} + + +ulong SellGandalf:: takeSellTradeGandalf(double _lots,double _stopLoss){ + + tradeShort.Sell(NormalizeDouble(_lots,2),_Symbol,SymbolInfoDouble(_Symbol, SYMBOL_BID),_stopLoss); + + ulong tradeTicket = tradeShort.ResultOrder(); + + Print("Sell entry manager has taken a trade, ticket: " + tradeTicket); + return tradeTicket; + +} + + diff --git a/SellRejectionDetector.mqh b/SellRejectionDetector.mqh new file mode 100644 index 0000000..a51b7f9 --- /dev/null +++ b/SellRejectionDetector.mqh @@ -0,0 +1,52 @@ +//+------------------------------------------------------------------+ +//| SellRejectionDetector.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +class SellRejectionDetector + { +private: + +public: + SellRejectionDetector(); + ~SellRejectionDetector(); + + bool rejectionByOneCandleFormed(ENUM_TIMEFRAMES _timeFrame); + bool rejectionByRangeFormed(); + bool rejectionByWicksFormed(); + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +SellRejectionDetector::SellRejectionDetector() + { + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +SellRejectionDetector::~SellRejectionDetector() + { + } +//+------------------------------------------------------------------+ + +bool SellRejectionDetector:: rejectionByOneCandleFormed(ENUM_TIMEFRAMES _timeFrame){ + + double rejectionCandleClose = iClose(_Symbol,_timeFrame,1); + double rejectionCandleOpen = iOpen(_Symbol,_timeFrame,1); + double rejectionCandleLow = iLow(_Symbol,_timeFrame,1); + double rejectionCandleLowerWickSize ; + double rejectionCandleBodySize; + + if(rejectionCandleOpen > rejectionCandleClose){ // the previous candle closed bearish + rejectionCandleLowerWickSize = rejectionCandleClose - rejectionCandleLow ; + rejectionCandleBodySize = rejectionCandleOpen - rejectionCandleClose; + if(rejectionCandleBodySize >= rejectionCandleLowerWickSize){ + return true ; + } + + } + return false ; +} \ No newline at end of file diff --git a/SellTradeManager.mqh b/SellTradeManager.mqh new file mode 100644 index 0000000..8ab5681 --- /dev/null +++ b/SellTradeManager.mqh @@ -0,0 +1,586 @@ +//+------------------------------------------------------------------+ +//| SellTradeManager.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +//#include +#include +#include +CTrade tradeInTradeManager; + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +class SellTradeManager + { +private: + int tradeId ; + ulong rejectionByOneCandleTradeArray[3]; // index 0 : half the contract , index 1 : quarter of the contract , index 2 : quarter of the contract + + + string firstSecureMethod ; + bool firstSecureMethodFound; + int numberOfTakeProfits ; + bool securedFirstLevelProfit ; + bool securedSecondLevelProfit; + double partialToClose ; + bool isTradeRunning ; + + +public: + SellTradeManager(); + ~SellTradeManager(); + + + void fillRejectionByOneCandleTradeArray(int _index, ulong _id) {rejectionByOneCandleTradeArray[_index] = _id ;} + ulong getRejectionByOneCandleTradeTicket(int _index) {return rejectionByOneCandleTradeArray[_index] ;} + void printRejectionByOneCandleTradeArray(); + + void checkAndSecureTradeIfNeeded(double _ratio, double _riskInDollars); + string findFirstSecureMethod(); + + bool reachedProfitRatio(int _indexInArr); + bool closeTrade(int _indexInArr); + bool positionBreakEven(int _indexInArr); + + void addTpAtIndex(int _index, double tpPrice) {tpArray[_index] = tpPrice;} + int countRemainingTakeProfits(); + bool reachedClosestTakeProfit(); + void deleteClosestTp(); + int findClosestTpIndex(); + + void cleanOrderDataStructures(); + + void setTradeRunning(bool _setting) {isTradeRunning = _setting ;} + bool tradeIsRunning() {return isTradeRunning ;} + + double tpArray[3]; + + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +SellTradeManager::SellTradeManager() + { + for(int i=0; i<3; i++) + { + tpArray[i] = -1; + } + securedFirstLevelProfit = false ; + securedSecondLevelProfit = false ; + firstSecureMethodFound = false ; + firstSecureMethod = "NOT_FOUND" ; + partialToClose = -1 ; + isTradeRunning = false ; + + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +SellTradeManager::~SellTradeManager() + { + } + +//+------------------------------------------------------------------+ +void SellTradeManager:: printRejectionByOneCandleTradeArray() + { + + Print("Printing the tickets :"); + for(int i=0 ; i<3 ; i++) + { + Print((int)rejectionByOneCandleTradeArray[i]); + } + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void SellTradeManager:: checkAndSecureTradeIfNeeded(double _ratio, double _riskInDollars) + { + + + if(securedFirstLevelProfit == false) // in this case im searching for 2 cases: either RR 1:1.5 , OR reaching the first TP , if any of them happened im gonna close half the order and updatae the remaining stop losses + { + + + if(!firstSecureMethodFound) + { + + firstSecureMethod = findFirstSecureMethod(); + if(firstSecureMethod != "FAILED") + { + firstSecureMethodFound = true ; + } + else + if(firstSecureMethod == "FAILED") + { + Print("Failed to find the first secure method, go check the function : findFirstSecureMehod() !"); + } + + } + + if(firstSecureMethodFound == true) + { + + if(firstSecureMethod == "RATIO_METHOD") + { + cleanOrderDataStructures(); // this is used each time before we are choosing an order by ticket + if(reachedProfitRatio(0)) + { + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId, + "If you see this message it means we reached the first secure method, which is ratio method, after this message, half of the order must be closed (2 trades will remain active), and the first quarter will be put into Break even " + TimeToString(TimeLocal()), fileName); + if(closeTrade(0)) // close the half + { + + rejectionByOneCandleTradeArray[0] = -1; + Print("Closed Half Of the position due to reaching the first secure Ratio!"); + } + else + { + Print("Failed Closing Half of the order by reaching the first secure Ratio !"); + } + + cleanOrderDataStructures(); // this is used each time before we are choosing an order by ticket + if(positionBreakEven(1)) // put the first quarter at break even + { + + Print(" First quarter has been put into break even due to reaching the first secure Ratio!"); + } + else + { + Print("Failed to Put the first quarter into break even"); + } + + numberOfTakeProfits = countRemainingTakeProfits(); + + Print("Number of remaining tps is: " + numberOfTakeProfits); + + securedFirstLevelProfit = true ; + } + + + + + + } + else + if(firstSecureMethod == "FIRST_TP_METHOD") + { + if(countRemainingTakeProfits() > 1) // there is at least 2 tp in the tp Array (because if this is the last tp then we want to close the whole order and not just a part of it) + { + if(reachedClosestTakeProfit()) // 2. Check if reached the first Tp + { + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId, + "If you see this message it means we reached the first secure method which is tp1, after this message, half of the order must be closed (2 trades will remain active), and the first quarter will be put into Break even " + TimeToString(TimeLocal()), fileName); + // close the first half and update remaining partials sl's and delete the closest take profit from the array + cleanOrderDataStructures(); // this is used each time before we are choosing an order by ticket + if(closeTrade(0)) // close the half + { + + rejectionByOneCandleTradeArray[0] = -1; + Print("Closed Half Of the position due to reaching the first TP!"); + + } + else + { + Print("Failed Closing Half of the order by reaching the first TP !"); + } + cleanOrderDataStructures(); // this is used each time before we are choosing an order by ticket + if(positionBreakEven(1)) // put the first quarter at break even + { + + Print(" First quarter has been put into break even due to reaching the first TP!"); + } + else + { + Print("Failed to Put the first quarter into break even"); + } + deleteClosestTp(); + numberOfTakeProfits = countRemainingTakeProfits(); // update the number of remaining take profits + // calculate the remaining tps + + Print("Number of remaining tps is: " + numberOfTakeProfits); + + securedFirstLevelProfit = true ; + + + } + } + else + if(numberOfTakeProfits = countRemainingTakeProfits() == 1) + { + if(reachedClosestTakeProfit()) + { + // close everything remained + } + } + } + + } + + + + } + else + if(securedFirstLevelProfit == true) // after securing the first level i just want to close the remaining partials by reaching the tp's + { + + if(countRemainingTakeProfits() == 1) + { + if(reachedClosestTakeProfit()) + { + // close everything + cleanOrderDataStructures(); + for(int i=0 ; i<3 ; i++) + { + closeTrade(i); + } + Print("Closed every thing because price reached the last Take Profit !"); + + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId, + "If you see this message it means that all order are closed as a result of reaching the last tp " + TimeToString(TimeLocal()), fileName); + deleteClosestTp(); + } + } + else + if(countRemainingTakeProfits() > 1) + { + if(reachedClosestTakeProfit()) + { + cleanOrderDataStructures(); + if(PositionSelectByTicket(rejectionByOneCandleTradeArray[1])) // DEALING WITH THE FIRST QUARTER + { + double currentLot = PositionGetDouble(POSITION_VOLUME); + if(partialToClose == -1) + { + partialToClose = currentLot/numberOfTakeProfits ; + } + if(tradeInTradeManager.PositionClosePartial(rejectionByOneCandleTradeArray[1],NormalizeDouble(partialToClose,2))) + { + uint res = tradeInTradeManager.ResultRetcode(); + if(res == 10009) + { + Print("Closed Partials successfully on the first quarter !"); + } + else + { + Print("The returned code is: " + res + " go check what it means !"); + } + + } + } + else + { + Print("Failed to select position by ticket, Error: " + GetLastError()); + Print("The EA tried to close partials on the first quarter, but it is closed, probably due to break even and thats why it couldnt select the order !"); + } + + + cleanOrderDataStructures(); + if(PositionSelectByTicket(rejectionByOneCandleTradeArray[2])) // DEALING WITH THE SECOND QUARTER + { + if(PositionGetDouble(POSITION_SL) > PositionGetDouble(POSITION_PRICE_OPEN)) // this is to put the second quarter at break even if its not already at break even + { + positionBreakEven(2); + + } + double currentLot = PositionGetDouble(POSITION_VOLUME); + if(partialToClose == -1) + { + partialToClose = currentLot/numberOfTakeProfits ; + } + if(tradeInTradeManager.PositionClosePartial(rejectionByOneCandleTradeArray[2],NormalizeDouble(partialToClose,2))) + { + uint res = tradeInTradeManager.ResultRetcode(); + if(res == 10009) + { + Print("Closed Partials successfully on the second quarter!"); + } + else + { + Print("The returned code is: " + res + " go check what it means !"); + } + + } + + } + deleteClosestTp(); + Print("Number Of Remained tps is: " + countRemainingTakeProfits()); + + + ChartRedraw(); // Make sure the chart is up to date + ChartScreenShot(0, fileName, 1024, 768, ALIGN_RIGHT); + SendTelegramMessage(TelegramApiUrl, TelegramBotToken, ChatId, + "If you see this message it means we reached a tp level (different than the first secure level), so partial positions will be closed, and the scond quarter must be in break even!" + TimeToString(TimeLocal()), fileName); + } + + } + + + } + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +string SellTradeManager:: findFirstSecureMethod() + { + + cleanOrderDataStructures(); // this is used each time before we are choosing an order by ticket + if(PositionSelectByTicket(rejectionByOneCandleTradeArray[0])) + { + double positionStopLoss = PositionGetDouble(POSITION_SL); + double positionOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN); + double firstTakeProfit = tpArray[findClosestTpIndex()]; + if(((positionOpenPrice-firstTakeProfit)/(positionStopLoss-positionOpenPrice) > firstSecureRatio)) // firstTp > ratio + { + Print("Found the first profit secure method !"); + Print("The first TP RR is: 1:" + (positionOpenPrice-firstTakeProfit)/(positionStopLoss-positionOpenPrice) + "the firstSecureRatio is: 1:" + firstSecureRatio); + Print("The tp ratio is greater than the firstSecure so:"); + Print("The first secure method is RATIO_METHOD"); + return"RATIO_METHOD"; + } + else + if((positionOpenPrice-firstTakeProfit)/(positionStopLoss-positionOpenPrice)< firstSecureRatio) + { + Print("Found the first profit secure method !"); + Print("The first TP RR is: 1:" + (positionOpenPrice-firstTakeProfit)/(positionStopLoss-positionOpenPrice) + "the firstSecureRatio is: 1:" + firstSecureRatio); + Print("The tp ratio is less than the firstSecure so:"); + Print("The first secure method is FIRST_TP_METHOD"); + return "FIRST_TP_METHOD" ; + } + } + else + { + Print("Failed to select position by ticket 1, Error: " + GetLastError()); + } + + return "FAILED" ; + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool SellTradeManager:: reachedProfitRatio(int _indexInArr) + { + ulong _ticket = rejectionByOneCandleTradeArray[_indexInArr]; + if(_ticket != -1) + { + if(PositionSelectByTicket(_ticket)) + { + if(PositionGetDouble(POSITION_PROFIT)/(0.5*riskDollars) >= firstSecureRatio) // checking if the first half of the contract reached the ratio of first secure profit + { + Print("reached profit ratio !"); + return true ; + } + } + else + { + Print("Failed to select the position by ticket 4 ,Error: " + GetLastError()); + + } + + } + + return false ; + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool SellTradeManager:: closeTrade(int _indexInArr) + { + + + ulong _ticket = rejectionByOneCandleTradeArray[_indexInArr]; + if(_ticket != -1) + { + if(PositionSelectByTicket(_ticket)) + { + + // close the first half and update remaining partials sl's + if(tradeInTradeManager.PositionClose(_ticket)) + { + return true ; + + } + else + { + + Print("Failed to close positon, Error:" + GetLastError()); + return false; + } + + } + else + { + + Print("Failed to select position by ticket 2, Error: "+ GetLastError()); + return false; + } + + } + + + return false ; + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool SellTradeManager:: positionBreakEven(int _indexInArr) + { + + ulong _ticket = rejectionByOneCandleTradeArray[_indexInArr]; + if(_ticket != -1) + { + if(PositionSelectByTicket(_ticket)) // select the first quarter + { + double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); + double positionTp = PositionGetDouble(POSITION_TP); + double positionSl = PositionGetDouble(POSITION_SL); + + if(tradeInTradeManager.PositionModify((_ticket),openPrice,positionTp)) + { + + + return true ; + } + else + { + Print("Failed to modify oder , ERROR: " + GetLastError()); + return false ; + } + + } + else + { + Print("Failed to select position by ticket 3"); + return false ; + } + } + + + return false ; + + } +//+------------------------------------------------------------------+ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int SellTradeManager:: countRemainingTakeProfits() + { + + int counter = 0 ; + for(int i=0; i<3 ; i++) + { + if(tpArray[i] != -1) + { + counter++ ; + } + } + + return counter; + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void SellTradeManager:: deleteClosestTp() + { + + int closestTpIndex =findClosestTpIndex(); + tpArray[closestTpIndex] = -1; + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int SellTradeManager:: findClosestTpIndex() + { + int closestTpIndex = 0; + + for(int i=1; i<3; i++) + { + if(tpArray[i] > tpArray[closestTpIndex]) + { + closestTpIndex = i ; + } + } + + return closestTpIndex ; + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool SellTradeManager:: reachedClosestTakeProfit() + { + + + double closestTakeProfitValue = tpArray[findClosestTpIndex()]; +//Print("im in reached closest take profit function ,the current price is: " + SymbolInfoDouble(_Symbol, SYMBOL_BID) + " and the tp is: " + closestTakeProfitValue); + if(SymbolInfoDouble(_Symbol, SYMBOL_ASK) <= closestTakeProfitValue) // we want the ASK because we are basically buying the asset again (in a cheaper price), and we want to buy it on the ASK (which is the price that a seller is willing to sell us) + { + return true ; + } + return false ; + + } +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void SellTradeManager:: cleanOrderDataStructures() + { +// this is to make sure, that every closed order is removed from the data strucutre ! + + for(int i=0; i<3; i++) + { + if(!PositionSelectByTicket(rejectionByOneCandleTradeArray[i])) + { + if(GetLastError() == 4753) + { + rejectionByOneCandleTradeArray[i] = -1 ; + } + } + } + + } +//+------------------------------------------------------------------+ diff --git a/SellTradeManagerTiger.mqh b/SellTradeManagerTiger.mqh new file mode 100644 index 0000000..ce5dfdd --- /dev/null +++ b/SellTradeManagerTiger.mqh @@ -0,0 +1,69 @@ +//+------------------------------------------------------------------+ +//| SellTradeManagerTiger.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +class SellTradeManagerTiger + { +private: + ulong tradeId ; + string entryType ; + bool firstPartialSecured ; + bool secondPartialSecured ; + bool managedRisk ; + int riskManagementCandleCounter ; + double brokenSupportHigherEdge ; + double brokenSupportLowerEdge ; +public: + ulong getTradeId(){return tradeId ;} + + bool riskAlreadyManaged(){return managedRisk ;} + void manageRisk(){managedRisk = true ;} + + bool firstPartialIsSecured(){return firstPartialSecured ;} + void secureFirstPartial(){firstPartialSecured = true ;} + + bool retestWickFormed ; + double retestWickLengthInPips ; + + void setBrokenSupportHigherEdge(double _brokenSupportHigherEdge){brokenSupportHigherEdge = _brokenSupportHigherEdge ;} + void setBrokenSupportLowerEdge(double _brokenSupportLowerEdge){brokenSupportLowerEdge = _brokenSupportLowerEdge ;} + + double getBrokenSupportHigherEdge(){return brokenSupportHigherEdge ;} + double getBrokenSupportLowerEdge(){return brokenSupportLowerEdge;} + + void incrementRiskManagementCandleCoutner(){riskManagementCandleCounter++ ;} + void decrementRiskManagementCandleCounter(){riskManagementCandleCounter-- ;} + + int getRiskManagementCandleCounter(){return riskManagementCandleCounter ;} + void setRiskManagementCandleCounter(int count){ riskManagementCandleCounter = count ;} + + + SellTradeManagerTiger(ulong _tradeId); + ~SellTradeManagerTiger(); + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +SellTradeManagerTiger::SellTradeManagerTiger(ulong _tradeId) + { + + tradeId = _tradeId ; + firstPartialSecured = false ; + secondPartialSecured = false ; + managedRisk = false ; + + retestWickFormed = false ; + retestWickLengthInPips = 0 ; + riskManagementCandleCounter = 0 ; + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +SellTradeManagerTiger::~SellTradeManagerTiger() + { + } +//+------------------------------------------------------------------+ diff --git a/SellTradeMangerTiger.mqh b/SellTradeMangerTiger.mqh new file mode 100644 index 0000000..0a82a3b --- /dev/null +++ b/SellTradeMangerTiger.mqh @@ -0,0 +1,29 @@ +//+------------------------------------------------------------------+ +//| SellTradeMangerTiger.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +class SellTradeMangerTiger + { +private: + +public: + SellTradeMangerTiger(); + ~SellTradeMangerTiger(); + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +SellTradeMangerTiger::SellTradeMangerTiger() + { + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +SellTradeMangerTiger::~SellTradeMangerTiger() + { + } +//+------------------------------------------------------------------+ diff --git a/Shark.mq5 b/Shark.mq5 new file mode 100644 index 0000000..1074547 --- /dev/null +++ b/Shark.mq5 @@ -0,0 +1,846 @@ +//+------------------------------------------------------------------+ +//| ZoneScanner.mq5 | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + + +// INPUT VARIABLES +input ENUM_TIMEFRAMES inputTimeFrameFractals ; + + + +// FRACTAL VARIABLES INITIALIZATION + +input int leftPeriod; +input int rightPeriod; +input int weekPeriodToInitialize; +input int initFractalsPeriod ; +int lowFractalIndex ; +int highFractalIndex ; + + + + +// GUI CLASSES INCLUDES +#include "ZoneContainer.mqh" +#include "GraphicalObjectsManager.mqh" +#include "ObjectConfirmationUnit.mqh" +#include "TempObjectAttributes.mqh" + + +// DATA STRUCTURE CLASSES INCLUDES +#include "Zone.mqh" +#include "LowFractal.mqh" +#include "HighFractal.mqh" +#include "LowFractalContainer.mqh" +#include "HighFractalContainer.mqh" + + +// ALGORITHM CLASSES INCLUDES + +#include "NewCandleDetector.mqh" + +// LIBRARIES INCLUDES +#include + + +// GUI CLASSES INITIALIZATION +GraphicalObjectsManager* objectsManager = new GraphicalObjectsManager(); +ObjectConfirmationUnit* objectConfUnit = new ObjectConfirmationUnit(); +TempObjectAttributes* tempObjectAttr = new TempObjectAttributes(); + + +// CONTAINERS INITIALIZATION +ZoneContainer zoneContainer ; +LowFractalContainer* lowsContainer = new LowFractalContainer(inputTimeFrameFractals) ; + +HighFractalContainer* highsContainer = new HighFractalContainer(inputTimeFrameFractals) ; + + + + + +// GENERAL CHART VARIABLES INITIALIZATION +bool initialized = false ; +bool firstCandleAfterStart = true ; + + +// NEW CANDLE CLASSES INITIALIZATION + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + +/*NewCandleDetector* newCandleDetectorM1 = new NewCandleDetector("PERIOD_M1"); +NewCandleDetector* newCandleDetectorM5 = new NewCandleDetector("PERIOD_M5"); +NewCandleDetector* newCandleDetectorM15 = new NewCandleDetector("PERIOD_M15"); +NewCandleDetector* newCandleDetectorM30 = new NewCandleDetector("PERIOD_M30"); +NewCandleDetector* newCandleDetectorH1 = new NewCandleDetector("PERIOD_H1"); +NewCandleDetector* newCandleDetectorH4 = new NewCandleDetector("PERIOD_H4"); +NewCandleDetector* newCandleDetectorD1 = new NewCandleDetector("PERIOD_D1"); */ + + + +// LIVE FORMING FRACTALS HANDLER CLASS +NewCandleDetector* newCandleDetectorLive ; + + +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- create timer + EventSetTimer(60); + //Print("the ask is: " + SymbolInfoDouble(_Symbol, SYMBOL_ASK)); + +// THIS IS FOR SETTING THE NEW CANDLE DETECTOR TIMEFRAME FOR THE LIVE FRACTALS . (IN ORDER TO KNOW WHICH TIMEFRAME OF THE LIVE FRACTALS TO TAKE) + + if(inputTimeFrameFractals == PERIOD_M1) + { + + newCandleDetectorLive = new NewCandleDetector("PERIOD_M1"); + + } + else + if(inputTimeFrameFractals == PERIOD_M5) + { + + newCandleDetectorLive = new NewCandleDetector("PERIOD_M5"); + } + else + if(inputTimeFrameFractals == PERIOD_M15) + { + newCandleDetectorLive = new NewCandleDetector("PERIOD_M15"); + + } + else + if(inputTimeFrameFractals == PERIOD_M30) + { + + newCandleDetectorLive = new NewCandleDetector("PERIOD_M30"); + } + else + if(inputTimeFrameFractals == PERIOD_H1) + { + newCandleDetectorLive = new NewCandleDetector("PERIOD_H1"); + + } + else + if(inputTimeFrameFractals == PERIOD_H4) + { + newCandleDetectorLive = new NewCandleDetector("PERIOD_H4"); + + } + else + if(inputTimeFrameFractals == PERIOD_D1) + { + newCandleDetectorLive = new NewCandleDetector("PERIOD_D1"); + + } + + + if(initialized == false) + { + Print("Shark Initialized successfully on " + Symbol()); + + // ADD THE BUTTONS TO THE SCREEN + objectsManager.addZoneButton(); + objectsManager.addConfirmButton(); + objectsManager.addDeleteButton(); + objectsManager.addExitExperAdvisorButton(); + objectsManager.addPrintFractalsButton(); + objectsManager.addPrintZonesButton(); + + // INIT FRACTAL VARIABLES + lowFractalIndex = rightPeriod+1 ; // this is used for the fractals + highFractalIndex = rightPeriod+1; // this is used for the fractals + initLowFractalsFromIndex(initFractalsPeriod,inputTimeFrameFractals); + initHighFractalsFromIndex(initFractalsPeriod,inputTimeFrameFractals); + + // INITIALIZATION FLAG + initialized = true ; + + + } + + + + +//--- + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- destroy timer + /*Print("Low Fractals:"); + lowsContainer.printLowFractals(); + Print(" "); + Print("High Fractals:"); + highsContainer.printhighFractals(); + Print(" "); */ + + + + + + + + + + EventKillTimer(); + + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- + + + + if(newCandleDetectorLive.isNewCandle()) + { + handleLowFractals(inputTimeFrameFractals); // scans low fractals that are forming and adds them to the container + handleHighFractals(inputTimeFrameFractals); // scans high fractals that are forming and adds them to the container + } + + + + + + + + + + } +//+------------------------------------------------------------------+ +//| Timer function | +//+------------------------------------------------------------------+ +void OnTimer() + { +//--- + + } +//+------------------------------------------------------------------+ +//| Trade function | +//+------------------------------------------------------------------+ +void OnTrade() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TradeTransaction function | +//+------------------------------------------------------------------+ +void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) + { +//--- + + } +//+------------------------------------------------------------------+ +//| Tester function | +//+------------------------------------------------------------------+ +double OnTester() + { +//--- + double ret=0.0; +//--- + +//--- + return(ret); + } +//+------------------------------------------------------------------+ +//| TesterInit function | +//+------------------------------------------------------------------+ +void OnTesterInit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterPass function | +//+------------------------------------------------------------------+ +void OnTesterPass() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterDeinit function | +//+------------------------------------------------------------------+ +void OnTesterDeinit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| ChartEvent function | +//+------------------------------------------------------------------+ +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) + { +//--- +//--- left-clicking on a chart + + switch(id) + { + + case CHARTEVENT_CLICK: + { + + break; + } + + + + + //--- clicking on a graphical object + case CHARTEVENT_OBJECT_CLICK: + { + if(sparam == "ZONE_ADD_BTN") + { + + if(objectConfUnit.getWaitingStatus() == false) // THIS IS TO MAKE SURE THERE IS NO OTHER OBJECT SELECTED + { + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getZonesIdCounter(); + objectsManager.drawRectangle(currentIdCounter); // create a rectangle . set its name to be the current zonesIdCounter (and that would be the id of this current zone ) + objectConfUnit.setWaitingStatus(true); + objectConfUnit.setObjectType("OBJ_RECTANGLE"); + objectConfUnit.setConfirmationObjectId(currentIdCounter); + zoneContainer.incrementZonesIdCounter(); + + + + } + else + { + + Print("Failed to Add a new Object, Make sure to confirm the previous object first! ."); + } + + + + } + + else + if(sparam == "CONFIRM_BTN") + { + + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THAT THERE IS SOMETHING SELECTED TO BE CONFIRMED + { + + + if(objectConfUnit.getObjectType() == "OBJ_RECTANGLE") // CASE OF ZONE + { + + if(zoneContainer.getZoneIndex(objectConfUnit.getConfirmationObjectId()) != -1) // means the zone already in the data structure, in this case we just need to update it + { + + // update the zone attributes + // zoneContainer.UpdateZone(int id); + Zone* tempZone = new Zone(); + + tempZone.setHigherEdgePrice(tempObjectAttr.getHigherEdgePrice()) ; + tempZone.setLowerEdgePrice(tempObjectAttr.getLowerEdgePrice()); + tempZone.setLeftEdge(tempObjectAttr.getLeftEdgeTime()); + tempZone.setRightEdge(tempObjectAttr.getRightEdgeTime()); + tempZone.setTimeFrame(tempObjectAttr.getTimeFrame()); + + string idOfOriginalZone = objectConfUnit.getConfirmationObjectId(); + // no need to set the ID here because the ID belongs to the original zone and not this new temp one (this is just a temporary zone to check if the adjustment is valid or no) + + if(zoneContainer.updateZone(tempZone, idOfOriginalZone) ==1) + { + // in this case we successfully updated the zone + + Print("Updated the object:" + + "\n ID: " + objectConfUnit.getConfirmationObjectId() + + "\n Type: " + objectConfUnit.getObjectType() + + "\n Asset: " + tempObjectAttr.getSymbol() + + "\n Time Frame:" + tempObjectAttr.getTimeFrame() + + "\n Higher Edge Price: " + tempObjectAttr.getHigherEdgePrice() + + "\n Lower Edge Price: " + tempObjectAttr.getLowerEdgePrice() + + "\n Left Edge Date: " + tempObjectAttr.getLeftEdgeTime() + + "\n Right Edge Date: " + tempObjectAttr.getRightEdgeTime() + ); + + delete tempZone; + if(ObjectSetInteger(_Symbol,objectConfUnit.getConfirmationObjectId(),OBJPROP_SELECTED,false) == true) // this is to unselect the object once we finish using it + { + } + else + { + Print("Failed to unselect the object. Error: " + GetLastError()); + } + + // THIS IS TO CLEAN THE objectConfUnit + objectConfUnit.setWaitingStatus(false); + ChartRedraw(); + } + else + { + + Print("Failed to update the zone, please reposition it"); + } + + } + + else // means the zone is new so we need to add it + { + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(tempObjectAttr.getHigherEdgePrice()); + newZone.setLowerEdgePrice(tempObjectAttr.getLowerEdgePrice()); + newZone.setLeftEdge(tempObjectAttr.getLeftEdgeTime()); + newZone.setRightEdge(tempObjectAttr.getRightEdgeTime()); + newZone.setId(objectConfUnit.getConfirmationObjectId()); + newZone.setTimeFrame(tempObjectAttr.getTimeFrame()); + if(tempObjectAttr.getHigherEdgePrice() < SymbolInfoDouble(_Symbol, SYMBOL_ASK) ){ // means its a support zone + newZone.setType("TYPE_SUPPORT"); + } + if(tempObjectAttr.getLowerEdgePrice() > SymbolInfoDouble(_Symbol, SYMBOL_ASK)){ // means its a resistance zone + newZone.setType("TYPE_RESISTANCE"); + } + // add the zone to the data structure + if(zoneContainer.addZone(newZone) == 1) + { + zoneContainer.findOrUpdatePivotEdges(); // update the pivot edges + Print("Added the object:" + + "\n ID: " + objectConfUnit.getConfirmationObjectId() + + "\n Type: " + objectConfUnit.getObjectType() + + "\n Asset: " + tempObjectAttr.getSymbol() + + "\n Time Frame:" + tempObjectAttr.getTimeFrame() + + "\n Higher Edge Price: " + tempObjectAttr.getHigherEdgePrice() + + "\n Lower Edge Price: " + tempObjectAttr.getLowerEdgePrice() + + "\n Left Edge Date: " + tempObjectAttr.getLeftEdgeTime() + + "\n Right Edge Date: " + tempObjectAttr.getRightEdgeTime() + ); + + + + if(ObjectSetInteger(_Symbol,objectConfUnit.getConfirmationObjectId(),OBJPROP_SELECTED,false) == true) // this is to unselect the object once we finish using it + { + } + else + { + Print("Failed to unselect the object. Error: " + GetLastError()); + } + + // THIS IS TO CLEAN THE objectConfUnit + objectConfUnit.setWaitingStatus(false); + } + else + { + Print("Failed to add the zone, Error: 2 or more zones are crossing"); + } + + ChartRedraw(); + } + + + + + + } + + else + if(objectConfUnit.getObjectType() == "OBJ_TRENDLINE") // CASE OF TRENDLINE + { + + + } + + + } + else + { + + Print("Cannot confirm, Please select an object first !"); + } + + } + + else + if(sparam == "DELETE_BTN") + { + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THAT THERE IS SOMETHING SELECTED TO BE DELETED + { + if(ObjectDelete(_Symbol,objectConfUnit.getConfirmationObjectId())) + { + if(zoneContainer.deleteZone(objectConfUnit.getConfirmationObjectId()) == 1) + { // delete from data structure + zoneContainer.findOrUpdatePivotEdges(); + Print("Deleted the object: " + + "\n Type: " + objectConfUnit.getObjectType() + + "\n ID: " + objectConfUnit.getConfirmationObjectId()); + + objectConfUnit.setWaitingStatus(false); + objectConfUnit.setObjectType("NO_OBJECT"); + objectConfUnit.setConfirmationObjectId(-2); + + ChartRedraw(); + } + else{ + objectConfUnit.setWaitingStatus(false); + objectConfUnit.setObjectType("NO_OBJECT"); + objectConfUnit.setConfirmationObjectId(-2); + } + } + + } + else + { + + Print("Cannot delete, Please select an object first !"); + } + + } + else + if(sparam == "EXIT_BTN") + { + delete objectsManager ; + delete objectConfUnit; + delete tempObjectAttr; + delete lowsContainer; + delete highsContainer; + + delete newCandleDetectorLive; + zoneContainer.freeZonesSortedArray(); + /*delete newCandleDetectorD1; + delete newCandleDetectorM5; + delete newCandleDetectorM30; + delete newCandleDetectorM15; + delete newCandleDetectorM1; + delete newCandleDetectorH4; + delete newCandleDetectorH1; */ + + + + + + ExpertRemove(); + } + else + if(sparam == "PRINT_FRACTAL_BTN") + { + Print("Low Fractals:"); + lowsContainer.printLowFractals(); + Print("High Fractals:"); + highsContainer.printHighFractals(); + } + + else + if(sparam == "PRINT_ZONES_BTN") + { + + zoneContainer.printZonesSortedArray(); + } + else // THIS is the case were we click on any object except for the 'Add Zone' and 'Confirm Object' Buttons + { + + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THERE IS NO OTHER OBJECT SELECTED + { + Print("Cannot select the object clicked, Make sure to confirm a previous selected object first !"); + } + else + { + ObjectSetInteger(_Symbol,sparam,OBJPROP_SELECTED,true); + + if(ObjectGetInteger(_Symbol,sparam,OBJPROP_TYPE,0) == OBJ_RECTANGLE) + { + Print("Selected the object:" + + "\n Type: OBJ_RECTANGLE" + + "\n ID: " + sparam); + objectConfUnit.setWaitingStatus(true) ; + objectConfUnit.setConfirmationObjectId(StringToInteger(sparam)); + objectConfUnit.setObjectType("OBJ_RECTANGLE"); + ChartRedraw(); + } + + + + + + } + + } + + + break; + } + + + //--- object moved or anchor point coordinates changed + case CHARTEVENT_OBJECT_DRAG: + { + + double _higherEdgePrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,1); + double _lowerEdgePrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0); + + datetime _leftEdgeTime = (datetime)ObjectGetInteger(_Symbol,sparam,OBJPROP_TIME,0); + datetime _rightEdgeTime = (datetime)ObjectGetInteger(_Symbol,sparam,OBJPROP_TIME,1); + + if(_higherEdgePrice < _lowerEdgePrice) // this is the case were the user flips the rectangle while adjusting it. + { + tempObjectAttr.setHigherEdgePrice(_lowerEdgePrice); + tempObjectAttr.setLowerEdgePrice(_higherEdgePrice); + } + else + { + tempObjectAttr.setHigherEdgePrice(_higherEdgePrice); + tempObjectAttr.setLowerEdgePrice(_lowerEdgePrice); + } + + tempObjectAttr.setLeftEdgeTime(_leftEdgeTime); + tempObjectAttr.setRightEdgeTime(_rightEdgeTime); + tempObjectAttr.setSymbol(); + tempObjectAttr.setTimeFrame(getChartTimeFrameInString()); + break; + } + + } + + } + + +//+------------------------------------------------------------------+ +//| BookEvent function | +//+------------------------------------------------------------------+ +void OnBookEvent(const string &symbol) + { +//--- + + } +//+------------------------------------------------------------------+ + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void initLowFractalsFromIndex(int _index,ENUM_TIMEFRAMES timeFramePeriod) + { + + for(int i=_index ; i> rightPeriod ; i--) + { + + bool accessDeniedLows = false ; // variable for dealing with equal consecutive fractals + + + + if(isLowFractalByIndex(i,leftPeriod,rightPeriod,timeFramePeriod) == true) + { + + if(lowsContainer.getFreeIndex() > 0) + { + + if(iLow(Symbol(),timeFramePeriod,i) == lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getPrice()) // if low fractal is equal to the previous low fractal + { + if(lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getDistance() - i < 2*rightPeriod) // if the 2 lows are inside the range of 2 times of right period + { + accessDeniedLows = true ; + } + + } + } + + if(accessDeniedLows == false) + { + + + LowFractal* currentFractal = new LowFractal(iLow(Symbol(),timeFramePeriod,i),leftPeriod,rightPeriod,TimeCurrent(),timeFramePeriod); + currentFractal.setDate(iTime(Symbol(),timeFramePeriod,i)); + currentFractal.setDistance(i); + int NumberOfCandle = i-1; + string NumberOfCandleText = IntegerToString(NumberOfCandle); + currentFractal.setArrowObjName(NumberOfCandleText); + lowsContainer.addLowFractal(currentFractal); + + } + + + } + + } + + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void initHighFractalsFromIndex(int _index,ENUM_TIMEFRAMES timeFramePeriod) + { + + for(int i=_index ; i> rightPeriod ; i--) + { + + bool accessDeniedHighs = false ; // variable for dealing with equal consecutive fractals + + + + if(isHighFractalByIndex(i,leftPeriod,rightPeriod,timeFramePeriod) == true) + { + + if(highsContainer.getFreeIndex() > 0) + { + + if(iHigh(Symbol(),timeFramePeriod,i) == highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getPrice()) // if high fractal is equal to the previous high fractal + { + + if(highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getDistance() - i < 2*rightPeriod) // if the 2 highs are inside the range of 2 times of right period + { + + accessDeniedHighs = true ; + } + + } + } + + if(accessDeniedHighs == false) + { + + + HighFractal* currentFractal = new HighFractal(iHigh(Symbol(),timeFramePeriod,i),leftPeriod,rightPeriod,TimeCurrent(),timeFramePeriod); + currentFractal.setDate(iTime(Symbol(),timeFramePeriod,i)); + currentFractal.setDistance(i); + int NumberOfCandle = i-1; + string NumberOfCandleText = IntegerToString(NumberOfCandle); + currentFractal.setArrowObjName(NumberOfCandleText); + highsContainer.addHighFractal(currentFractal); + + } + + + } + + } + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void handleLowFractals(ENUM_TIMEFRAMES tf) + { + + bool accessDeniedLows = false ; // variable for dealing with equal consecutive fractals if its true, then the current fractal will not be added + + for(int x=0 ; x 0) + { + + if(iLow(Symbol(),tf,lowFractalIndex) == lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getPrice()) // if low fractal is equal to the previous low fractal + { + + if(lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getDistance() <= 2*rightPeriod) // if the 2 lows are inside the range of 2 times of right period + { + + accessDeniedLows = true ; + } + + } + } + + if(accessDeniedLows == false) + { + + LowFractal* currentFractal = new LowFractal(iLow(Symbol(),tf,lowFractalIndex),leftPeriod,rightPeriod,TimeCurrent(),tf); + + int NumberOfCandle = Bars(Symbol(),tf); + string NumberOfCandleText = IntegerToString(NumberOfCandle); + currentFractal.setArrowObjName(NumberOfCandleText); + lowsContainer.addLowFractal(currentFractal); + Print("added a new low fractal !"); + + } + + + } + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void handleHighFractals(ENUM_TIMEFRAMES tf) + { + + + bool accessDeniedHighs = false ; // variable for dealing with equal consecutive fractals + + for(int x=0 ; x 0) + { + + if(iHigh(Symbol(),tf,highFractalIndex) == highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getPrice()) // if high fractal is equal to the previous high fractal + { + if(highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getDistance() <= 2*rightPeriod) // if the 2 highs are inside the range of 2 times of right period + { + accessDeniedHighs = true ; + } + + } + } + + if(accessDeniedHighs == false) + { + + + HighFractal* currentFractal = new HighFractal(iHigh(Symbol(),tf,highFractalIndex),leftPeriod,rightPeriod,TimeCurrent(),tf); + + int NumberOfCandle = Bars(Symbol(),tf); + string NumberOfCandleText = IntegerToString(NumberOfCandle); + currentFractal.setArrowObjName(NumberOfCandleText); + highsContainer.addHighFractal(currentFractal); + Print("added a new high fractal !"); + } + + + } + + + } + + + +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ diff --git a/Shark_tester.mq5 b/Shark_tester.mq5 new file mode 100644 index 0000000..d89ba7c --- /dev/null +++ b/Shark_tester.mq5 @@ -0,0 +1,1191 @@ +//+------------------------------------------------------------------+ +//| ZoneScanner.mq5 | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + + +// INPUT VARIABLES +input ENUM_TIMEFRAMES inputTimeFrameFractals ; + + + +// FRACTAL VARIABLES INITIALIZATION + +input int leftPeriod; +input int rightPeriod; +input int weekPeriodToInitialize; +input int initFractalsPeriod ; +int lowFractalIndex ; +int highFractalIndex ; + + + + +// GUI CLASSES INCLUDES +#include "GraphicalObjectsManager.mqh" +#include "ObjectConfirmationUnit.mqh" +#include "TempObjectAttributes.mqh" +#include "TempLineObjectAttributes.mqh" + + +// DATA STRUCTURE CLASSES INCLUDES +#include "Zone.mqh" +#include "ZoneContainer.mqh" +#include "LowFractal.mqh" +#include "HighFractal.mqh" +#include "LowFractalContainer.mqh" +#include "HighFractalContainer.mqh" + + +// ALGORITHM CLASSES INCLUDES + +#include "NewCandleDetector.mqh" +#include "MarketObserver.mqh" + + +// TRADE RELATED CLASSES INCLUDES +#include "BuyEntryManager.mqh" +#include "SellEntryManager.mqh" +#include "BuyTradeManager.mqh" +#include "SellTradeManager.mqh" + +// LIBRARIES INCLUDES +#include + + +// GUI CLASSES INITIALIZATION +GraphicalObjectsManager* objectsManager = new GraphicalObjectsManager(); +ObjectConfirmationUnit* objectConfUnit = new ObjectConfirmationUnit(); +TempObjectAttributes* tempObjectAttr = new TempObjectAttributes(); +TempLineObjectAttributes* tempLineObjectAttr = new TempLineObjectAttributes(); + + +// CONTAINERS INITIALIZATION +ZoneContainer zoneContainer ; +LowFractalContainer* lowsContainer = new LowFractalContainer(inputTimeFrameFractals) ; + +HighFractalContainer* highsContainer = new HighFractalContainer(inputTimeFrameFractals) ; + + +// ALGORITHM CLASSES INITIALIZATION + MarketObserver marketObserver = new MarketObserver(); + + + +// TRADE RELATED CLASSES INITIALIZATION +BuyEntryManager buyEntryManager = new BuyEntryManager(); +BuyTradeManager buyTradeManager = new BuyTradeManager(); + +SellEntryManager sellEntryManager = new SellEntryManager(); +SellTradeManager sellTradeManager = new SellTradeManager(); + + +// GENERAL CHART VARIABLES INITIALIZATION +bool initialized = false ; +bool firstCandleAfterStart = true ; + + +// ENTRY VARIABLES +string entryZoneType ; +bool lookForBuy = false ; +bool lookForSell = false ; + +// NEW CANDLE CLASSES INITIALIZATION + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + +/*NewCandleDetector* newCandleDetectorM1 = new NewCandleDetector("PERIOD_M1"); +NewCandleDetector* newCandleDetectorM5 = new NewCandleDetector("PERIOD_M5"); +NewCandleDetector* newCandleDetectorM15 = new NewCandleDetector("PERIOD_M15"); +NewCandleDetector* newCandleDetectorM30 = new NewCandleDetector("PERIOD_M30"); +NewCandleDetector* newCandleDetectorH1 = new NewCandleDetector("PERIOD_H1"); +NewCandleDetector* newCandleDetectorH4 = new NewCandleDetector("PERIOD_H4"); +NewCandleDetector* newCandleDetectorD1 = new NewCandleDetector("PERIOD_D1"); */ + + + +// LIVE FORMING FRACTALS HANDLER CLASS +NewCandleDetector* newCandleDetectorLive ; + + + +// Trade MANAGING VARIABLES +bool priceInMiddle = true ; +bool buyOnWait = false ; +bool buyOnAction = false; +bool sellOnWait = false; +bool sellOnAction = false ; + + + + + +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- create timer + EventSetTimer(60); +//Print("the ask is: " + SymbolInfoDouble(_Symbol, SYMBOL_ASK)); + +// THIS IS FOR SETTING THE NEW CANDLE DETECTOR TIMEFRAME FOR THE LIVE FRACTALS . (IN ORDER TO KNOW WHICH TIMEFRAME OF THE LIVE FRACTALS TO TAKE) + + if(inputTimeFrameFractals == PERIOD_M1) + { + + newCandleDetectorLive = new NewCandleDetector("PERIOD_M1"); + + } + else + if(inputTimeFrameFractals == PERIOD_M5) + { + + newCandleDetectorLive = new NewCandleDetector("PERIOD_M5"); + } + else + if(inputTimeFrameFractals == PERIOD_M15) + { + newCandleDetectorLive = new NewCandleDetector("PERIOD_M15"); + + } + else + if(inputTimeFrameFractals == PERIOD_M30) + { + + newCandleDetectorLive = new NewCandleDetector("PERIOD_M30"); + } + else + if(inputTimeFrameFractals == PERIOD_H1) + { + newCandleDetectorLive = new NewCandleDetector("PERIOD_H1"); + + } + else + if(inputTimeFrameFractals == PERIOD_H4) + { + newCandleDetectorLive = new NewCandleDetector("PERIOD_H4"); + + } + else + if(inputTimeFrameFractals == PERIOD_D1) + { + newCandleDetectorLive = new NewCandleDetector("PERIOD_D1"); + + } + + + if(initialized == false) + { + Print("Shark Initialized successfully on " + Symbol()); + + // ADD THE BUTTONS TO THE SCREEN + objectsManager.addZoneButton(); + objectsManager.addConfirmButton(); + objectsManager.addDeleteButton(); + objectsManager.addExitExperAdvisorButton(); + objectsManager.addPrintFractalsButton(); + objectsManager.addPrintZonesButton(); + objectsManager.addStopLossButton(); + objectsManager.addTakeProfitButton(); + objectsManager.addSetTakeProfitButton(); + + // INIT FRACTAL VARIABLES + lowFractalIndex = rightPeriod+1 ; // this is used for the fractals + highFractalIndex = rightPeriod+1; // this is used for the fractals + initLowFractalsFromIndex(initFractalsPeriod,inputTimeFrameFractals); + initHighFractalsFromIndex(initFractalsPeriod,inputTimeFrameFractals); + + // INITIALIZATION FLAG + initialized = true ; + + + } + + + + +//--- + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- destroy timer + /*Print("Low Fractals:"); + lowsContainer.printLowFractals(); + Print(" "); + Print("High Fractals:"); + highsContainer.printhighFractals(); + Print(" "); */ + + + + + + + + + + EventKillTimer(); + + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- + + if(newCandleDetectorLive.isNewCandle()) + { + handleLowFractals(inputTimeFrameFractals); // scans low fractals that are forming and adds them to the container + handleHighFractals(inputTimeFrameFractals); // scans high fractals that are forming and adds them to the container + } + + + + + /* if((priceInMiddle == true) && (buyOnAction == true)){ // THIS CASE MEANS WE ARE IN THE MIDDLE OF TWO ZONES , AND A BUY TRADE IS OPEN + buyTradeManager.handleTrade(); // this is responsible for exiting and taking partials + + if(marketObserver.candleClosedBelowSupportZone(&zoneContainer) == true){ + buyTradeManager.closeTrade(); + + buyOnAction = false ; + + } + else if(marketObserver.zoneReached(&zoneContainer) == "TYPE_RESISTANCE"){ + // close the buy + buyTradeManager.closeTrade(); + + buyOnAction = false ; + sellEntryManager.setLookingForSell(true) ; + } + + } */ + + /*else if((priceInMiddle == true) && (sellOnAction == true)){ // THIS CASE MEANS WE ARE IN THE MIDDLE OF TWO ZONES , AND A SELL TRADE IS OPEN + sellTradeManager.handleTrade();// this is responsible for exiting and taking partials + + if(marketObserver.candleClosedAboveResistanceZone(&zoneContainer) == true){ + sellTradeManager.closeTrade(); + + sellOnAction = false ; + } + else if(marketObserver.zoneReached(&zoneContainer) == "TYPE_SUPPORT"){ + // close the sell + sellTradeManager.closeTrade(); + + sellOnAction = false; + buyEntryManager.setLookingForBuy(true) ; + + } + + } */ + + + + + + if(priceInMiddle == true){ // THIS CASE MEANS WE ARE IN THE MIDDLE OF TWO ZONES , AND NO CURRENT TRADE IS OPEN + if(marketObserver.reachedClosestSupportZone(&zoneContainer)){ // we reached a support zone so looking for buys + Print("Reached a support zone ! i will inform you if a buy confiramtion happens "); + priceInMiddle = false; + buyEntryManager.setLookingForBuy(true) ; + sellEntryManager.setLookingForSell(false); + + + } + else if(marketObserver.reachedClosestResistanceZone(&zoneContainer)){ // we reached resistance zone so looking for sells + Print("Reached a resistance zone ! i will inform you if a sell confirmation happens "); + priceInMiddle = false; + sellEntryManager.setLookingForSell(true) ; + buyEntryManager.setLookingForBuy(false) ; + + } + else{ // we are still in the middle so do nothing + + } + + } + + + + + /*if(buyEntryManager.isLookingForBuy() == true){ + if(marketObserver.candleClosedBelowSupportZone(&zoneContainer) == true){ // trade idea is invalid , so wait the user to confirm the break of the zone + buyEntryManager.setLookingForBuy(false) ; + + } + else if(buyEntryManager.buyTaken() == true ){ + priceInMiddle = true ; + buyOnAction = true ; + buyEntryManager.setLookingForBuy(false) ; + + } + + else if(marketObserver.reachedClosestResistanceZone() == true){ + + buyEntryManager.setLookingForBuy(false); + } + } */ + + + + /*if(sellEntryManager.isLookingForSell() == true){ + if(marketObserver.candleClosedAboveResistanceZone(&zoneContainer) == true){ + sellEntryManager.setLookingForSell(false); + } + else if(sellEntryManager.sellTaken() == true){ + priceInMiddle = true ; + sellOnAction = true ; + sellEntryManager.setLookingForSell(false) ; + + } + } */ + + + + + } +//+------------------------------------------------------------------+ +//| Timer function | +//+------------------------------------------------------------------+ +void OnTimer() + { +//--- + + } +//+------------------------------------------------------------------+ +//| Trade function | +//+------------------------------------------------------------------+ +void OnTrade() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TradeTransaction function | +//+------------------------------------------------------------------+ +void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) + { +//--- + + } +//+------------------------------------------------------------------+ +//| Tester function | +//+------------------------------------------------------------------+ +double OnTester() + { +//--- + double ret=0.0; +//--- + +//--- + return(ret); + } +//+------------------------------------------------------------------+ +//| TesterInit function | +//+------------------------------------------------------------------+ +void OnTesterInit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterPass function | +//+------------------------------------------------------------------+ +void OnTesterPass() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterDeinit function | +//+------------------------------------------------------------------+ +void OnTesterDeinit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| ChartEvent function | +//+------------------------------------------------------------------+ +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) + { +//--- +//--- left-clicking on a chart + + switch(id) + { + + case CHARTEVENT_CLICK: + { + + break; + } + + + + + //--- clicking on a graphical object + case CHARTEVENT_OBJECT_CLICK: + { + if(sparam == "ZONE_ADD_BTN") + { + + if(objectConfUnit.getWaitingStatus() == false) // THIS IS TO MAKE SURE THERE IS NO OTHER OBJECT SELECTED + { + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getZonesIdCounter(); + objectsManager.drawRectangle(currentIdCounter); // create a rectangle . set its name to be the current zonesIdCounter (and that would be the id of this current zone ) + objectConfUnit.setWaitingStatus(true); + objectConfUnit.setObjectType("OBJ_RECTANGLE"); + objectConfUnit.setConfirmationObjectId(currentIdCounter); + zoneContainer.incrementZonesIdCounter(); + + + + } + else + { + + Print("Failed to Add a new Object, Make sure to confirm the previous object first! ."); + } + + + + } + + else + if(sparam == "ADD_SL_BTN") + { + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THAT THERE IS A ZONE SELECTED TO ADD STOP LOSS TO + { + + if(objectConfUnit.getObjectType() != "OBJ_RECTANGLE") + { + Print("Please select a zone object only !"); + } + else + { + + objectsManager.drawStopLossLine(objectConfUnit.getConfirmationObjectId()); + } + + } + else + { + + Print("Please select a zone in order to add a stop loss line !"); + } + + + } + else + if(sparam == "ADD_TP_BTN") + { + + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THAT THERE IS A ZONE SELECTED TO ADD STOP LOSS TO + { + + if(objectConfUnit.getObjectType() != "OBJ_RECTANGLE") + { + Print("Please select a zone object only !"); + } + else + { + + objectsManager.drawTakeProfitLine(objectConfUnit.getConfirmationObjectId()); + } + + } + else + { + + Print("Please select a zone in order to add a stop loss line !"); + } + + } + else + if(sparam == "CONFIRM_BTN") + { + + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THAT THERE IS SOMETHING SELECTED TO BE CONFIRMED + { + + + if(objectConfUnit.getObjectType() == "OBJ_RECTANGLE") // CASE OF ZONE + { + + if(zoneContainer.getZoneIndex(objectConfUnit.getConfirmationObjectId()) != -1) // means the zone already in the data structure, in this case we just need to update it + { + + // update the zone attributes + // zoneContainer.UpdateZone(int id); + Zone* tempZone = new Zone(); + + tempZone.setHigherEdgePrice(tempObjectAttr.getHigherEdgePrice()) ; + tempZone.setLowerEdgePrice(tempObjectAttr.getLowerEdgePrice()); + tempZone.setLeftEdge(tempObjectAttr.getLeftEdgeTime()); + tempZone.setRightEdge(tempObjectAttr.getRightEdgeTime()); + tempZone.setTimeFrame(tempObjectAttr.getTimeFrame()); + + string idOfOriginalZone = objectConfUnit.getConfirmationObjectId(); + // no need to set the ID here because the ID belongs to the original zone and not this new temp one (this is just a temporary zone to check if the adjustment is valid or no) + + if(zoneContainer.updateZone(tempZone, idOfOriginalZone) ==1) + { + // in this case we successfully updated the zone + + Print("Updated the object:" + + "\n ID: " + objectConfUnit.getConfirmationObjectId() + + "\n Type: " + objectConfUnit.getObjectType() + + "\n Asset: " + tempObjectAttr.getSymbol() + + "\n Time Frame:" + tempObjectAttr.getTimeFrame() + + "\n Higher Edge Price: " + tempObjectAttr.getHigherEdgePrice() + + "\n Lower Edge Price: " + tempObjectAttr.getLowerEdgePrice() + + "\n Left Edge Date: " + tempObjectAttr.getLeftEdgeTime() + + "\n Right Edge Date: " + tempObjectAttr.getRightEdgeTime() + ); + + delete tempZone; + if(ObjectSetInteger(_Symbol,objectConfUnit.getConfirmationObjectId(),OBJPROP_SELECTED,false) == true) // this is to unselect the object once we finish using it + { + } + else + { + Print("Failed to unselect the object. Error: " + GetLastError()); + } + + // THIS IS TO CLEAN THE objectConfUnit + objectConfUnit.setWaitingStatus(false); + ChartRedraw(); + } + else + { + + Print("Failed to update the zone, please reposition it"); + } + + } + + else // means the zone is new so we need to add it + { + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(tempObjectAttr.getHigherEdgePrice()); + newZone.setLowerEdgePrice(tempObjectAttr.getLowerEdgePrice()); + newZone.setLeftEdge(tempObjectAttr.getLeftEdgeTime()); + newZone.setRightEdge(tempObjectAttr.getRightEdgeTime()); + newZone.setId(objectConfUnit.getConfirmationObjectId()); + newZone.setTimeFrame(tempObjectAttr.getTimeFrame()); + if(tempObjectAttr.getHigherEdgePrice() < SymbolInfoDouble(_Symbol, SYMBOL_ASK)) // means its a support zone + { + newZone.setType("TYPE_SUPPORT"); + } + if(tempObjectAttr.getLowerEdgePrice() > SymbolInfoDouble(_Symbol, SYMBOL_ASK)) // means its a resistance zone + { + newZone.setType("TYPE_RESISTANCE"); + } + // add the zone to the data structure + if(zoneContainer.addZone(newZone) == 1) + { + zoneContainer.findOrUpdatePivotEdges(); // update the pivot edges + Print("Added the object:" + + "\n ID: " + objectConfUnit.getConfirmationObjectId() + + "\n Type: " + objectConfUnit.getObjectType() + + "\n Asset: " + tempObjectAttr.getSymbol() + + "\n Time Frame:" + tempObjectAttr.getTimeFrame() + + "\n Higher Edge Price: " + tempObjectAttr.getHigherEdgePrice() + + "\n Lower Edge Price: " + tempObjectAttr.getLowerEdgePrice() + + "\n Left Edge Date: " + tempObjectAttr.getLeftEdgeTime() + + "\n Right Edge Date: " + tempObjectAttr.getRightEdgeTime() + ); + + + + if(ObjectSetInteger(_Symbol,objectConfUnit.getConfirmationObjectId(),OBJPROP_SELECTED,false) == true) // this is to unselect the object once we finish using it + { + } + else + { + Print("Failed to unselect the object. Error: " + GetLastError()); + } + + // THIS IS TO CLEAN THE objectConfUnit + objectConfUnit.setWaitingStatus(false); + } + else + { + Print("Failed to add the zone, Error: 2 or more zones are crossing"); + } + + ChartRedraw(); + } + + + + + + } + + else + if(objectConfUnit.getObjectType() == "OBJ_TRENDLINE") // CASE OF TRENDLINE + { + + + + + } + else + if(objectConfUnit.getObjectType() == "OBJ_HLINE") // CASE OF HORIZNOTAL LINE + { + + if(StringSubstr(tempLineObjectAttr.getId(),0,2) == "sl") + { + + zoneContainer.searchZoneById(StringSubstr(tempLineObjectAttr.getId(),2,-1)).setStopLossPrice(tempLineObjectAttr.getPrice()); + Print("Stop loss for zone: " + StringSubstr(tempLineObjectAttr.getId(),2,-1) + " has been set at: " + tempLineObjectAttr.getPrice()); + if(ObjectDelete(_Symbol,tempLineObjectAttr.getId())) + { + + } + else + { + Print("Failed to delete the stop loss line ! Error: "+ GetLastError()); + } + + // THIS IS TO CLEAN THE objectConfUnit + objectConfUnit.setWaitingStatus(false); + + + } + else + if(StringSubstr(tempLineObjectAttr.getId(),0,2) == "tp") + { + + + if(ObjectDelete(_Symbol,tempLineObjectAttr.getId())) + { + + } + else + { + Print("Failed to delete the stop loss line ! Error: "+ GetLastError()); + } + + // THIS IS TO CLEAN THE objectConfUnit + objectConfUnit.setWaitingStatus(false); + + } + else + if(StringSubstr(tempLineObjectAttr.getId(),0,2) == "rl") + { + + Print("Relational level line for zone: " + StringSubstr(tempLineObjectAttr.getId(),2,-1) + " has been set at: " + tempLineObjectAttr.getPrice()); + + + } + else + if(StringSubstr(tempLineObjectAttr.getId(),0,2) == "dl") + { + + Print("Daily indecision line for zone: " + StringSubstr(tempLineObjectAttr.getId(),2,-1) + " has been set at: " + tempLineObjectAttr.getPrice()); + + + } + else + if(StringSubstr(tempLineObjectAttr.getId(),0,3) == "bos") + { + + Print("Break of structure line for zone: " + StringSubstr(tempLineObjectAttr.getId(),3,-1) + " has been set at: " + tempLineObjectAttr.getPrice()); + + + } + + } + + + + } + else + { + + Print("Cannot confirm, Please select an object first !"); + } + + } + + else + if(sparam == "DELETE_BTN") + { + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THAT THERE IS SOMETHING SELECTED TO BE DELETED + { + if(ObjectDelete(_Symbol,objectConfUnit.getConfirmationObjectId())) + { + if(zoneContainer.deleteZone(objectConfUnit.getConfirmationObjectId()) == 1) + { + // delete from data structure + zoneContainer.findOrUpdatePivotEdges(); + Print("Deleted the object: " + + "\n Type: " + objectConfUnit.getObjectType() + + "\n ID: " + objectConfUnit.getConfirmationObjectId()); + + objectConfUnit.setWaitingStatus(false); + objectConfUnit.setObjectType("NO_OBJECT"); + objectConfUnit.setConfirmationObjectId(-2); + + ChartRedraw(); + } + else + { + objectConfUnit.setWaitingStatus(false); + objectConfUnit.setObjectType("NO_OBJECT"); + objectConfUnit.setConfirmationObjectId(-2); + } + } + + } + else + { + + Print("Cannot delete, Please select an object first !"); + } + + } + else + if(sparam == "EXIT_BTN") + { + delete objectsManager ; + delete objectConfUnit; + delete tempObjectAttr; + delete lowsContainer; + delete highsContainer; + + delete newCandleDetectorLive; + zoneContainer.freeZonesSortedArray(); + /*delete newCandleDetectorD1; + delete newCandleDetectorM5; + delete newCandleDetectorM30; + delete newCandleDetectorM15; + delete newCandleDetectorM1; + delete newCandleDetectorH4; + delete newCandleDetectorH1; */ + + + + + + ExpertRemove(); + } + else + if(sparam == "PRINT_FRACTAL_BTN") + { + Print("Low Fractals:"); + lowsContainer.printLowFractals(); + Print("High Fractals:"); + highsContainer.printHighFractals(); + } + + else + if(sparam == "PRINT_ZONES_BTN") + { + + zoneContainer.printZonesSortedArray(); + } + + else if(sparam == "SET_TP_BTN"){ + if(objectConfUnit.getObjectType() != "OBJ_HLINE"){ + Print("Please select a TP line first !"); + + } + else{ + if(zoneContainer.searchZoneById(StringSubstr(tempLineObjectAttr.getId(),2,-1)).setTakeProfit(tempLineObjectAttr.getPrice())){ + Print("TP for zone: " + StringSubstr(tempLineObjectAttr.getId(),2,-1) + " has been set at: " + tempLineObjectAttr.getPrice()); + } + else{ + Print("You have reached the max take profit lines !"); + } + + } + + + } + else // THIS is the case were we click on any object except for main Buttons on screen + { + + if(objectConfUnit.getWaitingStatus() == true) // THIS IS TO MAKE SURE THERE IS NO OTHER OBJECT SELECTED + { + Print("Cannot select the object clicked, Make sure to confirm a previous selected object first !"); + } + + + else + { + ObjectSetInteger(_Symbol,sparam,OBJPROP_SELECTED,true); + + if(ObjectGetInteger(_Symbol,sparam,OBJPROP_TYPE,0) == OBJ_RECTANGLE) // CASE OF SELECTING A RECTANGLE + { + Print("Selected the object:" + + "\n Type: OBJ_RECTANGLE" + + "\n ID: " + sparam); + objectConfUnit.setWaitingStatus(true) ; + objectConfUnit.setConfirmationObjectId(StringToInteger(sparam)); + objectConfUnit.setObjectType("OBJ_RECTANGLE"); + + double _higherEdgePrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,1); + double _lowerEdgePrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0); + datetime _leftEdgeTime = (datetime)ObjectGetInteger(_Symbol,sparam,OBJPROP_TIME,0); + datetime _rightEdgeTime = (datetime)ObjectGetInteger(_Symbol,sparam,OBJPROP_TIME,1); + + tempObjectAttr.setHigherEdgePrice(_higherEdgePrice); + tempObjectAttr.setLowerEdgePrice(_lowerEdgePrice); + + tempObjectAttr.setLeftEdgeTime(_leftEdgeTime); + tempObjectAttr.setRightEdgeTime(_rightEdgeTime); + tempObjectAttr.setSymbol(); + tempObjectAttr.setTimeFrame(getChartTimeFrameInString()); + ChartRedraw(); + } + + + else + if(ObjectGetInteger(_Symbol,sparam,OBJPROP_TYPE,0) == OBJ_HLINE) // CASE OF SELECTING A HORIZONTAL LINE + { + + objectConfUnit.setWaitingStatus(true) ; + objectConfUnit.setConfirmationObjectId(StringToInteger(sparam)); + objectConfUnit.setObjectType("OBJ_HLINE"); + + //tempLineObjectAttr.setId(sparam); + //tempLineObjectAttr.setPrice( ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0)); + ChartRedraw(); + } + + + + + + } + + } + + + break; + } + + + //--- object moved or anchor point coordinates changed + case CHARTEVENT_OBJECT_DRAG: + { + + if(ObjectGetInteger(_Symbol,sparam,OBJPROP_TYPE,0) == OBJ_RECTANGLE) + { + + + double _higherEdgePrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,1); + double _lowerEdgePrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0); + + datetime _leftEdgeTime = (datetime)ObjectGetInteger(_Symbol,sparam,OBJPROP_TIME,0); + datetime _rightEdgeTime = (datetime)ObjectGetInteger(_Symbol,sparam,OBJPROP_TIME,1); + + if(_higherEdgePrice < _lowerEdgePrice) // this is the case were the user flips the rectangle while adjusting it. + { + tempObjectAttr.setHigherEdgePrice(_lowerEdgePrice); + tempObjectAttr.setLowerEdgePrice(_higherEdgePrice); + } + else + { + tempObjectAttr.setHigherEdgePrice(_higherEdgePrice); + tempObjectAttr.setLowerEdgePrice(_lowerEdgePrice); + } + + tempObjectAttr.setLeftEdgeTime(_leftEdgeTime); + tempObjectAttr.setRightEdgeTime(_rightEdgeTime); + tempObjectAttr.setSymbol(); + tempObjectAttr.setTimeFrame(getChartTimeFrameInString()); + break; + } + + else + if(ObjectGetInteger(_Symbol,sparam,OBJPROP_TYPE,0) == OBJ_HLINE) + { + + if(StringSubstr(sparam,0,2) == "sl") // case of sl line (attached to a zone) + { + double stopLossPrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0); + tempLineObjectAttr.setId(sparam); + tempLineObjectAttr.setPrice(stopLossPrice); + } + else + if(StringSubstr(sparam,0,2) == "tp") // case of tp line (attached to a zone) + { + double takeProfitPrice = ObjectGetDouble(_Symbol,sparam,OBJPROP_PRICE,0); + tempLineObjectAttr.setId(sparam); + tempLineObjectAttr.setPrice(takeProfitPrice); + } + else + if(StringSubstr(sparam,0,2) == "rl") // case of relational point line (attached to a zone) + { + Print("dragging a relational point line"); + } + else + if(StringSubstr(sparam,0,2) == "dl") // case of daily line + { + Print("dragging a daily line"); + } + else + if(StringSubstr(sparam,0,3) == "bos") // case of break of structure line + { + Print("dragging a break of structure line"); + } + + } + } + } + + } + + +//+------------------------------------------------------------------+ +//| BookEvent function | +//+------------------------------------------------------------------+ +void OnBookEvent(const string &symbol) + { +//--- + + } +//+------------------------------------------------------------------+ + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void initLowFractalsFromIndex(int _index,ENUM_TIMEFRAMES timeFramePeriod) + { + + for(int i=_index ; i> rightPeriod ; i--) + { + + bool accessDeniedLows = false ; // variable for dealing with equal consecutive fractals + + + + if(isLowFractalByIndex(i,leftPeriod,rightPeriod,timeFramePeriod) == true) + { + + if(lowsContainer.getFreeIndex() > 0) + { + + if(iLow(Symbol(),timeFramePeriod,i) == lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getPrice()) // if low fractal is equal to the previous low fractal + { + if(lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getDistance() - i < 2*rightPeriod) // if the 2 lows are inside the range of 2 times of right period + { + accessDeniedLows = true ; + } + + } + } + + if(accessDeniedLows == false) + { + + + LowFractal* currentFractal = new LowFractal(iLow(Symbol(),timeFramePeriod,i),leftPeriod,rightPeriod,TimeCurrent(),timeFramePeriod); + currentFractal.setDate(iTime(Symbol(),timeFramePeriod,i)); + currentFractal.setDistance(i); + int NumberOfCandle = i-1; + string NumberOfCandleText = IntegerToString(NumberOfCandle); + currentFractal.setArrowObjName(NumberOfCandleText); + lowsContainer.addLowFractal(currentFractal); + + } + + + } + + } + + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void initHighFractalsFromIndex(int _index,ENUM_TIMEFRAMES timeFramePeriod) + { + + for(int i=_index ; i> rightPeriod ; i--) + { + + bool accessDeniedHighs = false ; // variable for dealing with equal consecutive fractals + + + + if(isHighFractalByIndex(i,leftPeriod,rightPeriod,timeFramePeriod) == true) + { + + if(highsContainer.getFreeIndex() > 0) + { + + if(iHigh(Symbol(),timeFramePeriod,i) == highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getPrice()) // if high fractal is equal to the previous high fractal + { + + if(highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getDistance() - i < 2*rightPeriod) // if the 2 highs are inside the range of 2 times of right period + { + + accessDeniedHighs = true ; + } + + } + } + + if(accessDeniedHighs == false) + { + + + HighFractal* currentFractal = new HighFractal(iHigh(Symbol(),timeFramePeriod,i),leftPeriod,rightPeriod,TimeCurrent(),timeFramePeriod); + currentFractal.setDate(iTime(Symbol(),timeFramePeriod,i)); + currentFractal.setDistance(i); + int NumberOfCandle = i-1; + string NumberOfCandleText = IntegerToString(NumberOfCandle); + currentFractal.setArrowObjName(NumberOfCandleText); + highsContainer.addHighFractal(currentFractal); + + } + + + } + + } + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void handleLowFractals(ENUM_TIMEFRAMES tf) + { + + bool accessDeniedLows = false ; // variable for dealing with equal consecutive fractals if its true, then the current fractal will not be added + + for(int x=0 ; x 0) + { + + if(iLow(Symbol(),tf,lowFractalIndex) == lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getPrice()) // if low fractal is equal to the previous low fractal + { + + if(lowsContainer.getLowFractal(lowsContainer.getFreeIndex()-1).getDistance() <= 2*rightPeriod) // if the 2 lows are inside the range of 2 times of right period + { + + accessDeniedLows = true ; + } + + } + } + + if(accessDeniedLows == false) + { + + LowFractal* currentFractal = new LowFractal(iLow(Symbol(),tf,lowFractalIndex),leftPeriod,rightPeriod,TimeCurrent(),tf); + + int NumberOfCandle = Bars(Symbol(),tf); + string NumberOfCandleText = IntegerToString(NumberOfCandle); + currentFractal.setArrowObjName(NumberOfCandleText); + lowsContainer.addLowFractal(currentFractal); + Print("added a new low fractal !"); + + } + + + } + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void handleHighFractals(ENUM_TIMEFRAMES tf) + { + + + bool accessDeniedHighs = false ; // variable for dealing with equal consecutive fractals + + for(int x=0 ; x 0) + { + + if(iHigh(Symbol(),tf,highFractalIndex) == highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getPrice()) // if high fractal is equal to the previous high fractal + { + if(highsContainer.getHighFractal(highsContainer.getFreeIndex()-1).getDistance() <= 2*rightPeriod) // if the 2 highs are inside the range of 2 times of right period + { + accessDeniedHighs = true ; + } + + } + } + + if(accessDeniedHighs == false) + { + + + HighFractal* currentFractal = new HighFractal(iHigh(Symbol(),tf,highFractalIndex),leftPeriod,rightPeriod,TimeCurrent(),tf); + + int NumberOfCandle = Bars(Symbol(),tf); + string NumberOfCandleText = IntegerToString(NumberOfCandle); + currentFractal.setArrowObjName(NumberOfCandleText); + highsContainer.addHighFractal(currentFractal); + Print("added a new high fractal !"); + } + + + } + + + } + + + +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ diff --git a/TempLineObjectAttributes.mqh b/TempLineObjectAttributes.mqh new file mode 100644 index 0000000..c878c48 --- /dev/null +++ b/TempLineObjectAttributes.mqh @@ -0,0 +1,40 @@ +//+------------------------------------------------------------------+ +//| TempLineObjectAttributes.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +class TempLineObjectAttributes + { +private: + + string id ; + double price ; + +public: + TempLineObjectAttributes(); + ~TempLineObjectAttributes(); + + // GETTERS + string getId(){return id;} + double getPrice(){return price ;} + + // SETTERS + void setId(string _id){id =_id ;} + void setPrice(double _price){price = _price ;} + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +TempLineObjectAttributes::TempLineObjectAttributes() + { + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +TempLineObjectAttributes::~TempLineObjectAttributes() + { + } +//+------------------------------------------------------------------+ diff --git a/TempObjectAttributes.mqh b/TempObjectAttributes.mqh new file mode 100644 index 0000000..99949d1 --- /dev/null +++ b/TempObjectAttributes.mqh @@ -0,0 +1,81 @@ +//+------------------------------------------------------------------+ +//| TempObjectAttributes.mqh | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +class TempObjectAttributes + { +private: + // ATTRIBUTES FOR A ZONE + string assetName; + string timeFrame ; + double higherEdgePrice ; + double lowerEdgePrice ; + datetime leftEdgeTime ; + datetime rightEdgeTime; + + + // ATTRIBUTES FOR TRENDLINE + + + + // ATTRIBUTES FOR DAILY LINE + + + + // ATTRIBUTES FOR IMBALANCE + + + + // ATTRIBUTES FOR FIBONACCI LEVEL + + + + +public: + TempObjectAttributes(); + ~TempObjectAttributes(); + + // GETTERS FOR ZONE + double getHigherEdgePrice(){return higherEdgePrice;} + double getLowerEdgePrice(){return lowerEdgePrice;} + datetime getLeftEdgeTime(){return leftEdgeTime ;} + datetime getRightEdgeTime(){return rightEdgeTime;} + string getSymbol(){return assetName;} + string getTimeFrame(){return timeFrame;} + + // SETTERS FOR ZONE + void setHigherEdgePrice(double _higherEdgePrice){higherEdgePrice = _higherEdgePrice;} + void setLowerEdgePrice(double _lowerEdgePrice){lowerEdgePrice = _lowerEdgePrice;} + void setLeftEdgeTime(datetime _leftEdgeTime){leftEdgeTime = _leftEdgeTime;} + void setRightEdgeTime(datetime _rightEdgeTime){rightEdgeTime = _rightEdgeTime;} + void setSymbol(){assetName = Symbol();} + void setTimeFrame(string _timeframe){timeFrame = _timeframe;} + // OTHER ZONE FUNCTIONS + + void cleanAttributesZone(){higherEdgePrice = -1; + lowerEdgePrice = -1; + leftEdgeTime = 0; + rightEdgeTime = 0;} + }; +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +TempObjectAttributes::TempObjectAttributes() + { + + higherEdgePrice = -1; + lowerEdgePrice = -1; + leftEdgeTime = 0; + rightEdgeTime = 0; + } +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +TempObjectAttributes::~TempObjectAttributes() + { + } +//+------------------------------------------------------------------+ diff --git a/Tiger.ex5 b/Tiger.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..0c85b19d30e93e70cad04bedf10394376076074b GIT binary patch literal 46688 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 C4ub>$ literal 0 HcmV?d00001 diff --git a/Tiger.mq5 b/Tiger.mq5 new file mode 100644 index 0000000..d88c67c --- /dev/null +++ b/Tiger.mq5 @@ -0,0 +1,601 @@ +//+------------------------------------------------------------------+ +//| Tiger.mq5 | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include "NewCandleDetector.mqh" +#include "GraphicalObjectsManager.mqh" +#include "Zone.mqh" +#include "ZoneContainer.mqh" + +#include "MarketObserver.mqh" +#include "BuyEntryManager.mqh" +#include "LotSizeCalculator.mqh" +input double rangeDistance ; +input double resistanceExtendAboveCandle; +input double supportExtendBelowCandle ; +input double stopLossLimit ; +double input riskInDollars ; +double input netTakeProfit ; +bool input allowSecondChanceStopLoss ; +double input bottomWickSize ; +double input smallBottomWickSize ; +double input buyStopPipsTrigger ; +bool input MOD_CLEAN = false ; + + +bool waitingForBottomWickToForm = false ; +bool waitingForSmallBottomWickToForm = false ; +bool buyStopValid = false ; +bool closedPartialOnNegativeDirection = false ; +bool securedTenPips = false ; + + +#include + +CTrade tradeTiger ; + +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ + + +// GUI CLASSES INITIALIZATION +GraphicalObjectsManager* objectsManager = new GraphicalObjectsManager(); + +// CONTAINERS INITIALIZATION +ZoneContainer* zoneContainer = new ZoneContainer() ; + + + + +// ALGORITHM CLASSES INITIALIZATION +MarketObserver* marketObserver = new MarketObserver(zoneContainer); + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +NewCandleDetector newCandleDetector("PERIOD_M30"); +BuyEntryManager buyEntryMan ; +LotSizeCalculator lotSizeCalc ; + + +Zone* temporaryRestestSupportZone = new Zone(); +int OnInit() + { +//--- create timer + EventSetTimer(60); + iClose(_Symbol,PERIOD_M15,5); + iClose(_Symbol,PERIOD_H1,5); + + /*datetime d1=D'2023.09.01 00:00:00'; // Year Month Day Hours Minutes Seconds + Print("the dateTime is: " + d1); + + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(1930); + newZone.setLowerEdgePrice(1925); + newZone.setLeftEdge(iTime(_Symbol,PERIOD_CURRENT,2)); + newZone.setRightEdge(d1); + newZone.setId("1"); + newZone.setTimeFrame("PERIOD_M30"); + + + zoneContainer.addZone(newZone); + objectsManager.drawRectangleInStrategyTester(1,iTime(_Symbol,PERIOD_CURRENT,2),d1,1930,1925); + zoneContainer.printZonesSortedArray(); */ + + +//--- + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- destroy timer + EventKillTimer(); + + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- + + + if(securedTenPips == false ){ + secureTenPips(0.3); + } + + if(waitingForBottomWickToForm){ + if(iClose(_Symbol,PERIOD_CURRENT,1) - SymbolInfoDouble(_Symbol, SYMBOL_BID) >= bottomWickSize){ + + waitingForBottomWickToForm = false ; + Print("Bottom Wick in length of at least " + bottomWickSize + " was formed !"); + buyStopValid = true ; + + + } + + } + + + + + if(buyStopValid){ + if( SymbolInfoDouble(_Symbol, SYMBOL_ASK) > iHigh(_Symbol,PERIOD_CURRENT,1) + buyStopPipsTrigger){ // here we take a buy entry based on break and retest wick. the Algo will first try to put the stop loss under the low of the temporary support zone + // if that stop loss was too high , then it will put it under the low of the wick that was recently made. (the wick should be at least bottomWickSize which is currently 1) + + double stopLossUnderTemporarySupportZone = temporaryRestestSupportZone.getLowerEdge() - 0.5 ; // under the temporary support zone + double stopLossUnderWick = iLow(_Symbol,PERIOD_CURRENT,0) - 0.5; // the low of the current candle + + if(!((SymbolInfoDouble(_Symbol, SYMBOL_ASK) - stopLossUnderTemporarySupportZone) > stopLossLimit)){ // on this case a wick was formed price starts to break the previous candle high, im taking a buy + //and im putting the stop loss below the whole zone (which is support now) + double lotsToEnter = lotSizeCalc.calculateLotSize(riskInDollars,stopLossUnderTemporarySupportZone); + buyEntryMan.takeBuyTradeTiger(lotsToEnter,stopLossUnderTemporarySupportZone,2); + closedPartialOnNegativeDirection = false ; + securedTenPips = false ; + buyStopValid = false ; + Print("Took a wick retest buy type 1"); + + + } + else if(!((SymbolInfoDouble(_Symbol, SYMBOL_ASK) - stopLossUnderWick) > stopLossLimit)){ // on this case a wick was formed price starts to break the previous candle high, im taking a buy + //and im putting the stop loss below the wick (which is at least bottomWickSize) + + double lotsToEnter = lotSizeCalc.calculateLotSize(riskInDollars,stopLossUnderWick); + buyEntryMan.takeBuyTradeTiger(lotsToEnter,stopLossUnderWick,2); + closedPartialOnNegativeDirection = false ; + securedTenPips = false ; + buyStopValid = false ; + Print("Took a wick retest buy type 2"); + } + } + + } + + if(newCandleDetector.isNewCandle()) + { + + + if(iClose(_Symbol,PERIOD_CURRENT,1) < iOpen(_Symbol,PERIOD_CURRENT,1) && closedPartialOnNegativeDirection == false){ // if the m30 candle closed bearish + closePartialsOfAllTrades(0.5); + closedPartialOnNegativeDirection = true ; + } + + + buyStopValid = false ; + waitingForBottomWickToForm = false ; + bool finishedDeleting = false ; + MqlDateTime mqldt ; + datetime currTime = TimeCurrent(mqldt); + + + + if(candleClosedBelowRetestZone(PERIOD_CURRENT)){ + temporaryRestestSupportZone.setType("TYPE_INVALID"); + deleteZoneGuiOnly("999"); + + } + + if(zoneContainer.getNumberOfActiveZones() != 0) // if there are zones found + { + if(marketObserver.candleClosedAboveResistanceByIndex(0,PERIOD_CURRENT)) // check if candle closed above the zone + { + + + datetime _leftEdgeRestestZone = iTime(_Symbol,PERIOD_CURRENT,4); + datetime _rightEdgeRetestZone = D'2023.11.01 00:00:00'; + + + + while(!finishedDeleting && zoneContainer.getNumberOfActiveZones() != 0) // this while is used in the case of a candle closing above more than 1 zone at once + { + /* temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(0).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(0).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame("PERIOD_M30"); + temporaryRestestSupportZone.setType("TYPE_SUPPORT"); + deleteZoneWithGUI((zoneContainer.getZoneByIndex(0).getId())); // delete the zone with the GUI */ + + if(zoneContainer.getNumberOfActiveZones() != 0 && marketObserver.candleClosedAboveResistanceByIndex(0,PERIOD_CURRENT)) + { + zoneContainer.getZoneByIndex(0).getHigherEdge(); + temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(0).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(0).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame("PERIOD_M30"); + temporaryRestestSupportZone.setType("TYPE_SUPPORT"); + deleteZoneWithGUI((zoneContainer.getZoneByIndex(0).getId())); // delete the zone with the GUI + } + else + { + finishedDeleting = true ; + } + + + } + + + + int idAsInt = StringToInteger(temporaryRestestSupportZone.getId()); + + + if((mqldt.hour > 13 && mqldt.hour < 22) || (mqldt.hour > 3 && mqldt.hour < 7) || (mqldt.hour > 8 && mqldt.hour < 12) ) + { + + + double stopLossPrice = iLow(_Symbol,PERIOD_CURRENT,1); + stopLossPrice = stopLossPrice -1; + + double secondChanceStopLossPrice = iLow(_Symbol,PERIOD_M15,1); + secondChanceStopLossPrice = secondChanceStopLossPrice -1; + + if(!(SymbolInfoDouble(_Symbol, SYMBOL_ASK) - stopLossPrice > stopLossLimit)) // enter only if the M30 previous candle satisfied the condition of the proper stop loss + { + //Print("Entered here 2!"); + double lotsToEnter = lotSizeCalc.calculateLotSize(riskInDollars,stopLossPrice); + buyEntryMan.takeBuyTradeTiger(lotsToEnter,stopLossPrice,netTakeProfit); + closedPartialOnNegativeDirection = false ; + securedTenPips = false ; + } + else + if(!(SymbolInfoDouble(_Symbol, SYMBOL_ASK) - secondChanceStopLossPrice > stopLossLimit) && secondChanceStopLossPrice < temporaryRestestSupportZone.getLowerEdge() - 0.5) // if the M30 candle failed , then try the M15 candle + { + + if(allowSecondChanceStopLoss == true) + { + + double lotsToEnter = lotSizeCalc.calculateLotSize(riskInDollars,secondChanceStopLossPrice); + buyEntryMan.takeBuyTradeTiger(lotsToEnter,secondChanceStopLossPrice,netTakeProfit); + closedPartialOnNegativeDirection = false ; + securedTenPips = false ; + + } + + + } + + else // both M30 and M15 candles closed too far from the zone, so im gonna wait for retracement , and support to be built on the zone, or a bottom wick to form + { + + objectsManager.drawRectangleInStrategyTester(idAsInt,_leftEdgeRestestZone,_rightEdgeRetestZone, + temporaryRestestSupportZone.getHigherEdge(),temporaryRestestSupportZone.getLowerEdge(),clrGray); + + + waitingForBottomWickToForm = true ; + + + } + + } + + + + } + + } + + + + if(candleClosedBullish(PERIOD_M30,2) && candleClosedBearish(PERIOD_M30,1)) + { + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getZonesIdCounter(); + + + datetime _leftEdge = iTime(_Symbol,PERIOD_CURRENT,2); + datetime _rightEdge = D'2023.11.01 00:00:00'; + double resistancePrice = iOpen(_Symbol,PERIOD_CURRENT,1); + + + + + + if((zoneContainer.getNumberOfActiveZones() != 0) && (zoneContainer.getZoneByIndex(0).getLowerEdge() - resistancePrice >= rangeDistance)) + { + + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame("PERIOD_M30"); + newZone.setType("TYPE_RESISTANCE"); + + + + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice,clrBeige); + //Print("Number of active zones is: " + zoneContainer.getNumberOfActiveZones()); + //zoneContainer.printZonesSortedArray(); + } + + else if((zoneContainer.getNumberOfActiveZones() != 0) && (zoneContainer.getZoneByIndex(0).getLowerEdge() - resistancePrice < rangeDistance)){ + double currentHighEdge = resistancePrice + resistanceExtendAboveCandle ; // this is a high edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + double currentLowEdge = resistancePrice; // this is a low edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + + } + + else + if(zoneContainer.getNumberOfActiveZones() == 0) // this means this is the first zone to add to the data strucutre + { + + //Print("Entered here 2"); + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame("PERIOD_M30"); + newZone.setType("TYPE_RESISTANCE"); + + + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice,clrBeige); + //zoneContainer.printZonesSortedArray(); + } + + + + } + + + Print("Number of active zones is: " + zoneContainer.getNumberOfActiveZones()); + Print("Zones are : "); + zoneContainer.printZonesSortedArray(); + } + + } +//+------------------------------------------------------------------+ +//| Timer function | +//+------------------------------------------------------------------+ +void OnTimer() + { +//--- + + } +//+------------------------------------------------------------------+ +//| Trade function | +//+------------------------------------------------------------------+ +void OnTrade() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TradeTransaction function | +//+------------------------------------------------------------------+ +void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) + { +//--- + + } +//+------------------------------------------------------------------+ +//| Tester function | +//+------------------------------------------------------------------+ +double OnTester() + { +//--- + double ret=0.0; +//--- + +//--- + return(ret); + } +//+------------------------------------------------------------------+ +//| TesterInit function | +//+------------------------------------------------------------------+ +void OnTesterInit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterPass function | +//+------------------------------------------------------------------+ +void OnTesterPass() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterDeinit function | +//+------------------------------------------------------------------+ +void OnTesterDeinit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| ChartEvent function | +//+------------------------------------------------------------------+ +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) + { +//--- + + } +//+------------------------------------------------------------------+ +//| BookEvent function | +//+------------------------------------------------------------------+ +void OnBookEvent(const string &symbol) + { +//--- + + } +//+------------------------------------------------------------------+ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool resistanceIsFound() + { + +//if() + + return false ; + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool candleClosedBullish(ENUM_TIMEFRAMES _timeFrame, int _index) + { + double candleClose = iClose(_Symbol,_timeFrame,_index); + double candleOpen = iOpen(_Symbol,_timeFrame,_index); + + + if(candleClose >candleOpen) // the candle closed bullish + { + + return true ; + } + return false ; + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool candleClosedBearish(ENUM_TIMEFRAMES _timeFrame,int _index) + { + + + double candleClose = iClose(_Symbol,_timeFrame,_index); + double candleOpen = iOpen(_Symbol,_timeFrame,_index); + + + if(candleClose < candleOpen) // the candle closed bullish + { + + return true ; + } + return false ; + } +//+------------------------------------------------------------------+ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void deleteZoneWithGUI(string _id) + { + + + zoneContainer.deleteZone(_id); + + if(!ObjectDelete(_Symbol,_id)) + { + Print("Failed to delete object error: " + GetLastError()); + } + + } + + + + void deleteZoneGuiOnly(string _id) + { + + + if(!ObjectDelete(_Symbol,_id)) + { + Print("Failed to delete object error: " + GetLastError()); + } + + } +//+------------------------------------------------------------------+ + + +bool candleClosedBelowRetestZone(ENUM_TIMEFRAMES tf){ + + + double previousCandleClose = iClose(_Symbol,tf,1); + + if(previousCandleClose < temporaryRestestSupportZone.getLowerEdge() ){ + + return true ; + } + + return false ; +} + + + + +void closePartialsOfAllTrades(double partial){ + for(int i = PositionsTotal()-1 ; i>=0 ; i--){ + ulong posTicket = PositionGetTicket(i); + if(PositionSelectByTicket(posTicket)){ + double positionVolum = PositionGetDouble(POSITION_VOLUME); + double partialToClose = positionVolum * partial ; + tradeTiger.PositionClosePartial(posTicket,NormalizeDouble(partialToClose,2)); + + } + else{ + Print("Failed to select position, Error: " + GetLastError()); + } + + + + } +} + + + +void secureTenPips(double partial){ + + for(int i = PositionsTotal()-1 ; i>=0 ; i--){ + ulong posTicket = PositionGetTicket(i); + if(PositionSelectByTicket(posTicket)){ + double positionVolume = PositionGetDouble(POSITION_VOLUME); + + if((SymbolInfoDouble(_Symbol, SYMBOL_BID) - PositionGetDouble(POSITION_PRICE_OPEN)) > 1){ + double partialToClose = positionVolume * partial ; + tradeTiger.PositionClosePartial(posTicket,NormalizeDouble(partialToClose,2)); + securedTenPips = true ; + Print("secured 10 pips"); + + } + + + } + else{ + Print("Failed to select position, Error: " + GetLastError()); + } + + + + } + +} \ No newline at end of file diff --git a/TigerEntryTaker.ex5 b/TigerEntryTaker.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..5ac2f28c560e7ed71d140b046ff1fe68981dc2e4 GIT binary patch literal 51062 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 NPr_|e)#aX?jsLyF85sZo literal 0 HcmV?d00001 diff --git a/TigerEntryTaker.mq5 b/TigerEntryTaker.mq5 new file mode 100644 index 0000000..d9e0ccb --- /dev/null +++ b/TigerEntryTaker.mq5 @@ -0,0 +1,1023 @@ +//+------------------------------------------------------------------+ +//| TigerEntryTaker.mq5 | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" +#include "NewCandleDetector.mqh" +#include "GraphicalObjectsManager.mqh" +#include "Zone.mqh" +#include "ZoneContainer.mqh" +#include "MarketObserverTiger.mqh" +#include "LotSizeCalculator.mqh" + +#include "BuyEntryManager.mqh" +#include "SellEntryManager.mqh" + + +input group "Range Related Variables" +input double rangeDistanceBetweenZones ; +input double cleanRangeUponEntry ; +input double potentialRR; + + +input group "Zone Size Settings" +input double resistanceExtendAboveCandle; +input double resistanceLowerEdgeExtend ; +input double supportExtendBelowCandle ; +input double supportHigherEdgeExtend; + +input group "Zone TimeFrames" +input bool APPLY_M30_STRUCTURE ; +input bool APPLY_H1_STRUCTURE; + +// GUI CLASSES INITIALIZATION +GraphicalObjectsManager* objectsManager = new GraphicalObjectsManager(); + +// CONTAINERS INITIALIZATION + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +ZoneContainer* zoneContainer_W1 = new ZoneContainer() ; +ZoneContainer* zoneContainer_D1 = new ZoneContainer() ; +ZoneContainer* zoneContainer_H4 = new ZoneContainer() ; +ZoneContainer* zoneContainer_H1 = new ZoneContainer() ; +ZoneContainer* zoneContainer_M30 = new ZoneContainer() ; + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +ZoneContainer* zoneContainerSupport_W1 = new ZoneContainer() ; +ZoneContainer* zoneContainerSupport_D1 = new ZoneContainer() ; +ZoneContainer* zoneContainerSupport_H4 = new ZoneContainer() ; +ZoneContainer* zoneContainerSupport_H1 = new ZoneContainer() ; +ZoneContainer* zoneContainerSupport_M30 = new ZoneContainer() ; + + + +// ALGORITHM CLASSES INITIALIZATION +MarketObserverTiger* marketObserverTiger = new MarketObserverTiger(); + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +NewCandleDetector newCandleDetectorWeekly("PERIOD_W1"); +NewCandleDetector newCandleDetectorDaily("PERIOD_D1"); +NewCandleDetector newCandleDetector4H("PERIOD_H4"); +NewCandleDetector newCandleDetector1H("PERIOD_H1"); +NewCandleDetector newCandleDetector30M("PERIOD_M30"); +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ + + +// TRADE CLASSES +BuyEntryManager buyEntryManager ; +SellEntryManager sellEntryManager ; + + +// LotSizeCalculator class + +LotSizeCalculator lsCalc ; + +Zone* temporaryRestestSupportZone = new Zone(); + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- create timer + EventSetTimer(60); + + + //--- example of applying template, located in \MQL5\Files + /*if(FileIsExist("Default.tpl")) + { + Print("The file Default.tpl found in \Files'"); + //--- apply template + if(ChartApplyTemplate(0,"\\Files\\Default.tpl")) + { + Print("The template 'Default.tpl' applied successfully"); + //--- redraw chart + ChartRedraw(); + } + else + Print("Failed to apply 'Default.tpl', error code ",GetLastError()); + } + else + { + Print("File 'Default.tpl' not found in " + +TerminalInfoString(TERMINAL_PATH)+"\\MQL5\\Files"); + } */ + +// ONLY FOR VISULAZITAION ON STRATEGY TESTER + iClose(_Symbol,PERIOD_H1,5); + iClose(_Symbol,PERIOD_M30,5); + iClose(_Symbol,PERIOD_H4,5); + iClose(_Symbol,PERIOD_M15,5); + iClose(_Symbol,PERIOD_D1,1); + iClose(_Symbol,PERIOD_W1,1); + + + + + //ChartOpen(_Symbol,PERIOD_W1); + //ChartOpen(_Symbol,PERIOD_D1); + //long H4_NAME = ChartOpen(_Symbol,PERIOD_H4); + //long H1_NAME = ChartOpen(_Symbol,PERIOD_H1); + //if(!ChartOpen(_Symbol,PERIOD_M30)){ + // Print("Failed to open chart Error, " + GetLastError()); + //} + + //Print(H1_NAME); + //Print(M30_NAME); + //Print(H4_NAME); + + + + + objectsManager.addTextTiger(); +//objectsManager.addMarketDescriptionTextTiger(); + + +//--- + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- destroy timer + EventKillTimer(); + + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- + //Comment("Spread is: + " + SymbolInfoInteger(_Symbol,SYMBOL_SPREAD)); + if(newCandleDetector30M.isNewCandle()) + { + + //detectAndDrawResistanceOnTimeFrame(PERIOD_M30,"PERIOD_M30",clrBeige,clrBlue,zoneContainer_M30); + //updateBreakAboveStructureAndDelete(zoneContainer_M30,PERIOD_M30,"PERIOD_M30"); + + + datetime currTime = TimeCurrent(); + ObjectSetString(0,"clockTextTiger",OBJPROP_TEXT,TimeToString(currTime,TIME_MINUTES)); + + } + + + if(newCandleDetector1H.isNewCandle()) + { + + MqlDateTime mqldt ; + datetime currTime = TimeCurrent(mqldt); + if(mqldt.hour == 13){ + + objectsManager.drawVerticalLine(clrAzure,TimeCurrent()); + + } + + detectAndDrawResistanceOnTimeFrame(PERIOD_H1,"PERIOD_H1",clrGray,clrRed,zoneContainer_H1); + double brokenResistanceLowerPrice = -1 ; + string brokenZoneTypeResistance = "" ; + if(updateBreakAboveStructureAndDelete(zoneContainer_H1,PERIOD_H1,"PERIOD_H1",brokenResistanceLowerPrice,brokenZoneTypeResistance)) // means price broke the zone on an h1 candle + { + + + double firstResistancePrice = findClosestResistancePrice(zoneContainer_H1); + double cleanRangeValueBuys = firstResistancePrice - SymbolInfoDouble(_Symbol, SYMBOL_ASK); + + if(cleanRangeValueBuys >= cleanRangeUponEntry) + { + + + + if(firstResistancePrice != -1 && brokenZoneTypeResistance == "TYPE_RESISTANCE_BREAKOUT") + { + + Print("H1 candle Broke and closed above the zone. the closest resistance price is: " + DoubleToString(firstResistancePrice)); + Print("The lower edge of the recently broken resistance zone is: " + brokenResistanceLowerPrice); + + double stopLossBased_H1 = iLow(_Symbol,PERIOD_H1,1); + double stopLossBased_M30 = iLow(_Symbol,PERIOD_M30,1); + + stopLossBased_H1 = stopLossBased_H1 - stopLossUnderWickBy ; + stopLossBased_M30 = stopLossBased_M30 - stopLossUnderWickBy ; + + if(stopLossIsValidBuys(stopLossBased_H1)) + { + + //if((mqldt.hour > 13 && mqldt.hour < 20) || (mqldt.hour > 8 && mqldt.hour < 12)){ + + //buyEntryManager.takeBuyTradeTiger(0.1,stopLossBased_H1,firstResistancePrice); + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_H1); + Comment("Spread is: + " + SymbolInfoInteger(_Symbol,SYMBOL_SPREAD)); + buyEntryManager.takeBuyTradeTiger(lotsToEnter,stopLossBased_H1, SymbolInfoDouble(_Symbol, SYMBOL_ASK) + netTakeProfit) ; + Print("Took a buy. stop loss: based on 1 hour"); + //} + + + + } + else + if(stopLossIsValidBuys(stopLossBased_M30)) + { + //if((mqldt.hour > 13 && mqldt.hour < 20) || (mqldt.hour > 8 && mqldt.hour < 12)){ + + //buyEntryManager.takeBuyTradeTiger(0.1,stopLossBased_H1,firstResistancePrice) ; + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_M30); + Comment("Spread is: + " + SymbolInfoInteger(_Symbol,SYMBOL_SPREAD)); + buyEntryManager.takeBuyTradeTiger(lotsToEnter,stopLossBased_M30, SymbolInfoDouble(_Symbol, SYMBOL_ASK) + netTakeProfit) ; + + Print("Took a buy. stop loss: based on 30 min"); + + // } + + } + + else + { + + Print("Failed to find a valid stop loss on both H1 and M30 !"); + } + } + + else + { + + Print("H1 candle Broke and closed above the zone, but im not taking a buy because i dont see a next zone target!"); + } + + + + + } + + else + { + + Print("Price Broke the zone but not enough range to take the trade !"); + + } + + + } + + + detectAndDrawSupportOnTimeFrame(PERIOD_H1,"PERIOD_H1",clrWhite,clrRed,zoneContainerSupport_H1); + double brokenSupportHigherPrice = -1 ; + string brokenZoneTypeSupport= "" ; + + + if(updateBreakBelowStructureAndDelete(zoneContainerSupport_H1,PERIOD_H1,"PERIOD_H1",brokenSupportHigherPrice,brokenZoneTypeSupport)) + { + //MqlDateTime mqldt ; + double firstSupportPrice = findClosestSupportPrice(zoneContainerSupport_H1); + double cleanRangeValueSells = SymbolInfoDouble(_Symbol, SYMBOL_BID) - firstSupportPrice; + + + if(cleanRangeValueSells >= cleanRangeUponEntry) + { + + + if(firstSupportPrice != -1 && brokenZoneTypeSupport == "TYPE_SUPPORT_BREAKOUT") + { + + Print("H1 candle Broke and closed below the zone. the closest support price is: " + DoubleToString(firstSupportPrice)); + Print("The higher edge of the recently broken support zone is: " + brokenSupportHigherPrice); + + + double stopLossBased_H1 = iHigh(_Symbol,PERIOD_H1,1); + double stopLossBased_M30 = iHigh(_Symbol,PERIOD_M30,1); + + stopLossBased_H1 = stopLossBased_H1 + stopLossAboveWickBy ; + stopLossBased_M30 = stopLossBased_M30 + stopLossAboveWickBy ; + + if(stopLossIsValidSells(stopLossBased_H1)) + { + //if((mqldt.hour > 13 && mqldt.hour < 20) || (mqldt.hour > 8 && mqldt.hour < 12)){ + + //sellEntryManager.takeSellTradeTiger(0.1,stopLossBased_H1,firstSupportPrice); + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_H1); + Comment("Spread is: + " + SymbolInfoInteger(_Symbol,SYMBOL_SPREAD)); + sellEntryManager.takeSellTradeTiger(lotsToEnter,stopLossBased_H1,SymbolInfoDouble(_Symbol, SYMBOL_BID) - netTakeProfit); + Print("Took a sell. stop loss: based on 1 hour"); + //} + + + } + else + if(stopLossIsValidSells(stopLossBased_M30)) + { + + //if((mqldt.hour > 13 && mqldt.hour < 20) || (mqldt.hour > 8 && mqldt.hour < 12)){ + //sellEntryManager.takeSellTradeTiger(0.1,stopLossBased_H1,firstSupportPrice); + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_M30); + Comment("Spread is: + " + SymbolInfoInteger(_Symbol,SYMBOL_SPREAD)); + sellEntryManager.takeSellTradeTiger(lotsToEnter,stopLossBased_M30,SymbolInfoDouble(_Symbol, SYMBOL_BID) - netTakeProfit); + + Print("Took a sell. stop loss: based on 30 min"); + + //} + + + } + + else + { + + Print("Failed to find a valid stop loss on both H1 and M30 !"); + } + } + + else + { + + Print("H1 candle Broke and closed below the zone. but im not taking a sell because i dont see a target zone !"); + } + + + + + } + else{ + Print("Price broke the support zone but not enough range to take the trade"); + + } + + } + + + + } + + /*if(newCandleDetector4H.isNewCandle()){ + + detectAndDrawResistanceOnTimeFrame(PERIOD_H4,"PERIOD_H4",clrPurple,clrGreen,zoneContainer_H4); + updateBreakAboveStructureAndDelete(zoneContainer_H4,PERIOD_H4,"PERIOD_H4"); + }*/ + + if(newCandleDetectorDaily.isNewCandle()) + { + + //detectAndDrawResistanceOnTimeFrame(PERIOD_D1,"PERIOD_D1",clrYellow,clrYellow,zoneContainer_D1); + //updateBreakAboveStructureAndDelete(zoneContainer_D1,PERIOD_D1,"PERIOD_D1"); + objectsManager.drawVerticalLine(clrAqua, TimeCurrent()); + + + + } + + + if(newCandleDetectorWeekly.isNewCandle()) + { + + objectsManager.drawVerticalLine(clrRed,TimeCurrent()); + } + } +//+------------------------------------------------------------------+ +//| Timer function | +//+------------------------------------------------------------------+ +void OnTimer() + { +//--- + + } +//+------------------------------------------------------------------+ +//| Trade function | +//+------------------------------------------------------------------+ +void OnTrade() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TradeTransaction function | +//+------------------------------------------------------------------+ +void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) + { +//--- + + } +//+------------------------------------------------------------------+ +//| Tester function | +//+------------------------------------------------------------------+ +double OnTester() + { +//--- + double ret=0.0; +//--- + +//--- + return(ret); + } +//+------------------------------------------------------------------+ +//| TesterInit function | +//+------------------------------------------------------------------+ +void OnTesterInit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterPass function | +//+------------------------------------------------------------------+ +void OnTesterPass() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterDeinit function | +//+------------------------------------------------------------------+ +void OnTesterDeinit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| ChartEvent function | +//+------------------------------------------------------------------+ +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) + { +//--- + + } +//+------------------------------------------------------------------+ +//| BookEvent function | +//+------------------------------------------------------------------+ +void OnBookEvent(const string &symbol) + { +//--- + + } +//+------------------------------------------------------------------+ + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool detectAndDrawResistanceOnTimeFrame(ENUM_TIMEFRAMES timeFrame, string timeFrameStr, long BOS_zone_color, long usual_zone_color,ZoneContainer& zoneContainer) + { + + + if(candleClosedBullish(timeFrame,2) && candleClosedBearish(timeFrame,1)) // if resistance formed + { + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getZonesIdCounter(); + + + datetime _leftEdge = iTime(_Symbol,timeFrame,2); + datetime _rightEdge = D'2023.11.01 00:00:00'; + double resistancePrice = iOpen(_Symbol,timeFrame,1); + + + + + + if((zoneContainer.getNumberOfActiveZones() != 0) && (zoneContainer.getZoneByIndex(0).getLowerEdge() - resistancePrice >= rangeDistanceBetweenZones)) // check if it has a clean range above + { + + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice - 0.1); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_RESISTANCE_BREAKOUT"); + + + + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + Print("current id counter of, zoneContainer is: " + currentIdCounter); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice,BOS_zone_color); + //Print("Number of active zones is: " + zoneContainer.getNumberOfActiveZones()); + //zoneContainer.printZonesSortedArray(); + } + + else + if((zoneContainer.getNumberOfActiveZones() != 0) && (zoneContainer.getZoneByIndex(0).getLowerEdge() - resistancePrice < rangeDistanceBetweenZones)) // if it doesnt have a clean range, just add it as a blue zone + { + double currentHighEdge = resistancePrice + resistanceExtendAboveCandle ; // this is a high edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + double currentLowEdge = resistancePrice; // this is a low edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_RESISTANCE_NORMAL"); + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + //objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice,usual_zone_color); + + /*if(zoneContainer.getZoneByIndex(1).getType() == "TYPE_RESISTANCE_NORMAL"){ + string idOfZoneToHide = zoneContainer.getZoneByIndex(1).getId(); + deleteZoneGuiOnly(idOfZoneToHide,zoneContainer); + } */ + + + + } + + else + if(zoneContainer.getNumberOfActiveZones() == 0) // this means this is the first zone to add to the data strucutre + { + + //Print("Entered here 2"); + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_RESISTANCE_BREAKOUT"); + + + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice,BOS_zone_color); + //zoneContainer.printZonesSortedArray(); + } + + return true ; + + } + return false ; + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool detectAndDrawSupportOnTimeFrame(ENUM_TIMEFRAMES timeFrame, string timeFrameStr, long BOS_zone_color, long usual_zone_color,ZoneContainer& zoneContainer) + { + + + if(candleClosedBearish(timeFrame,2) && candleClosedBullish(timeFrame,1)) // if support formed + { + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getSupportZonesIdCounter(); + + + datetime _leftEdge = iTime(_Symbol,timeFrame,2); + datetime _rightEdge = D'2023.11.01 00:00:00'; + double supportPrice = iOpen(_Symbol,timeFrame,1); + + + + + + if((zoneContainer.getNumberOfActiveZones() != 0) && (supportPrice - zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge() >= rangeDistanceBetweenZones)) // check if it has a clean range down + { + + Zone* newZone = new Zone() ; + newZone.setLowerEdgePrice(supportPrice - supportExtendBelowCandle); + newZone.setHigherEdgePrice(supportPrice + 0.1); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_SUPPORT_BREAKOUT"); + + + + + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + Print("current id counter of, zoneContainer_support is: " + currentIdCounter); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice,supportPrice- supportExtendBelowCandle,BOS_zone_color); + //Print("Number of active zones is: " + zoneContainer.getNumberOfActiveZones()); + //zoneContainer.printZonesSortedArray(); + } + + else + if((zoneContainer.getNumberOfActiveZones() != 0) && (supportPrice - zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge() < rangeDistanceBetweenZones)) // if it doesnt have a clean range, just add it as a blue zone + { + double currentHighEdge = supportPrice ; // this is a high edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + double currentLowEdge = supportPrice - supportExtendBelowCandle; // this is a low edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(supportPrice); + newZone.setLowerEdgePrice(supportPrice - supportExtendBelowCandle); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_SUPPORT_NORMAL"); + + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + //objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice,supportPrice - supportExtendBelowCandle,usual_zone_color); + + } + + else + if(zoneContainer.getNumberOfActiveZones() == 0) // this means this is the first zone to add to the data strucutre + { + + //Print("Entered here 2"); + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(supportPrice); + newZone.setLowerEdgePrice(supportPrice - supportExtendBelowCandle); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_SUPPORT_BREAKOUT"); + + + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice,supportPrice - supportExtendBelowCandle,BOS_zone_color); + //zoneContainer.printZonesSortedArray(); + } + + + return true ; + + } + return false ; + } + + + + + + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool candleClosedBullish(ENUM_TIMEFRAMES _timeFrame, int _index) + { + double candleClose = iClose(_Symbol,_timeFrame,_index); + double candleOpen = iOpen(_Symbol,_timeFrame,_index); + + + if(candleClose >candleOpen) // the candle closed bullish + { + + return true ; + } + return false ; + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool candleClosedBearish(ENUM_TIMEFRAMES _timeFrame,int _index) + { + + + double candleClose = iClose(_Symbol,_timeFrame,_index); + double candleOpen = iOpen(_Symbol,_timeFrame,_index); + + + if(candleClose < candleOpen) // the candle closed bullish + { + + return true ; + } + return false ; + } +//+------------------------------------------------------------------+ + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void deleteZoneWithGUI(string _id, ZoneContainer& zoneContainer) + { + + + zoneContainer.deleteZone(_id); + + if(!ObjectDelete(_Symbol,_id)) + { + Print("Failed to delete object error: " + GetLastError()); + } + + + Print("Deleted the zone with gui!"); + + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void deleteZoneGuiOnly(string _id,ZoneContainer& zoneContainer) + { + + + if(!ObjectDelete(_Symbol,_id)) + { + Print("Failed to delete object error: " + GetLastError()); + } + + Print("Deleted the zone gui!"); + + } + + + + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool updateBreakAboveStructureAndDelete(ZoneContainer& zoneContainer, ENUM_TIMEFRAMES timeFrame, string timeFrameStr, double& brokenResistanceLowerEdge, string& type) + { + bool finishedDeleting = false ; + + if(zoneContainer.getNumberOfActiveZones() != 0) // if there are zones found + { + if(marketObserverTiger.candleClosedAboveResistanceByIndex(0,timeFrame,zoneContainer)) // check if candle closed above the zone + { + + + + datetime _leftEdgeRestestZone = iTime(_Symbol,timeFrame,4); + datetime _rightEdgeRetestZone = D'2023.11.01 00:00:00'; + + + while(!finishedDeleting && zoneContainer.getNumberOfActiveZones() != 0) // this while is used in the case of a candle closing above more than 1 zone at once + { + /* temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(0).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(0).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame("PERIOD_M30"); + temporaryRestestSupportZone.setType("TYPE_SUPPORT"); + deleteZoneWithGUI((zoneContainer.getZoneByIndex(0).getId())); // delete the zone with the GUI */ + + if(zoneContainer.getNumberOfActiveZones() != 0 && marketObserverTiger.candleClosedAboveResistanceByIndex(0,timeFrame,zoneContainer)) + { + zoneContainer.getZoneByIndex(0).getHigherEdge(); + temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(0).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(0).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame(timeFrameStr); + + type = zoneContainer.getZoneByIndex(0).getType(); + temporaryRestestSupportZone.setType("TYPE_SUPPORT_TEMPORARY"); + + brokenResistanceLowerEdge = zoneContainer.getZoneByIndex(0).getLowerEdge(); // save the lower edge of the broken zone, in order to return it in the parameter + + deleteZoneWithGUI((zoneContainer.getZoneByIndex(0).getId()),zoneContainer); // delete the zone with the GUI + } + else + { + finishedDeleting = true ; + } + + + } + + /*if(zoneContainer.getNumberOfActiveZones() != 0 && zoneContainer.getZoneByIndex(0).getType() == "TYPE_RESISTANCE_NORMAL"){ + + Zone* tempZone = zoneContainer.getZoneByIndex(0); + string zoneIdStr = tempZone.getId(); + int zoneIdInteger = StringToInteger(zoneIdStr); + + objectsManager.drawRectangleInStrategyTester(zoneIdInteger,tempZone.getLeftEdge(),tempZone.getRightEdge(),tempZone.getHigherEdge(),tempZone.getLowerEdge(),clrRed); + Print("Retrieved the zone succesfully!"); + + + } */ + return true ; + + } + + + } + return false ; + + } + + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool updateBreakBelowStructureAndDelete(ZoneContainer& zoneContainer, ENUM_TIMEFRAMES timeFrame, string timeFrameStr, double& brokenSupportHigherEdge, string& type) + { + bool finishedDeleting = false ; + + if(zoneContainer.getNumberOfActiveZones() != 0) // if there are zones found + { + + if(marketObserverTiger.candleClosedBelowSupportByIndex(zoneContainer.getNumberOfActiveZones() -1,timeFrame,zoneContainer)) // check if candle closed below the zone + { + + + datetime _leftEdgeRestestZone = iTime(_Symbol,timeFrame,4); + datetime _rightEdgeRetestZone = D'2023.11.01 00:00:00'; + + + while(!finishedDeleting && zoneContainer.getNumberOfActiveZones() != 0) // this while is used in the case of a candle closing above more than 1 zone at once + { + /* temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(0).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(0).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame("PERIOD_M30"); + temporaryRestestSupportZone.setType("TYPE_SUPPORT"); + deleteZoneWithGUI((zoneContainer.getZoneByIndex(0).getId())); // delete the zone with the GUI */ + + if(zoneContainer.getNumberOfActiveZones() != 0 && marketObserverTiger.candleClosedBelowSupportByIndex(zoneContainer.getNumberOfActiveZones()-1,timeFrame,zoneContainer)) + { + zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge(); + temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("9999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame(timeFrameStr); + + type = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getType(); + temporaryRestestSupportZone.setType("TYPE_RESISTANCE_TEMPORARY"); + + brokenSupportHigherEdge = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge(); + + deleteZoneWithGUI((zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getId()),zoneContainer); // delete the zone with the GUI + } + else + { + finishedDeleting = true ; + } + + + } + + /*if(zoneContainer.getNumberOfActiveZones() != 0 && zoneContainer.getZoneByIndex(0).getType() == "TYPE_RESISTANCE_NORMAL"){ + + Zone* tempZone = zoneContainer.getZoneByIndex(0); + string zoneIdStr = tempZone.getId(); + int zoneIdInteger = StringToInteger(zoneIdStr); + + objectsManager.drawRectangleInStrategyTester(zoneIdInteger,tempZone.getLeftEdge(),tempZone.getRightEdge(),tempZone.getHigherEdge(),tempZone.getLowerEdge(),clrRed); + Print("Retrieved the zone succesfully!"); + + + } */ + + + return true ; + + + } + + + } + + return false ; + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double findClosestResistancePrice(ZoneContainer& zoneContainer) + { + + double closestResistancePrice = -1; + if(zoneContainer.getNumberOfActiveZones() != 0) + { + + closestResistancePrice = zoneContainer.getZoneByIndex(0).getLowerEdge(); + } + + return closestResistancePrice ; + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double findClosestSupportPrice(ZoneContainer& zoneContainer) + { + + double closestSupportPrice = -1 ; + if(zoneContainer.getNumberOfActiveZones() != 0) + { + + closestSupportPrice = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getLowerEdge(); + } + + return closestSupportPrice ; + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool stopLossIsValidBuys(double stopLoss) + { + + if(SymbolInfoDouble(_Symbol, SYMBOL_ASK) - stopLoss < maxPipsRiskAmount) + { + return true ; + } + + return false ; + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool stopLossIsValidSells(double stopLoss) + { + if(stopLoss - SymbolInfoDouble(_Symbol, SYMBOL_BID) < maxPipsRiskAmount) + { + return true ; + } + return false ; + + } +//+------------------------------------------------------------------+ + + +bool sessionIsNy(){ + MqlDateTime mqldt ; + datetime currTime = TimeCurrent(mqldt); + + if(mqldt.hour >= 14 && mqldt.hour <= 17){ + return true ; + } + + return false ; + +} + + +bool sessionIsLondon(){ + MqlDateTime mqldt ; + datetime currTime = TimeCurrent(mqldt); + + if(mqldt.hour >= 8 && mqldt.hour <= 11){ + return true ; + } + + return false ; + +} \ No newline at end of file diff --git a/TigerEntryTakerNew.ex5 b/TigerEntryTakerNew.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..711e298d4e90b04049caa38b6d9b1ebc1f455694 GIT binary patch literal 56044 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 cleanRangeUponEntry) + { + + double stopLossBased_H1 = iLow(_Symbol,PERIOD_H1,1); + double stopLossBased_M30 = iLow(_Symbol,PERIOD_M30,1); + double stopLossBased_M15 = iLow(_Symbol,PERIOD_M15,1); + + stopLossBased_H1 = stopLossBased_H1 - stopLossUnderWickBy ; + stopLossBased_M30 = stopLossBased_M30 - stopLossUnderWickBy ; + stopLossBased_M15 = stopLossBased_M15 - stopLossUnderWickBy ; + + if(stopLossIsValidBuys(stopLossBased_M30)) + { + + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_M30); + if(PositionsTotal() == 0) // there are no active trades + { + + buyEntryManager.takeBuyTradeTiger(lotsToEnter,stopLossBased_M30, SymbolInfoDouble(_Symbol, SYMBOL_ASK) + netTakeProfit) ; + activeTradeType = "BUY" ; + Comment("Took a buy. stop loss: based on M30"); + } + else + { + + Comment("I cant take a trade because another trade is running"); + } + + + } + else + if(stopLossIsValidBuys(stopLossBased_M15)) + { + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_M15); + if(PositionsTotal() == 0) + { + buyEntryManager.takeBuyTradeTiger(lotsToEnter,stopLossBased_M15, SymbolInfoDouble(_Symbol, SYMBOL_ASK) + netTakeProfit) ; + activeTradeType = "BUY" ; + Comment("Took a buy. stop loss: based on M15"); + } + else + { + + Comment("I cant take a trade because another trade is running"); + + } + + } + + else + { + + + Comment("Failed to find a valid stop loss on both M30 and M15 !"); + } + + } + + else + { + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + + Comment(timeInStr + ": Price Broke the resitance zone, but not enough clean range to take a trade"); + + } + + } + else + { + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + Comment(timeInStr+ ": Price broke the resistance zone but i dont see the next target zone, Or the zone price broke was not a breakout zone "); + + } + + } + + + if(updateBreakBelowStructureAndDelete(zoneContainerSupport_M30,PERIOD_M30,"PERIOD_M30",brokenSupportHigherPrice,brokenZoneTypeSupport) + && sellBreakerCandleIsValid(PERIOD_M30) + && ((sessionIsNy() && TRADE_NEW_YORK) || (sessionIsLondon() && TRADE_LONDON) )) // means M30 candle broke structure, and the breaker candle is valid (big enough),and time is in the sessions (ny or london or both, based on what the user chose)) + { + + + double firstSupportPrice = findClosestSupportPrice(zoneContainerSupport_M30); + double cleanRangeValueSells = SymbolInfoDouble(_Symbol, SYMBOL_BID) - firstSupportPrice; + + Print("firstSupport variable is: " + firstSupportPrice); + Print("cleanRangeValueSells :" + cleanRangeValueSells); + + + if(firstSupportPrice != -1 && brokenZoneTypeSupport == "TYPE_SUPPORT_BREAKOUT") + { + Comment("M30 candle Broke and closed below the zone. the closest support price is:" + DoubleToString(firstSupportPrice)); + if(cleanRangeValueSells >= cleanRangeUponEntry) + { + + double stopLossBased_H1 = iHigh(_Symbol,PERIOD_H1,1); + double stopLossBased_M30 = iHigh(_Symbol,PERIOD_M30,1); + double stopLossBased_M15 = iHigh(_Symbol,PERIOD_M15,1); + + stopLossBased_H1 = stopLossBased_H1 + stopLossAboveWickBy ; + stopLossBased_M30 = stopLossBased_M30 + stopLossAboveWickBy ; + stopLossBased_M15 = stopLossBased_M15 + stopLossAboveWickBy ; + + if(stopLossIsValidSells(stopLossBased_M30)) + { + + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_M30); + if(PositionsTotal() == 0) + { + sellEntryManager.takeSellTradeTiger(lotsToEnter,stopLossBased_M30, SymbolInfoDouble(_Symbol, SYMBOL_BID) - netTakeProfit) ; + activeTradeType = "SELL"; + Comment("Took a sell. stop loss: based on M30"); + + } + else + { + + Comment("i cant take a trade since another one is running"); + } + + + } + else + if(stopLossIsValidSells(stopLossBased_M15)) + { + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_M15); + + if(PositionsTotal() == 0) + { + sellEntryManager.takeSellTradeTiger(lotsToEnter,stopLossBased_M15, SymbolInfoDouble(_Symbol, SYMBOL_BID) - netTakeProfit) ; + activeTradeType = "SELL"; + Comment("Took a sell. stop loss: based on M15"); + } + else + { + Comment("i cant take a trade since another one is running"); + } + } + + else + { + + + Comment("Failed to find a valid stop loss on both M30 and M15 !"); + } + + } + + else + { + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + + + Comment(timeInStr + ": Price Broke the support zone, but not enough clean range to take a trade"); + + } + + } + else + { + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + Comment(timeInStr+ ": Price broke the support zone but i dont see the next target zone, Or the zone price broke was not a breakout zone "); + + } + + + + } + + + datetime currTime = TimeCurrent(); + ObjectSetString(0,"clockTextTiger",OBJPROP_TEXT,TimeToString(currTime,TIME_MINUTES)); + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +if(newCandleDetectorDaily.isNewCandle()) + { + +//detectAndDrawResistanceOnTimeFrame(PERIOD_D1,"PERIOD_D1",clrYellow,clrYellow,zoneContainer_D1); +//updateBreakAboveStructureAndDelete(zoneContainer_D1,PERIOD_D1,"PERIOD_D1"); + objectsManager.drawVerticalLine(clrAqua, TimeCurrent()); + + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +if(newCandleDetectorWeekly.isNewCandle()) + { + + objectsManager.drawVerticalLine(clrRed, TimeCurrent());; + } + + } + +//+------------------------------------------------------------------+ +//| Timer function | +//+------------------------------------------------------------------+ +void OnTimer() + { +//--- + + } +//+------------------------------------------------------------------+ +//| Trade function | +//+------------------------------------------------------------------+ +void OnTrade() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TradeTransaction function | +//+------------------------------------------------------------------+ +void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) + { +//--- + + } +//+------------------------------------------------------------------+ +//| Tester function | +//+------------------------------------------------------------------+ +double OnTester() + { +//--- + double ret=0.0; +//--- + +//--- + return(ret); + } +//+------------------------------------------------------------------+ +//| TesterInit function | +//+------------------------------------------------------------------+ +void OnTesterInit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterPass function | +//+------------------------------------------------------------------+ +void OnTesterPass() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterDeinit function | +//+------------------------------------------------------------------+ +void OnTesterDeinit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| ChartEvent function | +//+------------------------------------------------------------------+ +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) + { +//--- + + } +//+------------------------------------------------------------------+ +//| BookEvent function | +//+------------------------------------------------------------------+ +void OnBookEvent(const string &symbol) + { +//--- + + } +//+------------------------------------------------------------------+ + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool detectAndDrawResistanceOnTimeFrame(ENUM_TIMEFRAMES timeFrame, string timeFrameStr, long BOS_zone_color, long usual_zone_color,ZoneContainer& zoneContainer) + { + + + if((candleClosedBullish(timeFrame,2) && candleClosedBearish(timeFrame,1)) || (candleClosedBullish(timeFrame,3) && candleClosedDoji(timeFrame,2) && candleClosedBearish(timeFrame,1))) // if resistance formed + { + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getZonesIdCounter(); + + + datetime _leftEdge = iTime(_Symbol,timeFrame,2); + datetime _rightEdge = D'2023.11.01 00:00:00'; + double resistancePrice = iOpen(_Symbol,timeFrame,1); + + + + + + if((zoneContainer.getNumberOfActiveZones() != 0) && (zoneContainer.getZoneByIndex(0).getLowerEdge() - resistancePrice >= rangeDistanceBetweenZones)) // check if it has a clean range above + { + + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice - resistanceLowerEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_RESISTANCE_BREAKOUT"); + + + + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + Print("current id counter of, zoneContainer is: " + currentIdCounter); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice - resistanceLowerEdgeExtend,BOS_zone_color); + //Print("Number of active zones is: " + zoneContainer.getNumberOfActiveZones()); + //zoneContainer.printZonesSortedArray(); + } + + else + if((zoneContainer.getNumberOfActiveZones() != 0) && (zoneContainer.getZoneByIndex(0).getLowerEdge() - resistancePrice < rangeDistanceBetweenZones)) // if it doesnt have a clean range, just add it as a blue zone + { + double currentHighEdge = resistancePrice + resistanceExtendAboveCandle ; // this is a high edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + double currentLowEdge = resistancePrice - resistanceLowerEdgeExtend; // this is a low edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice - resistanceLowerEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_RESISTANCE_NORMAL"); + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + //objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice,usual_zone_color); + + /*if(zoneContainer.getZoneByIndex(1).getType() == "TYPE_RESISTANCE_NORMAL"){ + string idOfZoneToHide = zoneContainer.getZoneByIndex(1).getId(); + deleteZoneGuiOnly(idOfZoneToHide,zoneContainer); + } */ + + + + } + + else + if(zoneContainer.getNumberOfActiveZones() == 0) // this means this is the first zone to add to the data strucutre + { + + //Print("Entered here 2"); + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice - resistanceLowerEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_RESISTANCE_BREAKOUT"); + + + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice - resistanceLowerEdgeExtend,BOS_zone_color); + //zoneContainer.printZonesSortedArray(); + } + + return true ; + + } + return false ; + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool detectAndDrawSupportOnTimeFrame(ENUM_TIMEFRAMES timeFrame, string timeFrameStr, long BOS_zone_color, long usual_zone_color,ZoneContainer& zoneContainer) + { + + + if((candleClosedBearish(timeFrame,2) && candleClosedBullish(timeFrame,1)) || (candleClosedBearish(timeFrame,3) && candleClosedDoji(timeFrame,2) && candleClosedBullish(timeFrame,1))) // if support formed + { + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getSupportZonesIdCounter(); + + + datetime _leftEdge = iTime(_Symbol,timeFrame,2); + datetime _rightEdge = D'2023.11.01 00:00:00'; + double supportPrice = iOpen(_Symbol,timeFrame,1); + + + + + + if((zoneContainer.getNumberOfActiveZones() != 0) && (supportPrice - zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge() >= rangeDistanceBetweenZones)) // check if it has a clean range down + { + + Zone* newZone = new Zone() ; + newZone.setLowerEdgePrice(supportPrice - supportExtendBelowCandle); + newZone.setHigherEdgePrice(supportPrice + supportHigherEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_SUPPORT_BREAKOUT"); + + + + + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + Print("current id counter of, zoneContainer_support is: " + currentIdCounter); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice + supportHigherEdgeExtend,supportPrice- supportExtendBelowCandle,BOS_zone_color); + //Print("Number of active zones is: " + zoneContainer.getNumberOfActiveZones()); + //zoneContainer.printZonesSortedArray(); + } + + else + if((zoneContainer.getNumberOfActiveZones() != 0) && (supportPrice - zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge() < rangeDistanceBetweenZones)) // if it doesnt have a clean range, just add it as a blue zone + { + double currentHighEdge = supportPrice + supportHigherEdgeExtend ; // this is a high edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + double currentLowEdge = supportPrice - supportExtendBelowCandle; // this is a low edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(supportPrice + supportHigherEdgeExtend); + newZone.setLowerEdgePrice(supportPrice - supportExtendBelowCandle); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_SUPPORT_NORMAL"); + + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + //objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice,supportPrice - supportExtendBelowCandle,usual_zone_color); + + } + + else + if(zoneContainer.getNumberOfActiveZones() == 0) // this means this is the first zone to add to the data strucutre + { + + //Print("Entered here 2"); + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(supportPrice + supportHigherEdgeExtend); + newZone.setLowerEdgePrice(supportPrice - supportExtendBelowCandle); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_SUPPORT_BREAKOUT"); + + + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice + supportHigherEdgeExtend,supportPrice - supportExtendBelowCandle,BOS_zone_color); + //zoneContainer.printZonesSortedArray(); + } + + + return true ; + + } + return false ; + } + + + + + + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool candleClosedBullish(ENUM_TIMEFRAMES _timeFrame, int _index) + { + double candleClose = iClose(_Symbol,_timeFrame,_index); + double candleOpen = iOpen(_Symbol,_timeFrame,_index); + + + if(candleClose >candleOpen) // the candle closed bullish + { + + return true ; + } + return false ; + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool candleClosedBearish(ENUM_TIMEFRAMES _timeFrame,int _index) + { + + + double candleClose = iClose(_Symbol,_timeFrame,_index); + double candleOpen = iOpen(_Symbol,_timeFrame,_index); + + + if(candleClose < candleOpen) // the candle closed bullish + { + + return true ; + } + return false ; + } +//+------------------------------------------------------------------+ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool candleClosedDoji(ENUM_TIMEFRAMES _timeFrame, int _index) + { + double candleClose = iClose(_Symbol,_timeFrame,_index); + double candleOpen = iOpen(_Symbol,_timeFrame,_index); + + if(candleClose == candleOpen) + { + return true; + } + else + { + return false; + } + + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void deleteZoneWithGUI(string _id, ZoneContainer& zoneContainer) + { + + + zoneContainer.deleteZone(_id); + + if(!ObjectDelete(_Symbol,_id)) + { + Print("Failed to delete object error: " + GetLastError()); + } + + + Print("Deleted the zone with gui!"); + + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void deleteZoneGuiOnly(string _id,ZoneContainer& zoneContainer) + { + + + if(!ObjectDelete(_Symbol,_id)) + { + Print("Failed to delete object error: " + GetLastError()); + } + + Print("Deleted the zone gui!"); + + } + + + + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool updateBreakAboveStructureAndDelete(ZoneContainer& zoneContainer, ENUM_TIMEFRAMES timeFrame, string timeFrameStr, double& brokenResistanceLowerEdge, string& type) + { + bool finishedDeleting = false ; + + if(zoneContainer.getNumberOfActiveZones() != 0) // if there are zones found + { + if(marketObserverTiger.candleClosedAboveResistanceByIndex(0,timeFrame,zoneContainer)) // check if candle closed above the zone + { + + + + datetime _leftEdgeRestestZone = iTime(_Symbol,timeFrame,4); + datetime _rightEdgeRetestZone = D'2023.11.01 00:00:00'; + + + while(!finishedDeleting && zoneContainer.getNumberOfActiveZones() != 0) // this while is used in the case of a candle closing above more than 1 zone at once + { + /* temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(0).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(0).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame("PERIOD_M30"); + temporaryRestestSupportZone.setType("TYPE_SUPPORT"); + deleteZoneWithGUI((zoneContainer.getZoneByIndex(0).getId())); // delete the zone with the GUI */ + + if(zoneContainer.getNumberOfActiveZones() != 0 && marketObserverTiger.candleClosedAboveResistanceByIndex(0,timeFrame,zoneContainer)) + { + zoneContainer.getZoneByIndex(0).getHigherEdge(); + temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(0).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(0).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame(timeFrameStr); + + type = zoneContainer.getZoneByIndex(0).getType(); + temporaryRestestSupportZone.setType("TYPE_SUPPORT_TEMPORARY"); + + brokenResistanceLowerEdge = zoneContainer.getZoneByIndex(0).getLowerEdge(); // save the lower edge of the broken zone, in order to return it in the parameter + + deleteZoneWithGUI((zoneContainer.getZoneByIndex(0).getId()),zoneContainer); // delete the zone with the GUI + } + else + { + finishedDeleting = true ; + } + + + } + + /*if(zoneContainer.getNumberOfActiveZones() != 0 && zoneContainer.getZoneByIndex(0).getType() == "TYPE_RESISTANCE_NORMAL"){ + + Zone* tempZone = zoneContainer.getZoneByIndex(0); + string zoneIdStr = tempZone.getId(); + int zoneIdInteger = StringToInteger(zoneIdStr); + + objectsManager.drawRectangleInStrategyTester(zoneIdInteger,tempZone.getLeftEdge(),tempZone.getRightEdge(),tempZone.getHigherEdge(),tempZone.getLowerEdge(),clrRed); + Print("Retrieved the zone succesfully!"); + + + } */ + return true ; + + } + + + } + return false ; + + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool updateBreakBelowStructureAndDelete(ZoneContainer& zoneContainer, ENUM_TIMEFRAMES timeFrame, string timeFrameStr, double& brokenSupportHigherEdge, string& type) + { + bool finishedDeleting = false ; + + if(zoneContainer.getNumberOfActiveZones() != 0) // if there are zones found + { + + if(marketObserverTiger.candleClosedBelowSupportByIndex(zoneContainer.getNumberOfActiveZones() -1,timeFrame,zoneContainer)) // check if candle closed below the zone + { + + + datetime _leftEdgeRestestZone = iTime(_Symbol,timeFrame,4); + datetime _rightEdgeRetestZone = D'2023.11.01 00:00:00'; + + + while(!finishedDeleting && zoneContainer.getNumberOfActiveZones() != 0) // this while is used in the case of a candle closing above more than 1 zone at once + { + /* temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(0).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(0).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame("PERIOD_M30"); + temporaryRestestSupportZone.setType("TYPE_SUPPORT"); + deleteZoneWithGUI((zoneContainer.getZoneByIndex(0).getId())); // delete the zone with the GUI */ + + if(zoneContainer.getNumberOfActiveZones() != 0 && marketObserverTiger.candleClosedBelowSupportByIndex(zoneContainer.getNumberOfActiveZones()-1,timeFrame,zoneContainer)) + { + zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge(); + temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("9999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame(timeFrameStr); + + type = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getType(); + temporaryRestestSupportZone.setType("TYPE_RESISTANCE_TEMPORARY"); + + brokenSupportHigherEdge = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge(); + + deleteZoneWithGUI((zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getId()),zoneContainer); // delete the zone with the GUI + } + else + { + finishedDeleting = true ; + } + + + } + + /*if(zoneContainer.getNumberOfActiveZones() != 0 && zoneContainer.getZoneByIndex(0).getType() == "TYPE_RESISTANCE_NORMAL"){ + + Zone* tempZone = zoneContainer.getZoneByIndex(0); + string zoneIdStr = tempZone.getId(); + int zoneIdInteger = StringToInteger(zoneIdStr); + + objectsManager.drawRectangleInStrategyTester(zoneIdInteger,tempZone.getLeftEdge(),tempZone.getRightEdge(),tempZone.getHigherEdge(),tempZone.getLowerEdge(),clrRed); + Print("Retrieved the zone succesfully!"); + + + } */ + + + return true ; + + + } + + + } + + return false ; + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double findClosestResistancePrice(ZoneContainer& zoneContainer) + { + + double closestResistancePrice = -1; + if(zoneContainer.getNumberOfActiveZones() != 0) + { + + closestResistancePrice = zoneContainer.getZoneByIndex(0).getLowerEdge(); + } + + return closestResistancePrice ; + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double findClosestSupportPrice(ZoneContainer& zoneContainer) + { + + double closestSupportPrice = -1 ; + if(zoneContainer.getNumberOfActiveZones() != 0) + { + + closestSupportPrice = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getLowerEdge(); + } + + return closestSupportPrice ; + + } +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool stopLossIsValidBuys(double stopLoss) + { + + if(SymbolInfoDouble(_Symbol, SYMBOL_ASK) - stopLoss < maxPipsRiskAmount) + { + return true ; + } + + return false ; + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool stopLossIsValidSells(double stopLoss) + { + if(stopLoss - SymbolInfoDouble(_Symbol, SYMBOL_BID) < maxPipsRiskAmount) + { + return true ; + } + return false ; + + } +//+------------------------------------------------------------------+ + +//+------------------------------------------------------------------+ + +bool bearishCandleIsWeak(ENUM_TIMEFRAMES _timeFrame, int index){ // this function assumes that the previous candle is bearish + + double upperWickLength = iHigh(_Symbol,_timeFrame,1) - iOpen(_Symbol,_timeFrame,1) ; + double totalCandleLength = iHigh(_Symbol,_timeFrame,1) - iClose(_Symbol,_timeFrame,1); + if((upperWickLength / totalCandleLength) >= WICK_RATIO_REJECTION ){ // this means the candle is not weak + return true ; + } + else{ + return false ; + } +} + +bool bullishCandleIsWeak(ENUM_TIMEFRAMES _timeFrame, int index){ // this function assumes that the previous candle is bullish + double lowerWickLength = iOpen(_Symbol,_timeFrame,1) - iLow(_Symbol,_timeFrame,1) ; + double totalCandleLength = iClose(_Symbol,_timeFrame,1) - iLow(_Symbol,_timeFrame,1) ; + + if((lowerWickLength/totalCandleLength) >= WICK_RATIO_REJECTION){ // this means the candle is not weak + return true ; + } + else{ + return false ; + } +} + + +bool buyBreakerCandleIsValid(ENUM_TIMEFRAMES _timeFrame){ + + if((iClose(_Symbol,_timeFrame,1) - iOpen(_Symbol,_timeFrame,1)) >= SIZE_OF_BREAKER_CANDLE_BODY) { + return true ; + } + else{ + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + Comment(timeInStr + " Bullish Breaker candle body is too small to take a trade !"); + return false ; + + } + +} + +bool sellBreakerCandleIsValid(ENUM_TIMEFRAMES _timeFrame){ + if((iOpen(_Symbol,_timeFrame,1) - iClose(_Symbol,_timeFrame,1)) >= SIZE_OF_BREAKER_CANDLE_BODY) { + return true ; + } + else{ + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + Comment(timeInStr + " Bearish Breaker candle body is too small to take a trade !"); + return false ; + + } + +} + +bool closePartialFromAllPositions(double partialAmount){ + + for(uint i=0 ; i< PositionsTotal() ; i++){ + + ulong positionTicket = PositionGetTicket(i); + if(PositionSelectByTicket(positionTicket)){ + + double positionVolume = PositionGetDouble(POSITION_VOLUME); + double lotsToClose = positionVolume * partialAmount ; + if(trade.PositionClosePartial(positionTicket,NormalizeDouble(lotsToClose,2))){ + Print("Closed partials succesffully"); + return true ; + } + else{ + Print("Failed to close partials, Error: " + GetLastError()); + return false ; + } + + } + + + + } + return false ; + +} + + +bool sessionIsNy(){ + MqlDateTime mqldt ; + datetime currTime = TimeCurrent(mqldt); + + if(mqldt.hour >= 14 && mqldt.hour <= 18){ + return true ; + } + + return false ; + +} + + +bool sessionIsLondon(){ + MqlDateTime mqldt ; + datetime currTime = TimeCurrent(mqldt); + + if(mqldt.hour >= 8 && mqldt.hour <= 11){ + return true ; + } + + return false ; + +} \ No newline at end of file diff --git a/TigerEntryTakerNewGen.ex5 b/TigerEntryTakerNewGen.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..c99f2ca61d264ff48a0f9ea48737fed57be5af5d GIT binary patch literal 56532 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 sXw)u^fQQX=b2CXeU`%iq)= cleanRangeUponEntry) + { + + double stopLossBased_H1 = iLow(_Symbol,PERIOD_H1,1); + double stopLossBased_M30 = iLow(_Symbol,PERIOD_M30,1); + double stopLossBased_M15 = iLow(_Symbol,PERIOD_M15,1); + + stopLossBased_H1 = stopLossBased_H1 - stopLossUnderWickBy ; + stopLossBased_M30 = stopLossBased_M30 - stopLossUnderWickBy ; + stopLossBased_M15 = stopLossBased_M15 - stopLossUnderWickBy ; + + if(stopLossIsValidBuys(stopLossBased_M30, maxPipsRiskAmount)) + { + + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_M30); + if(PositionsTotal() == 0) // there are no active trades + { + + activeTradeId = buyEntryManager.takeBuyTradeTiger(lotsToEnter,stopLossBased_M30, SymbolInfoDouble(_Symbol, SYMBOL_ASK) + netTakeProfit) ; + activeTradeType = "BUY" ; + Comment("Took a buy. stop loss: based on M30, " + "Active trade id: " + activeTradeId); + } + else + { + + Comment("I cant take a trade because another trade is running"); + } + + + } + else + if(stopLossIsValidBuys(stopLossBased_M15,maxPipsRiskAmount) && candleClosedBullish(PERIOD_M15,1)) + { + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_M15); + if(PositionsTotal() == 0) + { + activeTradeId = buyEntryManager.takeBuyTradeTiger(lotsToEnter,stopLossBased_M15, SymbolInfoDouble(_Symbol, SYMBOL_ASK) + netTakeProfit) ; + activeTradeType = "BUY" ; + Comment("Took a buy. stop loss: based on M15, " + "Active trade id: " + activeTradeId); + } + else + { + + Comment("I cant take a trade because another trade is running"); + + } + + } + + else + { + + + Comment("Failed to find a valid stop loss on both M30 and M15 !"); + } + + } + + else + { + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + + Comment(timeInStr + ": Price Broke the resitance zone, but not enough clean range to take a trade"); + + } + + } + else + { + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + Comment(timeInStr+ ": Price broke the resistance zone but i dont see the next target zone, Or the zone price broke was not a breakout zone "); + + } + + } + + + if(updateBreakBelowStructureAndDelete(zoneContainerSupport_M30,PERIOD_M30,"PERIOD_M30",brokenSupportHigherPrice,brokenZoneTypeSupport) + && sellBreakerCandleIsValid(PERIOD_M30, SIZE_OF_BREAKER_CANDLE_BODY) + && ((sessionIsNy() && TRADE_NEW_YORK_ALLOWED) || (sessionIsLondon() && TRADE_LONDON_ALLOWED) )) // means M30 candle broke structure, and the breaker candle is valid (big enough),and time is in the sessions (ny or london or both, based on what the user chose)) + { + + + double firstSupportPrice = findClosestSupportPrice(zoneContainerSupport_M30); + double cleanRangeValueSells = SymbolInfoDouble(_Symbol, SYMBOL_BID) - firstSupportPrice; + + Print("firstSupport variable is: " + firstSupportPrice); + Print("cleanRangeValueSells :" + cleanRangeValueSells); + + + if(firstSupportPrice != -1 && brokenZoneTypeSupport == "TYPE_SUPPORT_BREAKOUT") + { + Comment("M30 candle Broke and closed below the zone. the closest support price is:" + DoubleToString(firstSupportPrice)); + if(cleanRangeValueSells >= cleanRangeUponEntry) + { + + double stopLossBased_H1 = iHigh(_Symbol,PERIOD_H1,1); + double stopLossBased_M30 = iHigh(_Symbol,PERIOD_M30,1); + double stopLossBased_M15 = iHigh(_Symbol,PERIOD_M15,1); + + stopLossBased_H1 = stopLossBased_H1 + stopLossAboveWickBy ; + stopLossBased_M30 = stopLossBased_M30 + stopLossAboveWickBy ; + stopLossBased_M15 = stopLossBased_M15 + stopLossAboveWickBy ; + + if(stopLossIsValidSells(stopLossBased_M30, maxPipsRiskAmount)) + { + + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_M30); + if(PositionsTotal() == 0) + { + activeTradeId = sellEntryManager.takeSellTradeTiger(lotsToEnter,stopLossBased_M30, SymbolInfoDouble(_Symbol, SYMBOL_BID) - netTakeProfit) ; + activeTradeType = "SELL"; + Comment("Took a sell. stop loss: based on M30, " + "Active trade id: " + activeTradeId); + + } + else + { + + Comment("i cant take a trade since another one is running"); + } + + + } + else + if(stopLossIsValidSells(stopLossBased_M15,maxPipsRiskAmount) && candleClosedBearish(PERIOD_M15,1)) + { + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_M15); + + if(PositionsTotal() == 0) + { + activeTradeId = sellEntryManager.takeSellTradeTiger(lotsToEnter,stopLossBased_M15, SymbolInfoDouble(_Symbol, SYMBOL_BID) - netTakeProfit) ; + activeTradeType = "SELL"; + Comment("Took a sell. stop loss: based on M15, "+ "Active trade id: " + activeTradeId); + } + else + { + Comment("i cant take a trade since another one is running"); + } + } + + else + { + + + Comment("Failed to find a valid stop loss on both M30 and M15 !"); + } + + } + + else + { + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + + + Comment(timeInStr + ": Price Broke the support zone, but not enough clean range to take a trade"); + + } + + } + else + { + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + Comment(timeInStr+ ": Price broke the support zone but i dont see the next target zone, Or the zone price broke was not a breakout zone "); + + } + + + + } + + + datetime currTime = TimeCurrent(); + ObjectSetString(0,"clockTextTiger",OBJPROP_TEXT,TimeToString(currTime,TIME_MINUTES)); + + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +if(newCandleDetectorDaily.isNewCandle()) + { + +//detectAndDrawResistanceOnTimeFrame(PERIOD_D1,"PERIOD_D1",clrYellow,clrYellow,zoneContainer_D1); +//updateBreakAboveStructureAndDelete(zoneContainer_D1,PERIOD_D1,"PERIOD_D1"); + objectsManager.drawVerticalLine(clrAqua, TimeCurrent()); + + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +if(newCandleDetectorWeekly.isNewCandle()) + { + + objectsManager.drawVerticalLine(clrRed, TimeCurrent());; + } + + } + +//+------------------------------------------------------------------+ +//| Timer function | +//+------------------------------------------------------------------+ +void OnTimer() + { +//--- + + } +//+------------------------------------------------------------------+ +//| Trade function | +//+------------------------------------------------------------------+ +void OnTrade() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TradeTransaction function | +//+------------------------------------------------------------------+ +void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) + { +//--- + + } +//+------------------------------------------------------------------+ +//| Tester function | +//+------------------------------------------------------------------+ +double OnTester() + { +//--- + double ret=0.0; +//--- + +//--- + return(ret); + } +//+------------------------------------------------------------------+ +//| TesterInit function | +//+------------------------------------------------------------------+ +void OnTesterInit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterPass function | +//+------------------------------------------------------------------+ +void OnTesterPass() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterDeinit function | +//+------------------------------------------------------------------+ +void OnTesterDeinit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| ChartEvent function | +//+------------------------------------------------------------------+ +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) + { +//--- + + } +//+------------------------------------------------------------------+ +//| BookEvent function | +//+------------------------------------------------------------------+ +void OnBookEvent(const string &symbol) + { +//--- + + } +//+------------------------------------------------------------------+ + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool detectAndDrawResistanceOnTimeFrame(ENUM_TIMEFRAMES timeFrame, string timeFrameStr, long BOS_zone_color, long usual_zone_color,ZoneContainer& zoneContainer) + { + + + if((candleClosedBullish(timeFrame,2) && candleClosedBearish(timeFrame,1)) || (candleClosedBullish(timeFrame,3) && candleClosedDoji(timeFrame,2) && candleClosedBearish(timeFrame,1))) // if resistance formed + { + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getZonesIdCounter(); + + + datetime _leftEdge = iTime(_Symbol,timeFrame,2); + datetime _rightEdge = D'2023.11.01 00:00:00'; + double resistancePrice = iOpen(_Symbol,timeFrame,1); + + + + + + if((zoneContainer.getNumberOfActiveZones() != 0) && (zoneContainer.getZoneByIndex(0).getLowerEdge() - resistancePrice >= rangeDistanceBetweenZones)) // check if it has a clean range above + { + + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice - resistanceLowerEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_RESISTANCE_BREAKOUT"); + + + + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + Print("current id counter of, zoneContainer is: " + currentIdCounter); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice - resistanceLowerEdgeExtend,BOS_zone_color); + //Print("Number of active zones is: " + zoneContainer.getNumberOfActiveZones()); + //zoneContainer.printZonesSortedArray(); + } + + else + if((zoneContainer.getNumberOfActiveZones() != 0) && (zoneContainer.getZoneByIndex(0).getLowerEdge() - resistancePrice < rangeDistanceBetweenZones)) // if it doesnt have a clean range, just add it as a blue zone + { + double currentHighEdge = resistancePrice + resistanceExtendAboveCandle ; // this is a high edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + double currentLowEdge = resistancePrice - resistanceLowerEdgeExtend; // this is a low edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice - resistanceLowerEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_RESISTANCE_NORMAL"); + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + //objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice,usual_zone_color); + + /*if(zoneContainer.getZoneByIndex(1).getType() == "TYPE_RESISTANCE_NORMAL"){ + string idOfZoneToHide = zoneContainer.getZoneByIndex(1).getId(); + deleteZoneGuiOnly(idOfZoneToHide,zoneContainer); + } */ + + + + } + + else + if(zoneContainer.getNumberOfActiveZones() == 0) // this means this is the first zone to add to the data strucutre + { + + //Print("Entered here 2"); + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice - resistanceLowerEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_RESISTANCE_BREAKOUT"); + + + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice - resistanceLowerEdgeExtend,BOS_zone_color); + //zoneContainer.printZonesSortedArray(); + } + + return true ; + + } + return false ; + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool detectAndDrawSupportOnTimeFrame(ENUM_TIMEFRAMES timeFrame, string timeFrameStr, long BOS_zone_color, long usual_zone_color,ZoneContainer& zoneContainer) + { + + + if((candleClosedBearish(timeFrame,2) && candleClosedBullish(timeFrame,1)) || (candleClosedBearish(timeFrame,3) && candleClosedDoji(timeFrame,2) && candleClosedBullish(timeFrame,1))) // if support formed + { + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getSupportZonesIdCounter(); + + + datetime _leftEdge = iTime(_Symbol,timeFrame,2); + datetime _rightEdge = D'2023.11.01 00:00:00'; + double supportPrice = iOpen(_Symbol,timeFrame,1); + + + + + + if((zoneContainer.getNumberOfActiveZones() != 0) && (supportPrice - zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge() >= rangeDistanceBetweenZones)) // check if it has a clean range down + { + + Zone* newZone = new Zone() ; + newZone.setLowerEdgePrice(supportPrice - supportExtendBelowCandle); + newZone.setHigherEdgePrice(supportPrice + supportHigherEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_SUPPORT_BREAKOUT"); + + + + + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + Print("current id counter of, zoneContainer_support is: " + currentIdCounter); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice + supportHigherEdgeExtend,supportPrice- supportExtendBelowCandle,BOS_zone_color); + //Print("Number of active zones is: " + zoneContainer.getNumberOfActiveZones()); + //zoneContainer.printZonesSortedArray(); + } + + else + if((zoneContainer.getNumberOfActiveZones() != 0) && (supportPrice - zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge() < rangeDistanceBetweenZones)) // if it doesnt have a clean range, just add it as a blue zone + { + double currentHighEdge = supportPrice + supportHigherEdgeExtend ; // this is a high edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + double currentLowEdge = supportPrice - supportExtendBelowCandle; // this is a low edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(supportPrice + supportHigherEdgeExtend); + newZone.setLowerEdgePrice(supportPrice - supportExtendBelowCandle); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_SUPPORT_NORMAL"); + + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + //objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice,supportPrice - supportExtendBelowCandle,usual_zone_color); + + } + + else + if(zoneContainer.getNumberOfActiveZones() == 0) // this means this is the first zone to add to the data strucutre + { + + //Print("Entered here 2"); + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(supportPrice + supportHigherEdgeExtend); + newZone.setLowerEdgePrice(supportPrice - supportExtendBelowCandle); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_SUPPORT_BREAKOUT"); + + + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice + supportHigherEdgeExtend,supportPrice - supportExtendBelowCandle,BOS_zone_color); + //zoneContainer.printZonesSortedArray(); + } + + + return true ; + + } + return false ; + } + + + + + + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool candleClosedBullish(ENUM_TIMEFRAMES _timeFrame, int _index) + { + double candleClose = iClose(_Symbol,_timeFrame,_index); + double candleOpen = iOpen(_Symbol,_timeFrame,_index); + + + if(candleClose >candleOpen) // the candle closed bullish + { + + return true ; + } + return false ; + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool candleClosedBearish(ENUM_TIMEFRAMES _timeFrame,int _index) + { + + + double candleClose = iClose(_Symbol,_timeFrame,_index); + double candleOpen = iOpen(_Symbol,_timeFrame,_index); + + + if(candleClose < candleOpen) // the candle closed bullish + { + + return true ; + } + return false ; + } +//+------------------------------------------------------------------+ + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool candleClosedDoji(ENUM_TIMEFRAMES _timeFrame, int _index) + { + double candleClose = iClose(_Symbol,_timeFrame,_index); + double candleOpen = iOpen(_Symbol,_timeFrame,_index); + + if(candleClose == candleOpen) + { + return true; + } + else + { + return false; + } + + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void deleteZoneWithGUI(string _id, ZoneContainer& zoneContainer) + { + + + zoneContainer.deleteZone(_id); + + if(!ObjectDelete(_Symbol,_id)) + { + Print("Failed to delete object error: " + GetLastError()); + } + + + Print("Deleted the zone with gui!"); + + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void deleteZoneGuiOnly(string _id,ZoneContainer& zoneContainer) + { + + + if(!ObjectDelete(_Symbol,_id)) + { + Print("Failed to delete object error: " + GetLastError()); + } + + Print("Deleted the zone gui!"); + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool updateBreakAboveStructureAndDelete(ZoneContainer& zoneContainer, ENUM_TIMEFRAMES timeFrame, string timeFrameStr, double& brokenResistanceLowerEdge, string& type) + { + bool finishedDeleting = false ; + + if(zoneContainer.getNumberOfActiveZones() != 0) // if there are zones found + { + if(marketObserverTiger.candleClosedAboveResistanceByIndex(0,timeFrame,zoneContainer)) // check if candle closed above the zone + { + + + + datetime _leftEdgeRestestZone = iTime(_Symbol,timeFrame,4); + datetime _rightEdgeRetestZone = D'2023.11.01 00:00:00'; + + + while(!finishedDeleting && zoneContainer.getNumberOfActiveZones() != 0) // this while is used in the case of a candle closing above more than 1 zone at once + { + /* temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(0).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(0).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame("PERIOD_M30"); + temporaryRestestSupportZone.setType("TYPE_SUPPORT"); + deleteZoneWithGUI((zoneContainer.getZoneByIndex(0).getId())); // delete the zone with the GUI */ + + if(zoneContainer.getNumberOfActiveZones() != 0 && marketObserverTiger.candleClosedAboveResistanceByIndex(0,timeFrame,zoneContainer)) + { + zoneContainer.getZoneByIndex(0).getHigherEdge(); + temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(0).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(0).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame(timeFrameStr); + + type = zoneContainer.getZoneByIndex(0).getType(); + temporaryRestestSupportZone.setType("TYPE_SUPPORT_TEMPORARY"); + + brokenResistanceLowerEdge = zoneContainer.getZoneByIndex(0).getLowerEdge(); // save the lower edge of the broken zone, in order to return it in the parameter + + deleteZoneWithGUI((zoneContainer.getZoneByIndex(0).getId()),zoneContainer); // delete the zone with the GUI + } + else + { + finishedDeleting = true ; + } + + + } + + /*if(zoneContainer.getNumberOfActiveZones() != 0 && zoneContainer.getZoneByIndex(0).getType() == "TYPE_RESISTANCE_NORMAL"){ + + Zone* tempZone = zoneContainer.getZoneByIndex(0); + string zoneIdStr = tempZone.getId(); + int zoneIdInteger = StringToInteger(zoneIdStr); + + objectsManager.drawRectangleInStrategyTester(zoneIdInteger,tempZone.getLeftEdge(),tempZone.getRightEdge(),tempZone.getHigherEdge(),tempZone.getLowerEdge(),clrRed); + Print("Retrieved the zone succesfully!"); + + + } */ + return true ; + + } + + + } + return false ; + + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool updateBreakBelowStructureAndDelete(ZoneContainer& zoneContainer, ENUM_TIMEFRAMES timeFrame, string timeFrameStr, double& brokenSupportHigherEdge, string& type) + { + bool finishedDeleting = false ; + + if(zoneContainer.getNumberOfActiveZones() != 0) // if there are zones found + { + + if(marketObserverTiger.candleClosedBelowSupportByIndex(zoneContainer.getNumberOfActiveZones() -1,timeFrame,zoneContainer)) // check if candle closed below the zone + { + + + datetime _leftEdgeRestestZone = iTime(_Symbol,timeFrame,4); + datetime _rightEdgeRetestZone = D'2023.11.01 00:00:00'; + + + while(!finishedDeleting && zoneContainer.getNumberOfActiveZones() != 0) // this while is used in the case of a candle closing above more than 1 zone at once + { + /* temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(0).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(0).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame("PERIOD_M30"); + temporaryRestestSupportZone.setType("TYPE_SUPPORT"); + deleteZoneWithGUI((zoneContainer.getZoneByIndex(0).getId())); // delete the zone with the GUI */ + + if(zoneContainer.getNumberOfActiveZones() != 0 && marketObserverTiger.candleClosedBelowSupportByIndex(zoneContainer.getNumberOfActiveZones()-1,timeFrame,zoneContainer)) + { + zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge(); + temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("9999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame(timeFrameStr); + + type = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getType(); + temporaryRestestSupportZone.setType("TYPE_RESISTANCE_TEMPORARY"); + + brokenSupportHigherEdge = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge(); + + deleteZoneWithGUI((zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getId()),zoneContainer); // delete the zone with the GUI + } + else + { + finishedDeleting = true ; + } + + + } + + /*if(zoneContainer.getNumberOfActiveZones() != 0 && zoneContainer.getZoneByIndex(0).getType() == "TYPE_RESISTANCE_NORMAL"){ + + Zone* tempZone = zoneContainer.getZoneByIndex(0); + string zoneIdStr = tempZone.getId(); + int zoneIdInteger = StringToInteger(zoneIdStr); + + objectsManager.drawRectangleInStrategyTester(zoneIdInteger,tempZone.getLeftEdge(),tempZone.getRightEdge(),tempZone.getHigherEdge(),tempZone.getLowerEdge(),clrRed); + Print("Retrieved the zone succesfully!"); + + + } */ + + + return true ; + + + } + + + } + + return false ; + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double findClosestResistancePrice(ZoneContainer& zoneContainer) + { + + double closestResistancePrice = -1; + if(zoneContainer.getNumberOfActiveZones() != 0) + { + + closestResistancePrice = zoneContainer.getZoneByIndex(0).getLowerEdge(); + } + + return closestResistancePrice ; + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double findClosestSupportPrice(ZoneContainer& zoneContainer) + { + + double closestSupportPrice = -1 ; + if(zoneContainer.getNumberOfActiveZones() != 0) + { + + closestSupportPrice = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getLowerEdge(); + } + + return closestSupportPrice ; + + } + + + +bool buyStopLossUnderZone(double resistanceZoneLowerEdge, double stopLossValue){ + + if(stopLossValue < resistanceZoneLowerEdge){ + return true ; + } + else{ + Comment("stop loss is not under the zone im not taking a buy"); + return false ; + + } + +} + + +bool sellStopLossAboveZone(double supportZoneHigherEdge, double stopLossValue){ + + if(stopLossValue > supportZoneHigherEdge){ + return true ; + } + else{ + Comment("stop loss is not above the zone, so im not taking a sell"); + return false ; + } +} + + +void manageRiskIfNeeded(){ + + if(PositionsTotal()!= 0) // There is an active trade + { + if(activeTradeType == "BUY") + { + + if(candleClosedBearish(PERIOD_M15,1) && !bearishCandleIsWeak(PERIOD_M15,1, WICK_RATIO_REJECTION)){ + Print("M15 , closed against my direction, we should close half"); + if(securedRisk == false && closePartialFromAllPositions(riskManagementPartial)){ + securedRisk = true ; + } + } + + } + else + if(activeTradeType == "SELL") + { + if(candleClosedBullish(PERIOD_M15,1) && !bullishCandleIsWeak(PERIOD_M15,1, WICK_RATIO_REJECTION)){ + Print("M15 , closed against my direction, we should close half"); + if(securedRisk == false && closePartialFromAllPositions(riskManagementPartial)){ + securedRisk = true ; + } + } + + } + + } + else{ + securedRisk = false ; // return the risk secure flag to false , to be ready for the next trade + + } + +} \ No newline at end of file diff --git a/TigerEntryTakerNewGenNext.ex5 b/TigerEntryTakerNewGenNext.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..555326bf220c1dc15ceb77a6b027fd9a7340dcba GIT binary patch literal 63566 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 HFmmx= cleanRangeUponEntry) + { + + double stopLossBased_H1 = iLow(_Symbol,PERIOD_H1,1); + double stopLossBased_M30 = iLow(_Symbol,PERIOD_M30,1); + double stopLossBased_M15 = iLow(_Symbol,PERIOD_M15,1); + + stopLossBased_H1 = stopLossBased_H1 - stopLossUnderWickBy ; + stopLossBased_M30 = stopLossBased_M30 - stopLossUnderWickBy ; + stopLossBased_M15 = stopLossBased_M15 - stopLossUnderWickBy ; + + if(stopLossIsValidBuys(stopLossBased_M30, maxPipsRiskAmount)) + { + + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_M30); + int indexToNewTrade ; + if((indexToNewTrade = findAvailableSpotInBuyManagerArr()) != -1) // find a spot in the trades array, and save the result + { + Print("The free index found is: " + indexToNewTrade); + activeTradeId = buyEntryManager.takeBuyTradeTiger(lotsToEnter,stopLossBased_M30) ; + + BuyTradeManagerTiger* tempTigerManager= new BuyTradeManagerTiger(activeTradeId); // create an object of type buyTradeManagerTiger + BuyActiveTradesArray[indexToNewTrade] = tempTigerManager ;// put the new object in the array + buysCount++; + + Comment("Took a buy. stop loss: based on M30, " + "Active trade id: " + activeTradeId); + } + else + { + + Comment("I cant take a trade because the trades array is full"); + } + + + } + else + if(stopLossIsValidBuys(stopLossBased_M15,maxPipsRiskAmount) && candleClosedBullish(PERIOD_M15,1)) + { + + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_M15); + int indexToNewTrade ; + if((indexToNewTrade = findAvailableSpotInBuyManagerArr()) != -1) // find a spot in the trades array, and save the result + { + Print("The free index found is: " + indexToNewTrade); + activeTradeId = buyEntryManager.takeBuyTradeTiger(lotsToEnter,stopLossBased_M15) ; + + BuyTradeManagerTiger* tempTigerManager= new BuyTradeManagerTiger(activeTradeId); // create an object of type buyTradeManagerTiger + BuyActiveTradesArray[indexToNewTrade] = tempTigerManager ;// put the new object in the array + buysCount++; + Comment("Took a buy. stop loss: based on M15, " + "Active trade id: " + activeTradeId); + } + else + { + + Comment("I cant take a trade because the trades array is full"); + + } + + } + + else + { + + + Comment("Failed to find a valid stop loss on both M30 and M15 !"); + } + + } + + else + { + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + + Comment(timeInStr + ": Price Broke the resitance zone, but not enough clean range to take a trade"); + + } + + } + else + { + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + Comment(timeInStr+ ": Price broke the resistance zone but i dont see the next target zone, Or the zone price broke was not a breakout zone "); + + } + + } + + + if(updateBreakBelowStructureAndDelete(zoneContainerSupport_M30,PERIOD_M30,"PERIOD_M30",brokenSupportHigherPrice,brokenZoneTypeSupport) + && sellBreakerCandleIsValid(PERIOD_M30, SIZE_OF_BREAKER_CANDLE_BODY) + && ((sessionIsNy() && TRADE_NEW_YORK_ALLOWED) || (sessionIsLondon() && TRADE_LONDON_ALLOWED)) && SELLS_ALLOWED) // means M30 candle broke structure, and the breaker candle is valid (big enough),and time is in the sessions (ny or london or both, based on what the user chose)) + { + + + double firstSupportPrice = findClosestSupportPrice(zoneContainerSupport_M30); + double cleanRangeValueSells = SymbolInfoDouble(_Symbol, SYMBOL_BID) - firstSupportPrice; + + Print("firstSupport variable is: " + firstSupportPrice); + Print("cleanRangeValueSells :" + cleanRangeValueSells); + + + if(firstSupportPrice != -1 && brokenZoneTypeSupport == "TYPE_SUPPORT_BREAKOUT") + { + Comment("M30 candle Broke and closed below the zone. the closest support price is:" + DoubleToString(firstSupportPrice)); + if(cleanRangeValueSells >= cleanRangeUponEntry) + { + + double stopLossBased_H1 = iHigh(_Symbol,PERIOD_H1,1); + double stopLossBased_M30 = iHigh(_Symbol,PERIOD_M30,1); + double stopLossBased_M15 = iHigh(_Symbol,PERIOD_M15,1); + + stopLossBased_H1 = stopLossBased_H1 + stopLossAboveWickBy ; + stopLossBased_M30 = stopLossBased_M30 + stopLossAboveWickBy ; + stopLossBased_M15 = stopLossBased_M15 + stopLossAboveWickBy ; + + if(stopLossIsValidSells(stopLossBased_M30, maxPipsRiskAmount)) + { + + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_M30); + int indexToNewTrade ; + + if((indexToNewTrade = findAvailableSpotInSellManagerArr()) != -1) + { + + Print("The free index found is: " + indexToNewTrade); + activeTradeId = sellEntryManager.takeSellTradeTiger(lotsToEnter,stopLossBased_M30) ; + + SellTradeManagerTiger* tempTigerManager= new SellTradeManagerTiger(activeTradeId); // create an object of type buyTradeManagerTiger + SellActiveTradesArray[indexToNewTrade] = tempTigerManager ;// put the new object in the array + sellsCount++; + Comment("Took a sell. stop loss: based on M30, " + "Active trade id: " + activeTradeId); + + } + else + { + + Comment("i cant take a trade because the arrray is full"); + } + + + } + else + if(stopLossIsValidSells(stopLossBased_M15,maxPipsRiskAmount) && candleClosedBearish(PERIOD_M15,1)) + { + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_M15); + int indexToNewTrade ; + if((indexToNewTrade = findAvailableSpotInSellManagerArr()) != -1) + { + Print("The free index found is: " + indexToNewTrade); + activeTradeId = sellEntryManager.takeSellTradeTiger(lotsToEnter,stopLossBased_M15) ; + + SellTradeManagerTiger* tempTigerManager= new SellTradeManagerTiger(activeTradeId); // create an object of type buyTradeManagerTiger + SellActiveTradesArray[indexToNewTrade] = tempTigerManager ;// put the new object in the array + sellsCount++; + Comment("Took a sell. stop loss: based on M15, "+ "Active trade id: " + activeTradeId); + } + else + { + Comment("i cant take a trade since another one is running"); + } + } + + else + { + + + Comment("Failed to find a valid stop loss on both M30 and M15 !"); + } + + } + + else + { + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + + + Comment(timeInStr + ": Price Broke the support zone, but not enough clean range to take a trade"); + + } + + } + else + { + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + Comment(timeInStr+ ": Price broke the support zone but i dont see the next target zone, Or the zone price broke was not a breakout zone "); + + } + + + + } + + + datetime currTime = TimeCurrent(); + ObjectSetString(0,"clockTextTiger",OBJPROP_TEXT,TimeToString(currTime,TIME_MINUTES)); + + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + if(newCandleDetectorDaily.isNewCandle()) + { + + //detectAndDrawResistanceOnTimeFrame(PERIOD_D1,"PERIOD_D1",clrYellow,clrYellow,zoneContainer_D1); + //updateBreakAboveStructureAndDelete(zoneContainer_D1,PERIOD_D1,"PERIOD_D1"); + objectsManager.drawVerticalLine(clrAqua, TimeCurrent()); + + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + if(newCandleDetectorWeekly.isNewCandle()) + { + + objectsManager.drawVerticalLine(clrRed, TimeCurrent()); + } + + } + +//+------------------------------------------------------------------+ +//| Timer function | +//+------------------------------------------------------------------+ +void OnTimer() + { +//--- + + } +//+------------------------------------------------------------------+ +//| Trade function | +//+------------------------------------------------------------------+ +void OnTrade() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TradeTransaction function | +//+------------------------------------------------------------------+ +void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) + { +//--- + + } +//+------------------------------------------------------------------+ +//| Tester function | +//+------------------------------------------------------------------+ +double OnTester() + { +//--- + double ret=0.0; +//--- + +//--- + return(ret); + } +//+------------------------------------------------------------------+ +//| TesterInit function | +//+------------------------------------------------------------------+ +void OnTesterInit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterPass function | +//+------------------------------------------------------------------+ +void OnTesterPass() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterDeinit function | +//+------------------------------------------------------------------+ +void OnTesterDeinit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| ChartEvent function | +//+------------------------------------------------------------------+ +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) + { +//--- + + } +//+------------------------------------------------------------------+ +//| BookEvent function | +//+------------------------------------------------------------------+ +void OnBookEvent(const string &symbol) + { +//--- + + } +//+------------------------------------------------------------------+ + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool detectAndDrawResistanceOnTimeFrame(ENUM_TIMEFRAMES timeFrame, string timeFrameStr, long BOS_zone_color, long usual_zone_color,ZoneContainer& zoneContainer) + { + + + if((candleClosedBullish(timeFrame,2) && candleClosedBearish(timeFrame,1)) || (candleClosedBullish(timeFrame,3) && candleClosedDoji(timeFrame,2) && candleClosedBearish(timeFrame,1))) // if resistance formed + { + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getZonesIdCounter(); + + + datetime _leftEdge = iTime(_Symbol,timeFrame,2); + datetime _rightEdge = D'2023.11.01 00:00:00'; + double resistancePrice = iOpen(_Symbol,timeFrame,1); + + + + + + if((zoneContainer.getNumberOfActiveZones() != 0) && (zoneContainer.getZoneByIndex(0).getLowerEdge() - resistancePrice >= rangeDistanceBetweenZones)) // check if it has a clean range above + { + + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice - resistanceLowerEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_RESISTANCE_BREAKOUT"); + + + + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + Print("current id counter of, zoneContainer is: " + currentIdCounter); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice - resistanceLowerEdgeExtend,BOS_zone_color); + //Print("Number of active zones is: " + zoneContainer.getNumberOfActiveZones()); + //zoneContainer.printZonesSortedArray(); + } + + else + if((zoneContainer.getNumberOfActiveZones() != 0) && (zoneContainer.getZoneByIndex(0).getLowerEdge() - resistancePrice < rangeDistanceBetweenZones)) // if it doesnt have a clean range, just add it as a blue zone + { + double currentHighEdge = resistancePrice + resistanceExtendAboveCandle ; // this is a high edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + double currentLowEdge = resistancePrice - resistanceLowerEdgeExtend; // this is a low edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice - resistanceLowerEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_RESISTANCE_NORMAL"); + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + //objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice,usual_zone_color); + + /*if(zoneContainer.getZoneByIndex(1).getType() == "TYPE_RESISTANCE_NORMAL"){ + string idOfZoneToHide = zoneContainer.getZoneByIndex(1).getId(); + deleteZoneGuiOnly(idOfZoneToHide,zoneContainer); + } */ + + + + } + + else + if(zoneContainer.getNumberOfActiveZones() == 0) // this means this is the first zone to add to the data strucutre + { + + //Print("Entered here 2"); + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice - resistanceLowerEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_RESISTANCE_BREAKOUT"); + + + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice - resistanceLowerEdgeExtend,BOS_zone_color); + //zoneContainer.printZonesSortedArray(); + } + + return true ; + + } + return false ; + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool detectAndDrawSupportOnTimeFrame(ENUM_TIMEFRAMES timeFrame, string timeFrameStr, long BOS_zone_color, long usual_zone_color,ZoneContainer& zoneContainer) + { + + + if((candleClosedBearish(timeFrame,2) && candleClosedBullish(timeFrame,1)) || (candleClosedBearish(timeFrame,3) && candleClosedDoji(timeFrame,2) && candleClosedBullish(timeFrame,1))) // if support formed + { + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getSupportZonesIdCounter(); + + + datetime _leftEdge = iTime(_Symbol,timeFrame,2); + datetime _rightEdge = D'2023.11.01 00:00:00'; + double supportPrice = iOpen(_Symbol,timeFrame,1); + + + + + + if((zoneContainer.getNumberOfActiveZones() != 0) && (supportPrice - zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge() >= rangeDistanceBetweenZones)) // check if it has a clean range down + { + + Zone* newZone = new Zone() ; + newZone.setLowerEdgePrice(supportPrice - supportExtendBelowCandle); + newZone.setHigherEdgePrice(supportPrice + supportHigherEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_SUPPORT_BREAKOUT"); + + + + + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + Print("current id counter of, zoneContainer_support is: " + currentIdCounter); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice + supportHigherEdgeExtend,supportPrice- supportExtendBelowCandle,BOS_zone_color); + //Print("Number of active zones is: " + zoneContainer.getNumberOfActiveZones()); + //zoneContainer.printZonesSortedArray(); + } + + else + if((zoneContainer.getNumberOfActiveZones() != 0) && (supportPrice - zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge() < rangeDistanceBetweenZones)) // if it doesnt have a clean range, just add it as a blue zone + { + double currentHighEdge = supportPrice + supportHigherEdgeExtend ; // this is a high edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + double currentLowEdge = supportPrice - supportExtendBelowCandle; // this is a low edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(supportPrice + supportHigherEdgeExtend); + newZone.setLowerEdgePrice(supportPrice - supportExtendBelowCandle); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_SUPPORT_NORMAL"); + + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + //objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice,supportPrice - supportExtendBelowCandle,usual_zone_color); + + } + + else + if(zoneContainer.getNumberOfActiveZones() == 0) // this means this is the first zone to add to the data strucutre + { + + //Print("Entered here 2"); + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(supportPrice + supportHigherEdgeExtend); + newZone.setLowerEdgePrice(supportPrice - supportExtendBelowCandle); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_SUPPORT_BREAKOUT"); + + + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice + supportHigherEdgeExtend,supportPrice - supportExtendBelowCandle,BOS_zone_color); + //zoneContainer.printZonesSortedArray(); + } + + + return true ; + + } + return false ; + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void deleteZoneWithGUI(string _id, ZoneContainer& zoneContainer) + { + + + zoneContainer.deleteZone(_id); + + if(!ObjectDelete(_Symbol,_id)) + { + Print("Failed to delete object error: " + GetLastError()); + } + + + Print("Deleted the zone with gui!"); + + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void deleteZoneGuiOnly(string _id,ZoneContainer& zoneContainer) + { + + + if(!ObjectDelete(_Symbol,_id)) + { + Print("Failed to delete object error: " + GetLastError()); + } + + Print("Deleted the zone gui!"); + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool updateBreakAboveStructureAndDelete(ZoneContainer& zoneContainer, ENUM_TIMEFRAMES timeFrame, string timeFrameStr, double& brokenResistanceLowerEdge, string& type) + { + bool finishedDeleting = false ; + + if(zoneContainer.getNumberOfActiveZones() != 0) // if there are zones found + { + if(marketObserverTiger.candleClosedAboveResistanceByIndex(0,timeFrame,zoneContainer)) // check if candle closed above the zone + { + + + + datetime _leftEdgeRestestZone = iTime(_Symbol,timeFrame,4); + datetime _rightEdgeRetestZone = D'2023.11.01 00:00:00'; + + + while(!finishedDeleting && zoneContainer.getNumberOfActiveZones() != 0) // this while is used in the case of a candle closing above more than 1 zone at once + { + /* temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(0).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(0).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame("PERIOD_M30"); + temporaryRestestSupportZone.setType("TYPE_SUPPORT"); + deleteZoneWithGUI((zoneContainer.getZoneByIndex(0).getId())); // delete the zone with the GUI */ + + if(zoneContainer.getNumberOfActiveZones() != 0 && marketObserverTiger.candleClosedAboveResistanceByIndex(0,timeFrame,zoneContainer)) + { + zoneContainer.getZoneByIndex(0).getHigherEdge(); + temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(0).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(0).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame(timeFrameStr); + + type = zoneContainer.getZoneByIndex(0).getType(); + temporaryRestestSupportZone.setType("TYPE_SUPPORT_TEMPORARY"); + + brokenResistanceLowerEdge = zoneContainer.getZoneByIndex(0).getLowerEdge(); // save the lower edge of the broken zone, in order to return it in the parameter + + deleteZoneWithGUI((zoneContainer.getZoneByIndex(0).getId()),zoneContainer); // delete the zone with the GUI + } + else + { + finishedDeleting = true ; + } + + + } + + /*if(zoneContainer.getNumberOfActiveZones() != 0 && zoneContainer.getZoneByIndex(0).getType() == "TYPE_RESISTANCE_NORMAL"){ + + Zone* tempZone = zoneContainer.getZoneByIndex(0); + string zoneIdStr = tempZone.getId(); + int zoneIdInteger = StringToInteger(zoneIdStr); + + objectsManager.drawRectangleInStrategyTester(zoneIdInteger,tempZone.getLeftEdge(),tempZone.getRightEdge(),tempZone.getHigherEdge(),tempZone.getLowerEdge(),clrRed); + Print("Retrieved the zone succesfully!"); + + + } */ + return true ; + + } + + + } + return false ; + + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool updateBreakBelowStructureAndDelete(ZoneContainer& zoneContainer, ENUM_TIMEFRAMES timeFrame, string timeFrameStr, double& brokenSupportHigherEdge, string& type) + { + bool finishedDeleting = false ; + + if(zoneContainer.getNumberOfActiveZones() != 0) // if there are zones found + { + + if(marketObserverTiger.candleClosedBelowSupportByIndex(zoneContainer.getNumberOfActiveZones() -1,timeFrame,zoneContainer)) // check if candle closed below the zone + { + + + datetime _leftEdgeRestestZone = iTime(_Symbol,timeFrame,4); + datetime _rightEdgeRetestZone = D'2023.11.01 00:00:00'; + + + while(!finishedDeleting && zoneContainer.getNumberOfActiveZones() != 0) // this while is used in the case of a candle closing above more than 1 zone at once + { + /* temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(0).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(0).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame("PERIOD_M30"); + temporaryRestestSupportZone.setType("TYPE_SUPPORT"); + deleteZoneWithGUI((zoneContainer.getZoneByIndex(0).getId())); // delete the zone with the GUI */ + + if(zoneContainer.getNumberOfActiveZones() != 0 && marketObserverTiger.candleClosedBelowSupportByIndex(zoneContainer.getNumberOfActiveZones()-1,timeFrame,zoneContainer)) + { + zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge(); + temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("9999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame(timeFrameStr); + + type = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getType(); + temporaryRestestSupportZone.setType("TYPE_RESISTANCE_TEMPORARY"); + + brokenSupportHigherEdge = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge(); + + deleteZoneWithGUI((zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getId()),zoneContainer); // delete the zone with the GUI + } + else + { + finishedDeleting = true ; + } + + + } + + /*if(zoneContainer.getNumberOfActiveZones() != 0 && zoneContainer.getZoneByIndex(0).getType() == "TYPE_RESISTANCE_NORMAL"){ + + Zone* tempZone = zoneContainer.getZoneByIndex(0); + string zoneIdStr = tempZone.getId(); + int zoneIdInteger = StringToInteger(zoneIdStr); + + objectsManager.drawRectangleInStrategyTester(zoneIdInteger,tempZone.getLeftEdge(),tempZone.getRightEdge(),tempZone.getHigherEdge(),tempZone.getLowerEdge(),clrRed); + Print("Retrieved the zone succesfully!"); + + + } */ + + + return true ; + + + } + + + } + + return false ; + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double findClosestResistancePrice(ZoneContainer& zoneContainer) + { + + double closestResistancePrice = -1; + if(zoneContainer.getNumberOfActiveZones() != 0) + { + + closestResistancePrice = zoneContainer.getZoneByIndex(0).getLowerEdge(); + } + + return closestResistancePrice ; + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double findClosestSupportPrice(ZoneContainer& zoneContainer) + { + + double closestSupportPrice = -1 ; + if(zoneContainer.getNumberOfActiveZones() != 0) + { + + closestSupportPrice = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getLowerEdge(); + } + + return closestSupportPrice ; + + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool buyStopLossUnderZone(double resistanceZoneLowerEdge, double stopLossValue) + { + + if(stopLossValue < resistanceZoneLowerEdge) + { + return true ; + } + else + { + Comment("stop loss is not under the zone im not taking a buy"); + return false ; + + } + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool sellStopLossAboveZone(double supportZoneHigherEdge, double stopLossValue) + { + + if(stopLossValue > supportZoneHigherEdge) + { + return true ; + } + else + { + Comment("stop loss is not above the zone, so im not taking a sell"); + return false ; + } + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void manageRiskIfNeeded() + { + + if(PositionsTotal()!= 0) // There is an active trade + { + manageRiskOnBuysIfNeeded(); + manageRiskOnSellsIfNeeded(); + + } + + + } + + +void manageRiskOnBuysIfNeeded(){ + if(candleClosedBearish(PERIOD_M15,1) && !bearishCandleIsWeak(PERIOD_M15,1, WICK_RATIO_REJECTION)) + { + + for(int i = 0 ; i < NUM_MAX_ALLOWED_TRADES ; i++) + { + if((BuyActiveTradesArray[i] != NULL) && !(BuyActiveTradesArray[i].riskAlreadyManaged())) // if the trade still hasnt managead risk , then do it now. + { + closePartialFromSpecificPosition(BuyActiveTradesArray[i].getTradeId(),riskManagementPartial); + BuyActiveTradesArray[i].manageRisk(); + } + } + + } + +} + + +void manageRiskOnSellsIfNeeded(){ + + if(candleClosedBullish(PERIOD_M15,1) && !bullishCandleIsWeak(PERIOD_M15,1, WICK_RATIO_REJECTION)) + { + for(int i = 0 ; i < NUM_MAX_ALLOWED_TRADES ; i++) + { + if((SellActiveTradesArray[i] != NULL) && !(SellActiveTradesArray[i].riskAlreadyManaged())) // if the trade still hasnt managead risk , then do it now. + { + closePartialFromSpecificPosition(SellActiveTradesArray[i].getTradeId(),riskManagementPartial); + SellActiveTradesArray[i].manageRisk(); + } + } + + } +} + + + + +void secureProfitIfNeeded(){ + + if(PositionsTotal() != 0){ // if there are active trades + + secureProfitOnBuysIfNeeded(); + secureProfitOnSellsIfNeeded(); + + } + +} + + + +void secureProfitOnBuysIfNeeded(){ + + for(int i=0 ; i< NUM_MAX_ALLOWED_TRADES ; i++){ + + if((BuyActiveTradesArray[i] != NULL) && !(BuyActiveTradesArray[i].firstPartialIsSecured())){ // if first partial is not yet secured for the current position + + double currentProfit = positionProfitInPips(BuyActiveTradesArray[i].getTradeId()); + if(currentProfit >= firstPartialProfitInPips){ + closePartialFromSpecificPosition(BuyActiveTradesArray[i].getTradeId(),firstPartialCloseFactor) ; + BuyActiveTradesArray[i].secureFirstPartial(); + } + + } + } +} + + + void secureProfitOnSellsIfNeeded(){ + + for(int i=0 ; i< NUM_MAX_ALLOWED_TRADES ; i++){ + + if((SellActiveTradesArray[i] != NULL) && !(SellActiveTradesArray[i].firstPartialIsSecured())){ // if first partial is not yet secured for the current position + + double currentProfit = positionProfitInPips(SellActiveTradesArray[i].getTradeId()); + if(currentProfit >= firstPartialProfitInPips){ + closePartialFromSpecificPosition(SellActiveTradesArray[i].getTradeId(),firstPartialCloseFactor) ; + SellActiveTradesArray[i].secureFirstPartial(); + } + } + } + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int findAvailableSpotInBuyManagerArr() // returns the index , or -1 if all are full + { + + for(int i=0 ; i < NUM_MAX_ALLOWED_TRADES ; i++) + { + if(BuyActiveTradesArray[i] == NULL) + { + return i; + + } + + } + return -1 ; + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int findAvailableSpotInSellManagerArr() // returns the index , or -1 if all are full + { + + for(int i=0 ; i positionStopLoss(BuyActiveTradesArray[i].getTradeId())){ // if new stop loss is higher than the current position's stop loss + positionTrailStopLoss(BuyActiveTradesArray[i].getTradeId(),newStopLoss,0); + } + } + + + + if((SellActiveTradesArray[i] != NULL)){ // CHECK TRAIL FOR SELLS + double newStopLoss = iHigh(_Symbol,_timeFrame,1); + newStopLoss = newStopLoss + stopLossAboveWickBy ; + if(newStopLoss < positionStopLoss(SellActiveTradesArray[i].getTradeId())){ // if new stop loss is lower than the current position's stop loss + positionTrailStopLoss(SellActiveTradesArray[i].getTradeId(),newStopLoss,0); + } + } + + + + + } +} diff --git a/TigerNewFeature.ex5 b/TigerNewFeature.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..7618eab4c56b5f8b34cabedef50a7ba1677823c3 GIT binary patch literal 72656 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 w%Oe#S|P|JT-#%nkf9%>e40@#fI15Xdt= cleanRangeUponEntry) { + + double stopLossBased_H1 = iLow(_Symbol,PERIOD_H1,1); + double stopLossBased_M30 = iLow(_Symbol,PERIOD_M30,1); + double stopLossBased_M15 = iLow(_Symbol,PERIOD_M15,1); + + stopLossBased_H1 = stopLossBased_H1 - stopLossUnderWickBy ; + stopLossBased_M30 = stopLossBased_M30 - stopLossUnderWickBy ; + stopLossBased_M15 = stopLossBased_M15 - stopLossUnderWickBy ; + + if(stopLossIsValidBuys(stopLossBased_M30, maxPipsRiskAmount)) { + + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_M30); + int indexToNewTrade ; + if((indexToNewTrade = findAvailableSpotInBuyManagerArr()) != -1) { // find a spot in the trades array, and save the result + Print("The free index found is: " + indexToNewTrade); + activeTradeId = buyEntryManager.takeBuyTradeTiger(lotsToEnter,stopLossBased_M30) ; + + BuyTradeManagerTiger* tempTigerManager= new BuyTradeManagerTiger(activeTradeId); // create an object of type buyTradeManagerTiger + BuyActiveTradesArray[indexToNewTrade] = tempTigerManager ;// put the new object in the array + buysCount++; + + Comment("Took a buy. stop loss: based on M30, " + "Active trade id: " + activeTradeId); + } else { + + Comment("I cant take a trade because the trades array is full"); + } + + + } else if(stopLossIsValidBuys(stopLossBased_M15,maxPipsRiskAmount) && candleClosedBullish(PERIOD_M15,1)) { + + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_M15); + int indexToNewTrade ; + if((indexToNewTrade = findAvailableSpotInBuyManagerArr()) != -1) { // find a spot in the trades array, and save the result + Print("The free index found is: " + indexToNewTrade); + activeTradeId = buyEntryManager.takeBuyTradeTiger(lotsToEnter,stopLossBased_M15) ; + + BuyTradeManagerTiger* tempTigerManager= new BuyTradeManagerTiger(activeTradeId); // create an object of type buyTradeManagerTiger + BuyActiveTradesArray[indexToNewTrade] = tempTigerManager ;// put the new object in the array + buysCount++; + Comment("Took a buy. stop loss: based on M15, " + "Active trade id: " + activeTradeId); + } else { + + Comment("I cant take a trade because the trades array is full"); + + } + + } + + else { + + + Comment("Failed to find a valid stop loss on both M30 and M15 !"); + } + + } + + else { + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + + Comment(timeInStr + ": Price Broke the resitance zone, but not enough clean range to take a trade"); + + } + + } else { + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + Comment(timeInStr+ ": Price broke the resistance zone but i dont see the next target zone, Or the zone price broke was not a breakout zone "); + + } + + } + + + if(updateBreakBelowStructureAndDelete(zoneContainerSupport_M30,PERIOD_M30,"PERIOD_M30",brokenSupportHigherPrice,brokenZoneTypeSupport) + && sellBreakerCandleIsValid(PERIOD_M30, SIZE_OF_BREAKER_CANDLE_BODY) + && ((sessionIsNy() && TRADE_NEW_YORK_ALLOWED) || (sessionIsLondon() && TRADE_LONDON_ALLOWED)) && SELLS_ALLOWED) { // means M30 candle broke structure, and the breaker candle is valid (big enough),and time is in the sessions (ny or london or both, based on what the user chose)) + + + double firstSupportPrice = findClosestSupportPrice(zoneContainerSupport_M30); + double cleanRangeValueSells = SymbolInfoDouble(_Symbol, SYMBOL_BID) - firstSupportPrice; + + Print("firstSupport variable is: " + firstSupportPrice); + Print("cleanRangeValueSells :" + cleanRangeValueSells); + + + if(firstSupportPrice != -1 && brokenZoneTypeSupport == "TYPE_SUPPORT_BREAKOUT") { + Comment("M30 candle Broke and closed below the zone. the closest support price is:" + DoubleToString(firstSupportPrice)); + if(cleanRangeValueSells >= cleanRangeUponEntry) { + + double stopLossBased_H1 = iHigh(_Symbol,PERIOD_H1,1); + double stopLossBased_M30 = iHigh(_Symbol,PERIOD_M30,1); + double stopLossBased_M15 = iHigh(_Symbol,PERIOD_M15,1); + + stopLossBased_H1 = stopLossBased_H1 + stopLossAboveWickBy ; + stopLossBased_M30 = stopLossBased_M30 + stopLossAboveWickBy ; + stopLossBased_M15 = stopLossBased_M15 + stopLossAboveWickBy ; + + if(stopLossIsValidSells(stopLossBased_M30, maxPipsRiskAmount)) { + + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_M30); + int indexToNewTrade ; + + if((indexToNewTrade = findAvailableSpotInSellManagerArr()) != -1) { + + Print("The free index found is: " + indexToNewTrade); + activeTradeId = sellEntryManager.takeSellTradeTiger(lotsToEnter,stopLossBased_M30) ; + + SellTradeManagerTiger* tempTigerManager= new SellTradeManagerTiger(activeTradeId); // create an object of type buyTradeManagerTiger + SellActiveTradesArray[indexToNewTrade] = tempTigerManager ;// put the new object in the array + sellsCount++; + Comment("Took a sell. stop loss: based on M30, " + "Active trade id: " + activeTradeId); + + } else { + + Comment("i cant take a trade because the arrray is full"); + } + + + } else if(stopLossIsValidSells(stopLossBased_M15,maxPipsRiskAmount) && candleClosedBearish(PERIOD_M15,1)) { + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_M15); + int indexToNewTrade ; + if((indexToNewTrade = findAvailableSpotInSellManagerArr()) != -1) { + Print("The free index found is: " + indexToNewTrade); + activeTradeId = sellEntryManager.takeSellTradeTiger(lotsToEnter,stopLossBased_M15) ; + + SellTradeManagerTiger* tempTigerManager= new SellTradeManagerTiger(activeTradeId); // create an object of type buyTradeManagerTiger + SellActiveTradesArray[indexToNewTrade] = tempTigerManager ;// put the new object in the array + sellsCount++; + Comment("Took a sell. stop loss: based on M15, "+ "Active trade id: " + activeTradeId); + } else { + Comment("i cant take a trade since another one is running"); + } + } + + else { + + + Comment("Failed to find a valid stop loss on both M30 and M15 !"); + } + + } + + else { + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + + + Comment(timeInStr + ": Price Broke the support zone, but not enough clean range to take a trade"); + + } + + } else { + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + Comment(timeInStr+ ": Price broke the support zone but i dont see the next target zone, Or the zone price broke was not a breakout zone "); + + } + + + + } + + + datetime currTime = TimeCurrent(); + ObjectSetString(0,"clockTextTiger",OBJPROP_TEXT,TimeToString(currTime,TIME_MINUTES)); + + + zoneContainer_M30.printZonesSortedArray(); + zoneContainerSupport_M30.printZonesSortedArray(); + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + if(newCandleDetectorDaily.isNewCandle()) { + + //detectAndDrawResistanceOnTimeFrame(PERIOD_D1,"PERIOD_D1",clrYellow,clrYellow,zoneContainer_D1); + //updateBreakAboveStructureAndDelete(zoneContainer_D1,PERIOD_D1,"PERIOD_D1"); + objectsManager.drawVerticalLine(clrAqua, TimeCurrent()); + + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + if(newCandleDetectorWeekly.isNewCandle()) { + + objectsManager.drawVerticalLine(clrRed, TimeCurrent()); + } + +} + +//+------------------------------------------------------------------+ +//| Timer function | +//+------------------------------------------------------------------+ +void OnTimer() { +//--- + +} +//+------------------------------------------------------------------+ +//| Trade function | +//+------------------------------------------------------------------+ +void OnTrade() { +//--- + +} +//+------------------------------------------------------------------+ +//| TradeTransaction function | +//+------------------------------------------------------------------+ +void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) { +//--- + +} +//+------------------------------------------------------------------+ +//| Tester function | +//+------------------------------------------------------------------+ +double OnTester() { +//--- + double ret=0.0; +//--- + +//--- + return(ret); +} +//+------------------------------------------------------------------+ +//| TesterInit function | +//+------------------------------------------------------------------+ +void OnTesterInit() { +//--- + +} +//+------------------------------------------------------------------+ +//| TesterPass function | +//+------------------------------------------------------------------+ +void OnTesterPass() { +//--- + +} +//+------------------------------------------------------------------+ +//| TesterDeinit function | +//+------------------------------------------------------------------+ +void OnTesterDeinit() { +//--- + +} +//+------------------------------------------------------------------+ +//| ChartEvent function | +//+------------------------------------------------------------------+ +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) { +//--- + +} +//+------------------------------------------------------------------+ +//| BookEvent function | +//+------------------------------------------------------------------+ +void OnBookEvent(const string &symbol) { +//--- + +} +//+------------------------------------------------------------------+ + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool detectAndDrawResistanceOnTimeFrame(ENUM_TIMEFRAMES timeFrame, string timeFrameStr, long BOS_zone_color, long usual_zone_color,ZoneContainer& zoneContainer) { + + + if(resistancePatternFormed(timeFrame)) { // if resistance formed + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getZonesIdCounter(); + + + datetime _leftEdge = iTime(_Symbol,timeFrame,2); + datetime _rightEdge = D'2023.11.01 00:00:00'; + double resistancePrice = iOpen(_Symbol,timeFrame,1); + + + + + + if((zoneContainer.getNumberOfActiveZones() != 0) && (zoneContainer.getZoneByIndex(0).getLowerEdge() - resistancePrice >= rangeDistanceBetweenZones)) { // check if it has a clean range above + + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice - resistanceLowerEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_RESISTANCE_BREAKOUT"); + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + Print("current id counter of, zoneContainer is: " + currentIdCounter); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice - resistanceLowerEdgeExtend,BOS_zone_color); + //Print("Number of active zones is: " + zoneContainer.getNumberOfActiveZones()); + //zoneContainer.printZonesSortedArray(); + } + + else if((zoneContainer.getNumberOfActiveZones() != 0) && (zoneContainer.getZoneByIndex(0).getLowerEdge() - resistancePrice < rangeDistanceBetweenZones)) { // if it doesnt have a clean range, just add it as a blue zone + double currentHighEdge = resistancePrice + resistanceExtendAboveCandle ; // this is a high edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + double currentLowEdge = resistancePrice - resistanceLowerEdgeExtend; // this is a low edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice - resistanceLowerEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_RESISTANCE_NORMAL"); + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + + + //objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice,usual_zone_color); + + /*if(zoneContainer.getZoneByIndex(1).getType() == "TYPE_RESISTANCE_NORMAL"){ + string idOfZoneToHide = zoneContainer.getZoneByIndex(1).getId(); + deleteZoneGuiOnly(idOfZoneToHide,zoneContainer); + } */ + + + + } + + else if(zoneContainer.getNumberOfActiveZones() == 0) { // this means this is the first zone to add to the data strucutre + int result = detectAndDrawFirstResistanceZoneHigherThan(resistancePrice + resistanceExtendAboveCandle, timeFrame,firstZoneShift, zoneContainer, timeFrameStr,BOS_zone_color); + if(result == 1) { + + Print("reached here !"); + int currentIdCounter = zoneContainer.getZonesIdCounter(); + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice - resistanceLowerEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_RESISTANCE_BREAKOUT"); + + + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice - resistanceLowerEdgeExtend,BOS_zone_color); + + + + } + else if(result == 0){ + int currentIdCounter = zoneContainer.getZonesIdCounter(); + double currentHighEdge = resistancePrice + resistanceExtendAboveCandle ; // this is a high edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + double currentLowEdge = resistancePrice - resistanceLowerEdgeExtend; // this is a low edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice - resistanceLowerEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_RESISTANCE_NORMAL"); + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + } + else if(result == 2){ + int currentIdCounter = zoneContainer.getZonesIdCounter(); + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice - resistanceLowerEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_RESISTANCE_BREAKOUT"); + + + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice - resistanceLowerEdgeExtend,BOS_zone_color); + + } + + } + + + + + if(allResistancesAreNormalType(zoneContainer)){ // if all resistances are type normal , then find the first resistance higher than the current highest resistance + + double highestResistanceZonePrice = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge() ; + int res = detectAndDrawFirstResistanceZoneHigherThan(highestResistanceZonePrice , timeFrame,firstZoneShift, zoneContainer, timeFrameStr,BOS_zone_color); + + + + if(res == 1){ + if((zoneContainer.getNumberOfActiveZones()-2) >= 0){ + + zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-2).setType("TYPE_RESISTANCE_BREAKOUT"); // we choose the second cell from the end, because in the last index now sits the new higher zone created by the previous function call. + } + + + } + else if(res == 0){ + + if((zoneContainer.getNumberOfActiveZones()-2) >= 0){ + deleteZoneGuiOnly(zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-2).getId(),zoneContainer); + } + + } + + } + + return true ; + + } + return false ; +} + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool detectAndDrawSupportOnTimeFrame(ENUM_TIMEFRAMES timeFrame, string timeFrameStr, long BOS_zone_color, long usual_zone_color,ZoneContainer& zoneContainer) { + + + if(supportPatternFormed(timeFrame)) { // if support formed + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getSupportZonesIdCounter(); + + + datetime _leftEdge = iTime(_Symbol,timeFrame,2); + datetime _rightEdge = D'2023.11.01 00:00:00'; + double supportPrice = iOpen(_Symbol,timeFrame,1); + + + + + + if((zoneContainer.getNumberOfActiveZones() != 0) && (supportPrice - zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge() >= rangeDistanceBetweenZones)) { // check if it has a clean range down + + Zone* newZone = new Zone() ; + newZone.setLowerEdgePrice(supportPrice - supportExtendBelowCandle); + newZone.setHigherEdgePrice(supportPrice + supportHigherEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_SUPPORT_BREAKOUT"); + + + + + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + Print("current id counter of, zoneContainer_support is: " + currentIdCounter); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice + supportHigherEdgeExtend,supportPrice- supportExtendBelowCandle,BOS_zone_color); + //Print("Number of active zones is: " + zoneContainer.getNumberOfActiveZones()); + //zoneContainer.printZonesSortedArray(); + } + + else if((zoneContainer.getNumberOfActiveZones() != 0) && (supportPrice - zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge() < rangeDistanceBetweenZones)) { // if it doesnt have a clean range, just add it as a blue zone + double currentHighEdge = supportPrice + supportHigherEdgeExtend ; // this is a high edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + double currentLowEdge = supportPrice - supportExtendBelowCandle; // this is a low edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(supportPrice + supportHigherEdgeExtend); + newZone.setLowerEdgePrice(supportPrice - supportExtendBelowCandle); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_SUPPORT_NORMAL"); + + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + //objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice,supportPrice - supportExtendBelowCandle,usual_zone_color); + + } + + else if(zoneContainer.getNumberOfActiveZones() == 0) { // this means this is the first zone to add to the data strucutre + + // Add the old lower support zone before adding the new support zone. + //detectAndDrawFirstSupportZoneLowerThan(supportPrice - supportExtendBelowCandle, timeFrame, firstZoneShift,timeFrameStr, BOS_zone_color); + int result = detectAndDrawFirstSupportZoneLowerThan(supportPrice - supportExtendBelowCandle, timeFrame,firstZoneShift, zoneContainer, timeFrameStr,BOS_zone_color); + if(result == 1) { + int currentIdCounter = zoneContainer.getSupportZonesIdCounter(); + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(supportPrice + supportHigherEdgeExtend); + newZone.setLowerEdgePrice(supportPrice - supportExtendBelowCandle); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_SUPPORT_BREAKOUT"); + + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice + supportHigherEdgeExtend,supportPrice - supportExtendBelowCandle,BOS_zone_color); + + } + else if(result == 0){ + double currentHighEdge = supportPrice + supportHigherEdgeExtend ; // this is a high edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + double currentLowEdge = supportPrice - supportExtendBelowCandle; // this is a low edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + int currentIdCounter = zoneContainer.getSupportZonesIdCounter(); + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(supportPrice + supportHigherEdgeExtend); + newZone.setLowerEdgePrice(supportPrice - supportExtendBelowCandle); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_SUPPORT_NORMAL"); + + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + } + else if(result == 2){ + int currentIdCounter = zoneContainer.getSupportZonesIdCounter(); + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(supportPrice + supportHigherEdgeExtend); + newZone.setLowerEdgePrice(supportPrice - supportExtendBelowCandle); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_SUPPORT_BREAKOUT"); + + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice + supportHigherEdgeExtend,supportPrice - supportExtendBelowCandle,BOS_zone_color); + } + + + + } + + + + if(allSupportsAreNormalType(zoneContainer)){ // if all supports are type normal , then find the first support lower than the current lowest. + + + double lowestSupportPrice = zoneContainer.getZoneByIndex(0).getLowerEdge() ; + int res = detectAndDrawFirstSupportZoneLowerThan(lowestSupportPrice , timeFrame,firstZoneShift, zoneContainer, timeFrameStr,BOS_zone_color) == 1 ; + + if(res == 1){ // if we found lower support than the current lower, and the range is valid, then keep both + + zoneContainer.getZoneByIndex(1).setType("TYPE_SUPPORT_BREAKOUT"); // we choose index 1, because in index 0 now sits the new lower zone created by the previous function call. + } + else if (res == 0){ // if we found a lower support than the current lowest but the range is not valid, then keep only the lower one + + if(zoneContainer.getNumberOfActiveZones() > 1){ + zoneContainer.getZoneByIndex(1).setType("TYPE_SUPPORT_NORMAL"); + deleteZoneGuiOnly(zoneContainer.getZoneByIndex(1).getId(),zoneContainer); + } + + } + + } + + + return true ; + + } + return false ; +} + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int detectAndDrawFirstResistanceZoneHigherThan(double currentHigherResistancePrice, ENUM_TIMEFRAMES timeFrame,int _firstZoneShift,ZoneContainer& zoneContainer,string timeFrameStr, long BOS_zone_color) { + + for(int i=3 ; i< _firstZoneShift; i++) { + if(resistancePatternFormed(timeFrame,i)) { // if old resistance found + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getZonesIdCounter(); + + + datetime _leftEdge = iTime(_Symbol,timeFrame,i+2); + datetime _rightEdge = D'2023.11.01 00:00:00'; + double resistancePrice = iOpen(_Symbol,timeFrame,i+1); + + if((resistancePrice > currentHigherResistancePrice) && ((resistancePrice - currentHigherResistancePrice) > rangeDistanceBetweenZones)) { // this means the range is valid + Print("tthe range is valid between the newly formed RESISTANCE zone, and the first higher old zone"); + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice - resistanceLowerEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_RESISTANCE_NORMAL"); + + zoneContainer.addHistoryResistanceZoneOnTop(newZone); + zoneContainer.incrementZonesIdCounter(); + + Print("the zone counter is: "+ currentIdCounter); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,newZone.getHigherEdge(),newZone.getLowerEdge(),BOS_zone_color); + + return 1 ; // range is valid so return 1 + } else if((resistancePrice > currentHigherResistancePrice) && !((resistancePrice - currentHigherResistancePrice) > rangeDistanceBetweenZones)) { // the range is not valid, this means draw only the old one + Print("the range is not valid between the newly formed RESISTANCE zone, and the first higher old zone"); + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice - resistanceLowerEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_RESISTANCE_NORMAL"); + + + zoneContainer.addHistoryResistanceZoneOnTop(newZone); + zoneContainer.incrementZonesIdCounter(); + + Print("the zone counter is: "+ currentIdCounter); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,newZone.getHigherEdge(),newZone.getLowerEdge(),BOS_zone_color); + + + return 0 ; // range is not valid , so return 0 + + } + } + } + return 2; // this is the case that we didnt find a zone above the current highest zone, which means the current highest zone now, will be breakout zone + +} + +int detectAndDrawFirstSupportZoneLowerThan(double currentLowerSupportPrice, ENUM_TIMEFRAMES timeFrame,int _firstZoneShift,ZoneContainer& zoneContainer,string timeFrameStr, long BOS_zone_color) { + + int result = 2 ; + for(int i=3 ; i< _firstZoneShift; i++) { + if(supportPatternFormed(timeFrame,i)) { // if old support found + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getSupportZonesIdCounter(); + + + datetime _leftEdge = iTime(_Symbol,timeFrame,i+2); + datetime _rightEdge = D'2023.11.01 00:00:00'; + double supportPrice = iOpen(_Symbol,timeFrame,i+1); + Print("supportPrice is:" + supportPrice); + + if((supportPrice < currentLowerSupportPrice) && ((currentLowerSupportPrice - supportPrice) > rangeDistanceBetweenZones)) { // this means the range is valid + Print("tthe range is valid between the newly formed SUPPORT zone, and the first higher old zone"); + + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(supportPrice + supportHigherEdgeExtend); + newZone.setLowerEdgePrice(supportPrice - supportExtendBelowCandle); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_SUPPORT_NORMAL"); + + zoneContainer.addHistorySupportZoneAtBottom(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + Print("Higher edge of created zone is: "+ newZone.getHigherEdge()); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,newZone.getHigherEdge(),newZone.getLowerEdge(),BOS_zone_color); + + return 1 ; + } else if((supportPrice < currentLowerSupportPrice) && !((currentLowerSupportPrice - supportPrice) > rangeDistanceBetweenZones)) { // the range is not valid, this means draw only the old one + Print("the range is not valid between the newly formed SUPPORT zone, and the first higher old zone"); + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(supportPrice + supportHigherEdgeExtend); + newZone.setLowerEdgePrice(supportPrice - supportExtendBelowCandle); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_SUPPORT_NORMAL"); + + zoneContainer.addHistorySupportZoneAtBottom(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + Print("Higher edge of created zone is: "+ newZone.getHigherEdge()); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,newZone.getHigherEdge(),newZone.getLowerEdge(),BOS_zone_color); + return 0 ; + + } + } + } + return 2 ; // this is the case that we didnt find a zone below the current lowest zone, which means the lowest zone now, will be breakout zone + +} + + +bool allSupportsAreNormalType(ZoneContainer& zoneContainer){ + for(int i=0 ; i< zoneContainer.getNumberOfActiveZones() ; i++){ + if(zoneContainer.getZoneByIndex(i).getType() == "TYPE_SUPPORT_BREAKOUT"){ + return false ; + } + + + } + return true ; +} + + +bool allResistancesAreNormalType(ZoneContainer& zoneContainer){ + + for(int i=0 ; i< zoneContainer.getNumberOfActiveZones() ; i++){ + if(zoneContainer.getZoneByIndex(i).getType() == "TYPE_RESISTANCE_BREAKOUT"){ + return false ; + } + + + } + return true ; + +} + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void deleteZoneWithGUI(string _id, ZoneContainer& zoneContainer) { + + + zoneContainer.deleteZone(_id); + + if(!ObjectDelete(_Symbol,_id)) { + Print("Failed to delete object error: " + GetLastError()); + } + + + Print("Deleted the zone with gui!"); + +} + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void deleteZoneGuiOnly(string _id,ZoneContainer& zoneContainer) { + + + if(!ObjectDelete(_Symbol,_id)) { + Print("Failed to delete object error: " + GetLastError()); + } + + Print("Deleted the zone gui!"); + +} + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool updateBreakAboveStructureAndDelete(ZoneContainer& zoneContainer, ENUM_TIMEFRAMES timeFrame, string timeFrameStr, double& brokenResistanceLowerEdge, string& type) { + bool finishedDeleting = false ; + + if(zoneContainer.getNumberOfActiveZones() != 0) { // if there are zones found + if(marketObserverTiger.candleClosedAboveResistanceByIndex(0,timeFrame,zoneContainer)) { // check if candle closed above the zone + + + + datetime _leftEdgeRestestZone = iTime(_Symbol,timeFrame,4); + datetime _rightEdgeRetestZone = D'2023.11.01 00:00:00'; + + + while(!finishedDeleting && zoneContainer.getNumberOfActiveZones() != 0) { // this while is used in the case of a candle closing above more than 1 zone at once + /* temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(0).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(0).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame("PERIOD_M30"); + temporaryRestestSupportZone.setType("TYPE_SUPPORT"); + deleteZoneWithGUI((zoneContainer.getZoneByIndex(0).getId())); // delete the zone with the GUI */ + + if(zoneContainer.getNumberOfActiveZones() != 0 && marketObserverTiger.candleClosedAboveResistanceByIndex(0,timeFrame,zoneContainer)) { + zoneContainer.getZoneByIndex(0).getHigherEdge(); + temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(0).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(0).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame(timeFrameStr); + + type = zoneContainer.getZoneByIndex(0).getType(); + temporaryRestestSupportZone.setType("TYPE_SUPPORT_TEMPORARY"); + + brokenResistanceLowerEdge = zoneContainer.getZoneByIndex(0).getLowerEdge(); // save the lower edge of the broken zone, in order to return it in the parameter + + deleteZoneWithGUI((zoneContainer.getZoneByIndex(0).getId()),zoneContainer); // delete the zone with the GUI + } else { + finishedDeleting = true ; + } + + + } + + /*if(zoneContainer.getNumberOfActiveZones() != 0 && zoneContainer.getZoneByIndex(0).getType() == "TYPE_RESISTANCE_NORMAL"){ + + Zone* tempZone = zoneContainer.getZoneByIndex(0); + string zoneIdStr = tempZone.getId(); + int zoneIdInteger = StringToInteger(zoneIdStr); + + objectsManager.drawRectangleInStrategyTester(zoneIdInteger,tempZone.getLeftEdge(),tempZone.getRightEdge(),tempZone.getHigherEdge(),tempZone.getLowerEdge(),clrRed); + Print("Retrieved the zone succesfully!"); + + + } */ + return true ; + + } + + + } + return false ; + +} + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool updateBreakBelowStructureAndDelete(ZoneContainer& zoneContainer, ENUM_TIMEFRAMES timeFrame, string timeFrameStr, double& brokenSupportHigherEdge, string& type) { + bool finishedDeleting = false ; + + if(zoneContainer.getNumberOfActiveZones() != 0) { // if there are zones found + + if(marketObserverTiger.candleClosedBelowSupportByIndex(zoneContainer.getNumberOfActiveZones() -1,timeFrame,zoneContainer)) { // check if candle closed below the zone + + + datetime _leftEdgeRestestZone = iTime(_Symbol,timeFrame,4); + datetime _rightEdgeRetestZone = D'2023.11.01 00:00:00'; + + + while(!finishedDeleting && zoneContainer.getNumberOfActiveZones() != 0) { // this while is used in the case of a candle closing above more than 1 zone at once + /* temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(0).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(0).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame("PERIOD_M30"); + temporaryRestestSupportZone.setType("TYPE_SUPPORT"); + deleteZoneWithGUI((zoneContainer.getZoneByIndex(0).getId())); // delete the zone with the GUI */ + + if(zoneContainer.getNumberOfActiveZones() != 0 && marketObserverTiger.candleClosedBelowSupportByIndex(zoneContainer.getNumberOfActiveZones()-1,timeFrame,zoneContainer)) { + zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge(); + temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("9999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame(timeFrameStr); + + type = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getType(); + temporaryRestestSupportZone.setType("TYPE_RESISTANCE_TEMPORARY"); + + brokenSupportHigherEdge = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge(); + + deleteZoneWithGUI((zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getId()),zoneContainer); // delete the zone with the GUI + } else { + finishedDeleting = true ; + } + + + } + + /*if(zoneContainer.getNumberOfActiveZones() != 0 && zoneContainer.getZoneByIndex(0).getType() == "TYPE_RESISTANCE_NORMAL"){ + + Zone* tempZone = zoneContainer.getZoneByIndex(0); + string zoneIdStr = tempZone.getId(); + int zoneIdInteger = StringToInteger(zoneIdStr); + + objectsManager.drawRectangleInStrategyTester(zoneIdInteger,tempZone.getLeftEdge(),tempZone.getRightEdge(),tempZone.getHigherEdge(),tempZone.getLowerEdge(),clrRed); + Print("Retrieved the zone succesfully!"); + + + } */ + + + return true ; + + + } + + + } + + return false ; + +} + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double findClosestResistancePrice(ZoneContainer& zoneContainer) { + + double closestResistancePrice = -1; + if(zoneContainer.getNumberOfActiveZones() != 0) { + + closestResistancePrice = zoneContainer.getZoneByIndex(0).getLowerEdge(); + } + + return closestResistancePrice ; + +} + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double findClosestSupportPrice(ZoneContainer& zoneContainer) { + + double closestSupportPrice = -1 ; + if(zoneContainer.getNumberOfActiveZones() != 0) { + + closestSupportPrice = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getLowerEdge(); + } + + return closestSupportPrice ; + +} + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool buyStopLossUnderZone(double resistanceZoneLowerEdge, double stopLossValue) { + + if(stopLossValue < resistanceZoneLowerEdge) { + return true ; + } else { + Comment("stop loss is not under the zone im not taking a buy"); + return false ; + + } + +} + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool sellStopLossAboveZone(double supportZoneHigherEdge, double stopLossValue) { + + if(stopLossValue > supportZoneHigherEdge) { + return true ; + } else { + Comment("stop loss is not above the zone, so im not taking a sell"); + return false ; + } +} + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void manageRiskIfNeeded() { + + if(PositionsTotal()!= 0) { // There is an active trade + manageRiskOnBuysIfNeeded(); + manageRiskOnSellsIfNeeded(); + + } + + +} + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void manageRiskOnBuysIfNeeded() { + if(candleClosedBearish(PERIOD_M15,1) && !bearishCandleIsWeak(PERIOD_M15,1, WICK_RATIO_REJECTION)) { + + for(int i = 0 ; i < NUM_MAX_ALLOWED_TRADES ; i++) { + if((BuyActiveTradesArray[i] != NULL) && !(BuyActiveTradesArray[i].riskAlreadyManaged())) { // if the trade still hasnt managead risk , then do it now. + closePartialFromSpecificPosition(BuyActiveTradesArray[i].getTradeId(),riskManagementPartial); + BuyActiveTradesArray[i].manageRisk(); + } + } + + } + +} + + +void manageRiskOnSellsIfNeeded() { + + if(candleClosedBullish(PERIOD_M15,1) && !bullishCandleIsWeak(PERIOD_M15,1, WICK_RATIO_REJECTION)) { + for(int i = 0 ; i < NUM_MAX_ALLOWED_TRADES ; i++) { + if((SellActiveTradesArray[i] != NULL) && !(SellActiveTradesArray[i].riskAlreadyManaged())) { // if the trade still hasnt managead risk , then do it now. + closePartialFromSpecificPosition(SellActiveTradesArray[i].getTradeId(),riskManagementPartial); + SellActiveTradesArray[i].manageRisk(); + } + } + + } +} + + + + +void secureProfitIfNeeded() { + + if(PositionsTotal() != 0) { // if there are active trades + + secureProfitOnBuysIfNeeded(); + secureProfitOnSellsIfNeeded(); + + } + +} + + + +void secureProfitOnBuysIfNeeded() { + + for(int i=0 ; i< NUM_MAX_ALLOWED_TRADES ; i++) { + + if((BuyActiveTradesArray[i] != NULL) && !(BuyActiveTradesArray[i].firstPartialIsSecured())) { // if first partial is not yet secured for the current position + + double currentProfit = positionProfitInPips(BuyActiveTradesArray[i].getTradeId()); + if(currentProfit >= firstPartialProfitInPips) { + closePartialFromSpecificPosition(BuyActiveTradesArray[i].getTradeId(),firstPartialCloseFactor) ; + BuyActiveTradesArray[i].secureFirstPartial(); + } + + } + } +} + + +void secureProfitOnSellsIfNeeded() { + + for(int i=0 ; i< NUM_MAX_ALLOWED_TRADES ; i++) { + + if((SellActiveTradesArray[i] != NULL) && !(SellActiveTradesArray[i].firstPartialIsSecured())) { // if first partial is not yet secured for the current position + + double currentProfit = positionProfitInPips(SellActiveTradesArray[i].getTradeId()); + if(currentProfit >= firstPartialProfitInPips) { + closePartialFromSpecificPosition(SellActiveTradesArray[i].getTradeId(),firstPartialCloseFactor) ; + SellActiveTradesArray[i].secureFirstPartial(); + } + } + } +} + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int findAvailableSpotInBuyManagerArr() { // returns the index , or -1 if all are full + + for(int i=0 ; i < NUM_MAX_ALLOWED_TRADES ; i++) { + if(BuyActiveTradesArray[i] == NULL) { + return i; + + } + + } + return -1 ; +} + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int findAvailableSpotInSellManagerArr() { // returns the index , or -1 if all are full + + for(int i=0 ; i positionStopLoss(BuyActiveTradesArray[i].getTradeId())) { // if new stop loss is higher than the current position's stop loss + positionTrailStopLoss(BuyActiveTradesArray[i].getTradeId(),newStopLoss,0); + } + } + + + + if((SellActiveTradesArray[i] != NULL)) { // CHECK TRAIL FOR SELLS + double newStopLoss = iHigh(_Symbol,_timeFrame,1); + newStopLoss = newStopLoss + stopLossAboveWickBy ; + if(newStopLoss < positionStopLoss(SellActiveTradesArray[i].getTradeId())) { // if new stop loss is lower than the current position's stop loss + positionTrailStopLoss(SellActiveTradesArray[i].getTradeId(),newStopLoss,0); + } + } + + + + + } +} +//+------------------------------------------------------------------+ diff --git a/TigerObserver.ex5 b/TigerObserver.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..2f57dcf68bed07756da403abee0fdbce52dfb226 GIT binary patch literal 34970 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 literal 0 HcmV?d00001 diff --git a/TigerObserver.mq5 b/TigerObserver.mq5 new file mode 100644 index 0000000..8205be0 --- /dev/null +++ b/TigerObserver.mq5 @@ -0,0 +1,694 @@ +//+------------------------------------------------------------------+ +//| TigerObserver.mq5 | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#include "NewCandleDetector.mqh" +#include "GraphicalObjectsManager.mqh" +#include "Zone.mqh" +#include "ZoneContainer.mqh" + +#include "MarketObserverTiger.mqh" + + +input group "Range Related Variables" +input double rangeDistanceBetweenZones ; +input double cleanRangeUponEntry ; +input double potentialRR; + +input group "Zone Size Settings" +input double resistanceExtendAboveCandle; +input double resistanceLowerEdgeExtend ; +input double supportExtendBelowCandle ; +input double supportHigherEdgeExtend; + +input group "Zone TimeFrames" +input bool APPLY_M30_STRUCTURE ; +input bool APPLY_H1_STRUCTURE; + + +// GUI CLASSES INITIALIZATION +GraphicalObjectsManager* objectsManager = new GraphicalObjectsManager(); + +// CONTAINERS INITIALIZATION + + +ZoneContainer* zoneContainer_W1 = new ZoneContainer() ; +ZoneContainer* zoneContainer_D1 = new ZoneContainer() ; +ZoneContainer* zoneContainer_H4 = new ZoneContainer() ; +ZoneContainer* zoneContainer_H1 = new ZoneContainer() ; +ZoneContainer* zoneContainer_M30 = new ZoneContainer() ; + + +ZoneContainer* zoneContainerSupport_W1 = new ZoneContainer() ; +ZoneContainer* zoneContainerSupport_D1 = new ZoneContainer() ; +ZoneContainer* zoneContainerSupport_H4 = new ZoneContainer() ; +ZoneContainer* zoneContainerSupport_H1 = new ZoneContainer() ; +ZoneContainer* zoneContainerSupport_M30 = new ZoneContainer() ; + + + +// ALGORITHM CLASSES INITIALIZATION +MarketObserverTiger* marketObserverTiger = new MarketObserverTiger(); + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +NewCandleDetector newCandleDetectorWeekly("PERIOD_W1"); +NewCandleDetector newCandleDetectorDaily("PERIOD_D1"); +NewCandleDetector newCandleDetector4H("PERIOD_H4"); +NewCandleDetector newCandleDetector1H("PERIOD_H1"); +NewCandleDetector newCandleDetector30M("PERIOD_M30"); +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ + +Zone* temporaryRestestSupportZone = new Zone(); + +int OnInit() + { +//--- create timer + EventSetTimer(60); + +// ONLY FOR VISULAZITAION ON STRATEGY TESTER + iClose(_Symbol,PERIOD_W1,1); + iClose(_Symbol,PERIOD_D1,1); + iClose(_Symbol,PERIOD_H4,5); + iClose(_Symbol,PERIOD_H1,5); + iClose(_Symbol,PERIOD_M30,5); + iClose(_Symbol,PERIOD_M15,5); + + objectsManager.addTextTiger(); + //objectsManager.addMarketDescriptionTextTiger(); + +//--- + return(INIT_SUCCEEDED); + } +//+------------------------------------------------------------------+ +//| Expert deinitialization function | +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) + { +//--- destroy timer + EventKillTimer(); + + } +//+------------------------------------------------------------------+ +//| Expert tick function | +//+------------------------------------------------------------------+ +void OnTick() + { +//--- + + /*if(newCandleDetector30M.isNewCandle()) + { + + detectAndDrawResistanceOnTimeFrame(PERIOD_M30,"PERIOD_M30",clrPink,clrBlue,zoneContainer_M30); + updateBreakAboveStructureAndDelete(zoneContainer_M30,PERIOD_M30,"PERIOD_M30"); + + detectAndDrawSupportOnTimeFrame(PERIOD_M30,"PERIOD_M30",clrYellow,clrGreen,zoneContainerSupport_M30); + updateBreakBelowStructureAndDelete(zoneContainerSupport_M30,PERIOD_M30,"PERIOD_M30"); + + + datetime currTime = TimeCurrent(); + ObjectSetString(0,"clockTextTiger",OBJPROP_TEXT,TimeToString(currTime,TIME_MINUTES)); + + } */ + + + /*if(newCandleDetector1H.isNewCandle()){ + + + MqlDateTime mqldt ; + datetime currTime = TimeCurrent(mqldt); + if(mqldt.hour == 13){ + + objectsManager.drawVerticalLine(clrAzure,TimeCurrent()); + + } + detectAndDrawResistanceOnTimeFrame(PERIOD_H1,"PERIOD_H1",clrGray,clrRed,zoneContainer_H1); + updateBreakAboveStructureAndDelete(zoneContainer_H1,PERIOD_H1,"PERIOD_H1"); + + detectAndDrawSupportOnTimeFrame(PERIOD_H1,"PERIOD_H1",clrWhite,clrRed,zoneContainerSupport_H1); + updateBreakBelowStructureAndDelete(zoneContainerSupport_H1,PERIOD_H1,"PERIOD_H1"); + + + //zoneContainer_H1.printZonesSortedArray(); + //zoneContainerSupport_H1.printZonesSortedArray(); + + } */ + + + + if(newCandleDetector4H.isNewCandle()){ + + detectAndDrawResistanceOnTimeFrame(PERIOD_H4,"PERIOD_H4",clrPurple,clrGreen,zoneContainer_H4); + updateBreakAboveStructureAndDelete(zoneContainer_H4,PERIOD_H4,"PERIOD_H4"); + + detectAndDrawResistanceOnTimeFrame(PERIOD_H4,"PERIOD_H4",clrPink,clrBlue,zoneContainer_H4); + updateBreakAboveStructureAndDelete(zoneContainer_H4,PERIOD_H4,"PERIOD_H4"); + + detectAndDrawSupportOnTimeFrame(PERIOD_H4,"PERIOD_H4",clrYellow,clrGreen,zoneContainerSupport_H4); + updateBreakBelowStructureAndDelete(zoneContainerSupport_H4,PERIOD_H4,"PERIOD_H4"); + + + datetime currTime = TimeCurrent(); + ObjectSetString(0,"clockTextTiger",OBJPROP_TEXT,TimeToString(currTime,TIME_MINUTES)); + } + + if(newCandleDetectorDaily.isNewCandle()){ + + //detectAndDrawResistanceOnTimeFrame(PERIOD_D1,"PERIOD_D1",clrYellow,clrYellow,zoneContainer_D1); + //updateBreakAboveStructureAndDelete(zoneContainer_D1,PERIOD_D1,"PERIOD_D1"); + objectsManager.drawVerticalLine(clrAqua, TimeCurrent()); + + + + } + + + if(newCandleDetectorWeekly.isNewCandle()){ + + objectsManager.drawVerticalLine(clrRed, TimeCurrent());; + } + } +//+------------------------------------------------------------------+ +//| Timer function | +//+------------------------------------------------------------------+ +void OnTimer() + { +//--- + + } +//+------------------------------------------------------------------+ +//| Trade function | +//+------------------------------------------------------------------+ +void OnTrade() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TradeTransaction function | +//+------------------------------------------------------------------+ +void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) + { +//--- + + } +//+------------------------------------------------------------------+ +//| Tester function | +//+------------------------------------------------------------------+ +double OnTester() + { +//--- + double ret=0.0; +//--- + +//--- + return(ret); + } +//+------------------------------------------------------------------+ +//| TesterInit function | +//+------------------------------------------------------------------+ +void OnTesterInit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterPass function | +//+------------------------------------------------------------------+ +void OnTesterPass() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterDeinit function | +//+------------------------------------------------------------------+ +void OnTesterDeinit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| ChartEvent function | +//+------------------------------------------------------------------+ +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) + { +//--- + + } +//+------------------------------------------------------------------+ +//| BookEvent function | +//+------------------------------------------------------------------+ +void OnBookEvent(const string &symbol) + { +//--- + + } +//+------------------------------------------------------------------+ + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool detectAndDrawResistanceOnTimeFrame(ENUM_TIMEFRAMES timeFrame, string timeFrameStr, long BOS_zone_color, long usual_zone_color,ZoneContainer& zoneContainer ) + { + + + if(candleClosedBullish(timeFrame,2) && candleClosedBearish(timeFrame,1)) // if resistance formed + { + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getZonesIdCounter(); + + + datetime _leftEdge = iTime(_Symbol,timeFrame,2); + datetime _rightEdge = D'2023.11.01 00:00:00'; + double resistancePrice = iOpen(_Symbol,timeFrame,1); + + + + + + if((zoneContainer.getNumberOfActiveZones() != 0) && (zoneContainer.getZoneByIndex(0).getLowerEdge() - resistancePrice >= rangeDistanceBetweenZones)) // check if it has a clean range above + { + + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice - resistanceLowerEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_RESISTANCE_BREAKOUT"); + + + + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + Print("current id counter of, zoneContainer is: " + currentIdCounter ); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice - resistanceLowerEdgeExtend,BOS_zone_color); + //Print("Number of active zones is: " + zoneContainer.getNumberOfActiveZones()); + //zoneContainer.printZonesSortedArray(); + } + + else + if((zoneContainer.getNumberOfActiveZones() != 0) && (zoneContainer.getZoneByIndex(0).getLowerEdge() - resistancePrice < rangeDistanceBetweenZones)) // if it doesnt have a clean range, just add it as a blue zone + { + double currentHighEdge = resistancePrice + resistanceExtendAboveCandle ; // this is a high edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + double currentLowEdge = resistancePrice - resistanceLowerEdgeExtend; // this is a low edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice - resistanceLowerEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_RESISTANCE_NORMAL"); + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + //objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice,usual_zone_color); + + /*if(zoneContainer.getZoneByIndex(1).getType() == "TYPE_RESISTANCE_NORMAL"){ + string idOfZoneToHide = zoneContainer.getZoneByIndex(1).getId(); + deleteZoneGuiOnly(idOfZoneToHide,zoneContainer); + } */ + + + + } + + else + if(zoneContainer.getNumberOfActiveZones() == 0) // this means this is the first zone to add to the data strucutre + { + + //Print("Entered here 2"); + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(resistancePrice + resistanceExtendAboveCandle); + newZone.setLowerEdgePrice(resistancePrice - resistanceLowerEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_RESISTANCE_BREAKOUT"); + + + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice - resistanceLowerEdgeExtend,BOS_zone_color); + //zoneContainer.printZonesSortedArray(); + } + + return true ; + + } + return false ; + } + + + + + bool detectAndDrawSupportOnTimeFrame(ENUM_TIMEFRAMES timeFrame, string timeFrameStr, long BOS_zone_color, long usual_zone_color,ZoneContainer& zoneContainer ) + { + + + if(candleClosedBearish(timeFrame,2) && candleClosedBullish(timeFrame,1)) // if support formed + { + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getSupportZonesIdCounter(); + + + datetime _leftEdge = iTime(_Symbol,timeFrame,2); + datetime _rightEdge = D'2023.11.01 00:00:00'; + double supportPrice = iOpen(_Symbol,timeFrame,1); + + + + + + if((zoneContainer.getNumberOfActiveZones() != 0) && (supportPrice - zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge() >= rangeDistanceBetweenZones)) // check if it has a clean range down + { + + Zone* newZone = new Zone() ; + newZone.setLowerEdgePrice(supportPrice - supportExtendBelowCandle); + newZone.setHigherEdgePrice(supportPrice + supportHigherEdgeExtend); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_SUPPORT_BREAKOUT"); + + + + + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + Print("current id counter of, zoneContainer_support is: " + currentIdCounter ); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice + supportHigherEdgeExtend,supportPrice- supportExtendBelowCandle,BOS_zone_color); + //Print("Number of active zones is: " + zoneContainer.getNumberOfActiveZones()); + //zoneContainer.printZonesSortedArray(); + } + + else + if((zoneContainer.getNumberOfActiveZones() != 0) && (supportPrice - zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge() < rangeDistanceBetweenZones)) // if it doesnt have a clean range, just add it as a blue zone + { + double currentHighEdge = supportPrice + supportHigherEdgeExtend ; // this is a high edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + double currentLowEdge = supportPrice - supportExtendBelowCandle; // this is a low edge of a resistance, but its not considered as a zone, because it doesnt have clean range above + + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(supportPrice + supportHigherEdgeExtend); + newZone.setLowerEdgePrice(supportPrice - supportExtendBelowCandle); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_SUPPORT_NORMAL"); + + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + //objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice,supportPrice - supportExtendBelowCandle,usual_zone_color); + + } + + else + if(zoneContainer.getNumberOfActiveZones() == 0) // this means this is the first zone to add to the data strucutre + { + + //Print("Entered here 2"); + Zone* newZone = new Zone() ; + newZone.setHigherEdgePrice(supportPrice + supportHigherEdgeExtend); + newZone.setLowerEdgePrice(supportPrice - supportExtendBelowCandle); + newZone.setLeftEdge(_leftEdge); + newZone.setRightEdge(_rightEdge); + newZone.setId(IntegerToString(currentIdCounter)); + newZone.setTimeFrame(timeFrameStr); + newZone.setType("TYPE_SUPPORT_BREAKOUT"); + + + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice + supportHigherEdgeExtend,supportPrice - supportExtendBelowCandle,BOS_zone_color); + //zoneContainer.printZonesSortedArray(); + } + + + return true ; + + } + return false ; + } + + + + + + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool candleClosedBullish(ENUM_TIMEFRAMES _timeFrame, int _index) + { + double candleClose = iClose(_Symbol,_timeFrame,_index); + double candleOpen = iOpen(_Symbol,_timeFrame,_index); + + + if(candleClose >candleOpen) // the candle closed bullish + { + + return true ; + } + return false ; + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool candleClosedBearish(ENUM_TIMEFRAMES _timeFrame,int _index) + { + + + double candleClose = iClose(_Symbol,_timeFrame,_index); + double candleOpen = iOpen(_Symbol,_timeFrame,_index); + + + if(candleClose < candleOpen) // the candle closed bullish + { + + return true ; + } + return false ; + } +//+------------------------------------------------------------------+ + + + +void deleteZoneWithGUI(string _id, ZoneContainer& zoneContainer) + { + + + zoneContainer.deleteZone(_id); + + if(!ObjectDelete(_Symbol,_id)) + { + Print("Failed to delete object error: " + GetLastError()); + } + + + Print("Deleted the zone with gui!"); + + } + + + + void deleteZoneGuiOnly(string _id,ZoneContainer& zoneContainer) + { + + + if(!ObjectDelete(_Symbol,_id)) + { + Print("Failed to delete object error: " + GetLastError()); + } + + Print("Deleted the zone gui!"); + + } + + + + + + + +void updateBreakAboveStructureAndDelete(ZoneContainer& zoneContainer, ENUM_TIMEFRAMES timeFrame, string timeFrameStr){ + bool finishedDeleting = false ; + + if(zoneContainer.getNumberOfActiveZones() != 0) // if there are zones found + { + if(marketObserverTiger.candleClosedAboveResistanceByIndex(0,timeFrame,zoneContainer)) // check if candle closed above the zone + { + + + + datetime _leftEdgeRestestZone = iTime(_Symbol,timeFrame,4); + datetime _rightEdgeRetestZone = D'2023.11.01 00:00:00'; + + + while(!finishedDeleting && zoneContainer.getNumberOfActiveZones() != 0 ) // this while is used in the case of a candle closing above more than 1 zone at once + { + /* temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(0).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(0).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame("PERIOD_M30"); + temporaryRestestSupportZone.setType("TYPE_SUPPORT"); + deleteZoneWithGUI((zoneContainer.getZoneByIndex(0).getId())); // delete the zone with the GUI */ + + if(zoneContainer.getNumberOfActiveZones() != 0 && marketObserverTiger.candleClosedAboveResistanceByIndex(0,timeFrame,zoneContainer)) + { + zoneContainer.getZoneByIndex(0).getHigherEdge(); + temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(0).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(0).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame(timeFrameStr); + temporaryRestestSupportZone.setType("TYPE_SUPPORT"); + deleteZoneWithGUI((zoneContainer.getZoneByIndex(0).getId()),zoneContainer); // delete the zone with the GUI + } + else + { + finishedDeleting = true ; + ObjectSetString(0,"marketDescriptionText",OBJPROP_TEXT,""); + ObjectSetString(0,"marketDescriptionText",OBJPROP_TEXT,""); + ObjectSetString(0,"marketDescriptionText",OBJPROP_TEXT,"Candle Closed Above the zone"); + } + + + } + + /*if(zoneContainer.getNumberOfActiveZones() != 0 && zoneContainer.getZoneByIndex(0).getType() == "TYPE_RESISTANCE_NORMAL"){ + + Zone* tempZone = zoneContainer.getZoneByIndex(0); + string zoneIdStr = tempZone.getId(); + int zoneIdInteger = StringToInteger(zoneIdStr); + + objectsManager.drawRectangleInStrategyTester(zoneIdInteger,tempZone.getLeftEdge(),tempZone.getRightEdge(),tempZone.getHigherEdge(),tempZone.getLowerEdge(),clrRed); + Print("Retrieved the zone succesfully!"); + + + } */ + + + } + + + } + +} + + + + + +void updateBreakBelowStructureAndDelete(ZoneContainer& zoneContainer, ENUM_TIMEFRAMES timeFrame, string timeFrameStr){ + bool finishedDeleting = false ; + + if(zoneContainer.getNumberOfActiveZones() != 0) // if there are zones found + { + + if(marketObserverTiger.candleClosedBelowSupportByIndex(zoneContainer.getNumberOfActiveZones() -1 ,timeFrame,zoneContainer)) // check if candle closed below the zone + { + + + datetime _leftEdgeRestestZone = iTime(_Symbol,timeFrame,4); + datetime _rightEdgeRetestZone = D'2023.11.01 00:00:00'; + + + while(!finishedDeleting && zoneContainer.getNumberOfActiveZones() != 0 ) // this while is used in the case of a candle closing above more than 1 zone at once + { + /* temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(0).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(0).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame("PERIOD_M30"); + temporaryRestestSupportZone.setType("TYPE_SUPPORT"); + deleteZoneWithGUI((zoneContainer.getZoneByIndex(0).getId())); // delete the zone with the GUI */ + + if(zoneContainer.getNumberOfActiveZones() != 0 && marketObserverTiger.candleClosedBelowSupportByIndex(zoneContainer.getNumberOfActiveZones()-1,timeFrame,zoneContainer)) + { + zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge(); + temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("9999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame(timeFrameStr); + temporaryRestestSupportZone.setType("TYPE_RESISTANCE"); + + deleteZoneWithGUI((zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getId()),zoneContainer); // delete the zone with the GUI + + } + else + { + //Print("Lower edge is: " + zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getLowerEdge()); + finishedDeleting = true ; + ObjectSetString(0,"marketDescriptionText",OBJPROP_TEXT,""); + ObjectSetString(0,"marketDescriptionText",OBJPROP_TEXT,""); + ObjectSetString(0,"marketDescriptionText",OBJPROP_TEXT,"Candle Closed Below the zone"); + } + + + } + + /*if(zoneContainer.getNumberOfActiveZones() != 0 && zoneContainer.getZoneByIndex(0).getType() == "TYPE_RESISTANCE_NORMAL"){ + + Zone* tempZone = zoneContainer.getZoneByIndex(0); + string zoneIdStr = tempZone.getId(); + int zoneIdInteger = StringToInteger(zoneIdStr); + + objectsManager.drawRectangleInStrategyTester(zoneIdInteger,tempZone.getLeftEdge(),tempZone.getRightEdge(),tempZone.getHigherEdge(),tempZone.getLowerEdge(),clrRed); + Print("Retrieved the zone succesfully!"); + + + } */ + + + } + + + } + +} \ No newline at end of file diff --git a/TigerWicksIncluded.ex5 b/TigerWicksIncluded.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..9e798a6224acbe45c5e34a78388300bbb9d5cc85 GIT binary patch literal 70946 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

    QGLyl`Yv%X#G~9}P5Jqa6V`P1${#I0~X=Gz`>I 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 literal 0 HcmV?d00001 diff --git a/TigerWicksIncluded.mq5 b/TigerWicksIncluded.mq5 new file mode 100644 index 0000000..c4709b3 --- /dev/null +++ b/TigerWicksIncluded.mq5 @@ -0,0 +1,1465 @@ +//+------------------------------------------------------------------+ +//| TigerObserver.mq5 | +//| Copyright 2023, MetaQuotes Ltd. | +//| https://www.mql5.com | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2023, MetaQuotes Ltd." +#property link "https://www.mql5.com" +#property version "1.00" + +#define NUM_MAX_ALLOWED_TRADES 4 + +#include "library_functions.mqh" + +#include "NewCandleDetector.mqh" +#include "GraphicalObjectsManager.mqh" +#include "Zone.mqh" +#include "ZoneContainer.mqh" +#include "LotSizeCalculator.mqh" +#include "MarketObserverTiger.mqh" + +#include "BuyEntryManager.mqh" +#include "SellEntryManager.mqh" +#include "BuyTradeManagerTiger.mqh" +#include "SellTradeManagerTiger.mqh" + + +input group "Range Related Variables" +input double rangeDistanceBetweenZones ; +input double cleanRangeUponEntry ; +input double potentialRR; + +input group "Zone Related Settings" +input double resistanceExtendAboveCandle; +input double resistanceLowerEdgeExtend ; +input double supportExtendBelowCandle ; +input double supportHigherEdgeExtend; +input int firstZoneShift ; +input datetime rightEdge ; + +input group "Zone TimeFrames" +input bool APPLY_M30_STRUCTURE ; +input bool APPLY_H1_STRUCTURE; + +input group "Candle Body Variables" +input double WICK_RATIO_REJECTION; +input double SIZE_OF_BREAKER_CANDLE_BODY; + +input group "Trade Related Variables" +input double riskManagementPartial ; +input double firstPartialCloseFactor ; +input double firstPartialProfitInPips; +input bool BUYS_ALLOWED = true ; +input bool SELLS_ALLOWED = true ; + +input group "Trading Sessions" +input bool TRADE_NEW_YORK_ALLOWED = true ; +input bool TRADE_LONDON_ALLOWED = true ; + +// GUI CLASSES INITIALIZATION +GraphicalObjectsManager* objectsManager = new GraphicalObjectsManager(); + +// CONTAINERS INITIALIZATION + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +ZoneContainer* zoneContainer_W1 = new ZoneContainer() ; +ZoneContainer* zoneContainer_D1 = new ZoneContainer() ; +ZoneContainer* zoneContainer_H4 = new ZoneContainer() ; +ZoneContainer* zoneContainer_H1 = new ZoneContainer() ; +ZoneContainer* zoneContainer_M30 = new ZoneContainer() ; + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +ZoneContainer* zoneContainerSupport_W1 = new ZoneContainer() ; +ZoneContainer* zoneContainerSupport_D1 = new ZoneContainer() ; +ZoneContainer* zoneContainerSupport_H4 = new ZoneContainer() ; +ZoneContainer* zoneContainerSupport_H1 = new ZoneContainer() ; +ZoneContainer* zoneContainerSupport_M30 = new ZoneContainer() ; + + + +// ALGORITHM CLASSES INITIALIZATION +MarketObserverTiger* marketObserverTiger = new MarketObserverTiger(); + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +NewCandleDetector newCandleDetectorWeekly("PERIOD_W1"); +NewCandleDetector newCandleDetectorDaily("PERIOD_D1"); +NewCandleDetector newCandleDetector4H("PERIOD_H4"); +NewCandleDetector newCandleDetector1H("PERIOD_H1"); +NewCandleDetector newCandleDetector30M("PERIOD_M30"); +NewCandleDetector newCandleDetectorM15("PERIOD_M15"); +//+------------------------------------------------------------------+ +//| Expert initialization function | +//+------------------------------------------------------------------+ + +Zone* temporaryRestestSupportZone = new Zone(); + + + +// TRADE CLASSES +BuyEntryManager buyEntryManager ; +SellEntryManager sellEntryManager ; + + +// LotSizeCalculator class + +LotSizeCalculator lsCalc ; + + +// TRADE VARIABLS +bool securedRisk = false ; +ulong activeTradeId ; +BuyTradeManagerTiger* BuyActiveTradesArray[NUM_MAX_ALLOWED_TRADES]; +SellTradeManagerTiger* SellActiveTradesArray[NUM_MAX_ALLOWED_TRADES]; +int buysCount = 0 ; +int sellsCount = 0 ; + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int OnInit() + { +//--- create timer + EventSetTimer(60); + +// ONLY FOR VISULAZITAION ON STRATEGY TESTER + iClose(_Symbol,PERIOD_W1,1); + iClose(_Symbol,PERIOD_D1,1); + iClose(_Symbol,PERIOD_H4,5); + iClose(_Symbol,PERIOD_H1,5); + iClose(_Symbol,PERIOD_M30,5); + iClose(_Symbol,PERIOD_M15,5); + + objectsManager.addTextTiger(); + + for(int i=0; i= cleanRangeUponEntry) + { + + double stopLossBased_H1 = iLow(_Symbol,PERIOD_H1,1); + double stopLossBased_M30 = iLow(_Symbol,PERIOD_M30,1); + double stopLossBased_M15 = iLow(_Symbol,PERIOD_M15,1); + + stopLossBased_H1 = stopLossBased_H1 - stopLossUnderWickBy ; + stopLossBased_M30 = stopLossBased_M30 - stopLossUnderWickBy ; + stopLossBased_M15 = stopLossBased_M15 - stopLossUnderWickBy ; + + if(stopLossIsValidBuys(stopLossBased_M30, maxPipsRiskAmount)) + { + + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_M30); + int indexToNewTrade ; + if((indexToNewTrade = findAvailableSpotInBuyManagerArr()) != -1) // find a spot in the trades array, and save the result + { + Print("The free index found is: " + indexToNewTrade); + activeTradeId = buyEntryManager.takeBuyTradeTiger(lotsToEnter,stopLossBased_M30) ; + + BuyTradeManagerTiger* tempTigerManager= new BuyTradeManagerTiger(activeTradeId); // create an object of type buyTradeManagerTiger + BuyActiveTradesArray[indexToNewTrade] = tempTigerManager ;// put the new object in the array + buysCount++; + + Comment("Took a buy. stop loss: based on M30, " + "Active trade id: " + activeTradeId); + } + else + { + + Comment("I cant take a trade because the trades array is full"); + } + + + } + else + if(stopLossIsValidBuys(stopLossBased_M15,maxPipsRiskAmount) && candleClosedBullish(PERIOD_M15,1)) + { + + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_M15); + int indexToNewTrade ; + if((indexToNewTrade = findAvailableSpotInBuyManagerArr()) != -1) // find a spot in the trades array, and save the result + { + Print("The free index found is: " + indexToNewTrade); + activeTradeId = buyEntryManager.takeBuyTradeTiger(lotsToEnter,stopLossBased_M15) ; + + BuyTradeManagerTiger* tempTigerManager= new BuyTradeManagerTiger(activeTradeId); // create an object of type buyTradeManagerTiger + BuyActiveTradesArray[indexToNewTrade] = tempTigerManager ;// put the new object in the array + buysCount++; + Comment("Took a buy. stop loss: based on M15, " + "Active trade id: " + activeTradeId); + } + else + { + + Comment("I cant take a trade because the trades array is full"); + + } + + } + + else + { + + + Comment("Failed to find a valid stop loss on both M30 and M15 !"); + } + + } + + else + { + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + + Comment(timeInStr + ": Price Broke the resitance zone, but not enough clean range to take a trade"); + + } + + } + else + { + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + Comment(timeInStr+ ": Price broke the resistance zone but i dont see the next target zone, Or the zone price broke was not a breakout zone "); + + } + + } + + + if(updateBreakBelowStructureAndDelete(zoneContainerSupport_M30,PERIOD_M30,"PERIOD_M30",brokenSupportHigherPrice,brokenZoneTypeSupport) + && sellBreakerCandleIsValid(PERIOD_M30, SIZE_OF_BREAKER_CANDLE_BODY) + && ((sessionIsNy() && TRADE_NEW_YORK_ALLOWED) || (sessionIsLondon() && TRADE_LONDON_ALLOWED)) && SELLS_ALLOWED) // means M30 candle broke structure, and the breaker candle is valid (big enough),and time is in the sessions (ny or london or both, based on what the user chose)) + { + + + double firstSupportPrice = findClosestSupportPrice(zoneContainerSupport_M30); + + double cleanRangeValueSells = SymbolInfoDouble(_Symbol, SYMBOL_BID) - firstSupportPrice; + + Print("firstSupport variable is: " + firstSupportPrice); + Print("cleanRangeValueSells :" + cleanRangeValueSells); + + + if(firstSupportPrice != -1 && brokenZoneTypeSupport == "TYPE_SUPPORT_BREAKOUT") + { + Comment("M30 candle Broke and closed below the zone. the closest support price is:" + DoubleToString(firstSupportPrice)); + if(cleanRangeValueSells >= cleanRangeUponEntry) + { + + double stopLossBased_H1 = iHigh(_Symbol,PERIOD_H1,1); + double stopLossBased_M30 = iHigh(_Symbol,PERIOD_M30,1); + double stopLossBased_M15 = iHigh(_Symbol,PERIOD_M15,1); + + stopLossBased_H1 = stopLossBased_H1 + stopLossAboveWickBy ; + stopLossBased_M30 = stopLossBased_M30 + stopLossAboveWickBy ; + stopLossBased_M15 = stopLossBased_M15 + stopLossAboveWickBy ; + + if(stopLossIsValidSells(stopLossBased_M30, maxPipsRiskAmount)) + { + + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_M30); + int indexToNewTrade ; + + if((indexToNewTrade = findAvailableSpotInSellManagerArr()) != -1) + { + + Print("The free index found is: " + indexToNewTrade); + activeTradeId = sellEntryManager.takeSellTradeTiger(lotsToEnter,stopLossBased_M30) ; + + SellTradeManagerTiger* tempTigerManager= new SellTradeManagerTiger(activeTradeId); // create an object of type buyTradeManagerTiger + SellActiveTradesArray[indexToNewTrade] = tempTigerManager ;// put the new object in the array + sellsCount++; + Comment("Took a sell. stop loss: based on M30, " + "Active trade id: " + activeTradeId); + + } + else + { + + Comment("i cant take a trade because the arrray is full"); + } + + + } + else + if(stopLossIsValidSells(stopLossBased_M15,maxPipsRiskAmount) && candleClosedBearish(PERIOD_M15,1)) + { + double lotsToEnter = lsCalc.calculateLotSize(riskDollars,stopLossBased_M15); + int indexToNewTrade ; + if((indexToNewTrade = findAvailableSpotInSellManagerArr()) != -1) + { + Print("The free index found is: " + indexToNewTrade); + activeTradeId = sellEntryManager.takeSellTradeTiger(lotsToEnter,stopLossBased_M15) ; + + SellTradeManagerTiger* tempTigerManager= new SellTradeManagerTiger(activeTradeId); // create an object of type buyTradeManagerTiger + SellActiveTradesArray[indexToNewTrade] = tempTigerManager ;// put the new object in the array + sellsCount++; + Comment("Took a sell. stop loss: based on M15, "+ "Active trade id: " + activeTradeId); + } + else + { + Comment("i cant take a trade since another one is running"); + } + } + + else + { + + + Comment("Failed to find a valid stop loss on both M30 and M15 !"); + } + + } + + else + { + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + + + Comment(timeInStr + ": Price Broke the support zone, but not enough clean range to take a trade"); + + } + + } + else + { + datetime currTime = TimeCurrent(); + string timeInStr = TimeToString(currTime,TIME_MINUTES); + Comment(timeInStr+ ": Price broke the support zone but i dont see the next target zone, Or the zone price broke was not a breakout zone "); + + } + + + + } + + + datetime currTime = TimeCurrent(); + ObjectSetString(0,"clockTextTiger",OBJPROP_TEXT,TimeToString(currTime,TIME_MINUTES)); + + + zoneContainer_M30.printZonesSortedArray(); + zoneContainerSupport_M30.printZonesSortedArray(); + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + if(newCandleDetectorDaily.isNewCandle()) + { + + //detectAndDrawResistanceOnTimeFrame(PERIOD_D1,"PERIOD_D1",clrYellow,clrYellow,zoneContainer_D1); + //updateBreakAboveStructureAndDelete(zoneContainer_D1,PERIOD_D1,"PERIOD_D1"); + objectsManager.drawVerticalLine(clrAqua, TimeCurrent()); + + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ + if(newCandleDetectorWeekly.isNewCandle()) + { + + objectsManager.drawVerticalLine(clrRed, TimeCurrent()); + } + + } + +//+------------------------------------------------------------------+ +//| Timer function | +//+------------------------------------------------------------------+ +void OnTimer() + { +//--- + + } +//+------------------------------------------------------------------+ +//| Trade function | +//+------------------------------------------------------------------+ +void OnTrade() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TradeTransaction function | +//+------------------------------------------------------------------+ +void OnTradeTransaction(const MqlTradeTransaction& trans, + const MqlTradeRequest& request, + const MqlTradeResult& result) + { +//--- + + } +//+------------------------------------------------------------------+ +//| Tester function | +//+------------------------------------------------------------------+ +double OnTester() + { +//--- + double ret=0.0; +//--- + +//--- + return(ret); + } +//+------------------------------------------------------------------+ +//| TesterInit function | +//+------------------------------------------------------------------+ +void OnTesterInit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterPass function | +//+------------------------------------------------------------------+ +void OnTesterPass() + { +//--- + + } +//+------------------------------------------------------------------+ +//| TesterDeinit function | +//+------------------------------------------------------------------+ +void OnTesterDeinit() + { +//--- + + } +//+------------------------------------------------------------------+ +//| ChartEvent function | +//+------------------------------------------------------------------+ +void OnChartEvent(const int id, + const long &lparam, + const double &dparam, + const string &sparam) + { +//--- + + } +//+------------------------------------------------------------------+ +//| BookEvent function | +//+------------------------------------------------------------------+ +void OnBookEvent(const string &symbol) + { +//--- + + } +//+------------------------------------------------------------------+ + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool detectAndDrawResistanceOnTimeFrame(ENUM_TIMEFRAMES timeFrame, string timeFrameStr, long BOS_zone_color, long usual_zone_color,ZoneContainer& zoneContainer) + { + + + if(resistancePatternFormed(timeFrame)) // if resistance formed + { + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getZonesIdCounter(); + + + datetime _leftEdge = iTime(_Symbol,timeFrame,2); + //datetime _rightEdge = D'2023.11.01 00:00:00'; + datetime _rightEdge = rightEdge; + double resistancePrice = iOpen(_Symbol,timeFrame,1); + double _higherEdgePrice = resistancePrice + resistanceExtendAboveCandle; + double _lowerEdgePrice = resistancePrice - resistanceLowerEdgeExtend ; + string _zoneId = IntegerToString(currentIdCounter); + + + + if((zoneContainer.getNumberOfActiveZones() != 0) && (zoneContainer.getZoneByIndex(0).getLowerEdge() - resistancePrice >= rangeDistanceBetweenZones)) // check if it has a clean range above + { + + Zone* newZone = new Zone(_zoneId,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_RESISTANCE_BREAKOUT") ; + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice - resistanceLowerEdgeExtend,BOS_zone_color); + + } + + else + if((zoneContainer.getNumberOfActiveZones() != 0) && (zoneContainer.getZoneByIndex(0).getLowerEdge() - resistancePrice < rangeDistanceBetweenZones)) // if it doesnt have a clean range, just add it as a blue zone + { + + Zone* newZone = new Zone(_zoneId,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_RESISTANCE_NORMAL") ; + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + + + } + + else + if(zoneContainer.getNumberOfActiveZones() == 0) // this means this is the first zone to add to the data strucutre + { + int result = detectAndDrawFirstResistanceZoneHigherThan(resistancePrice + resistanceExtendAboveCandle, timeFrame,firstZoneShift, zoneContainer, timeFrameStr,BOS_zone_color); + if(result == 1) + { + + string currentIdCounter = IntegerToString(zoneContainer.getZonesIdCounter()); + Zone* newZone = new Zone(currentIdCounter,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_RESISTANCE_BREAKOUT") ; + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice - resistanceLowerEdgeExtend,BOS_zone_color); + + + + } + else + if(result == 0) + { + string currentIdCounter = IntegerToString(zoneContainer.getZonesIdCounter()); + + Zone* newZone = new Zone(currentIdCounter,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_RESISTANCE_NORMAL") ; + + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + } + else + if(result == 2) + { + string currentIdCounter = IntegerToString(zoneContainer.getZonesIdCounter()); + + Zone* newZone = new Zone(currentIdCounter,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_RESISTANCE_BREAKOUT") ; + zoneContainer.addResistanceZoneTiger(newZone); + zoneContainer.incrementZonesIdCounter(); + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,resistancePrice + resistanceExtendAboveCandle,resistancePrice - resistanceLowerEdgeExtend,BOS_zone_color); + + } + + } + + + + + if(allResistancesAreNormalType(zoneContainer)) // if all resistances are type normal , then find the first resistance higher than the current highest resistance + { + + double highestResistanceZonePrice = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge() ; + int res = detectAndDrawFirstResistanceZoneHigherThan(highestResistanceZonePrice, timeFrame,firstZoneShift, zoneContainer, timeFrameStr,BOS_zone_color); + + + + if(res == 1) + { + if((zoneContainer.getNumberOfActiveZones()-2) >= 0) + { + + zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-2).setType("TYPE_RESISTANCE_BREAKOUT"); // we choose the second cell from the end, because in the last index now sits the new higher zone created by the previous function call. + } + + + } + else + if(res == 0) + { + + if((zoneContainer.getNumberOfActiveZones()-2) >= 0) + { + deleteZoneGuiOnly(zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-2).getId(),zoneContainer); + } + + } + + } + + return true ; + + } + return false ; + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool detectAndDrawSupportOnTimeFrame(ENUM_TIMEFRAMES timeFrame, string timeFrameStr, long BOS_zone_color, long usual_zone_color,ZoneContainer& zoneContainer) + { + + + if(supportPatternFormed(timeFrame)) // if support formed + { + + // create a rectangle with a unique name + int currentIdCounter = zoneContainer.getSupportZonesIdCounter(); + + + datetime _leftEdge = iTime(_Symbol,timeFrame,2); + datetime _rightEdge =rightEdge; + double supportPrice = iOpen(_Symbol,timeFrame,1); + double _higherEdgePrice = supportPrice + supportHigherEdgeExtend; + double _lowerEdgePrice = supportPrice - supportExtendBelowCandle; + string _zoneId = IntegerToString(currentIdCounter); + + + + if((zoneContainer.getNumberOfActiveZones() != 0) && (supportPrice - zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge() >= rangeDistanceBetweenZones)) // check if it has a clean range down + { + + Zone* newZone = new Zone(currentIdCounter,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_SUPPORT_BREAKOUT") ; + + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice + supportHigherEdgeExtend,supportPrice- supportExtendBelowCandle,BOS_zone_color); + + } + + else + if((zoneContainer.getNumberOfActiveZones() != 0) && (supportPrice - zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge() < rangeDistanceBetweenZones)) // if it doesnt have a clean range, just add it as a blue zone + { + Zone* newZone = new Zone(currentIdCounter,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_SUPPORT_NORMAL") ; + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + } + + else + if(zoneContainer.getNumberOfActiveZones() == 0) // this means this is the first zone to add to the data strucutre + { + + // Add the old lower support zone before adding the new support zone. + + int result = detectAndDrawFirstSupportZoneLowerThan(supportPrice - supportExtendBelowCandle, timeFrame,firstZoneShift, zoneContainer, timeFrameStr,BOS_zone_color); + if(result == 1) // means if found a lower zone and the range is clean + { + string currentIdCounter = IntegerToString(zoneContainer.getSupportZonesIdCounter()); + Zone* newZone = new Zone(currentIdCounter,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_SUPPORT_BREAKOUT") ; + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice + supportHigherEdgeExtend,supportPrice - supportExtendBelowCandle,BOS_zone_color); + + } + else + if(result == 0) // means found a lower zone but the range is not clean + { + + string currentIdCounter = IntegerToString(zoneContainer.getSupportZonesIdCounter()); + + Zone* newZone = new Zone(currentIdCounter,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_SUPPORT_NORMAL") ; + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + } + else + if(result == 2) // means didnt find a lower zone + { + + string currentIdCounter = IntegerToString(zoneContainer.getSupportZonesIdCounter()); + + Zone* newZone = new Zone(currentIdCounter,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_SUPPORT_BREAKOUT") ; + zoneContainer.addSupportZoneTiger(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,supportPrice + supportHigherEdgeExtend,supportPrice - supportExtendBelowCandle,BOS_zone_color); + } + + + + } + + + + if(allSupportsAreNormalType(zoneContainer)) // if all supports are type normal , then find the first support lower than the current lowest. + { + + + double lowestSupportPrice = zoneContainer.getZoneByIndex(0).getLowerEdge() ; + int res = detectAndDrawFirstSupportZoneLowerThan(lowestSupportPrice, timeFrame,firstZoneShift, zoneContainer, timeFrameStr,BOS_zone_color) == 1 ; + + if(res == 1) // if we found lower support than the current lower, and the range is valid, then keep both + { + + zoneContainer.getZoneByIndex(1).setType("TYPE_SUPPORT_BREAKOUT"); // we choose index 1, because in index 0 now sits the new lower zone created by the previous function call. + } + else + if(res == 0) // if we found a lower support than the current lowest but the range is not valid, then keep only the lower one + { + + if(zoneContainer.getNumberOfActiveZones() > 1) + { + zoneContainer.getZoneByIndex(1).setType("TYPE_SUPPORT_NORMAL"); + deleteZoneGuiOnly(zoneContainer.getZoneByIndex(1).getId(),zoneContainer); + } + + } + + } + + + return true ; + + } + return false ; + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int detectAndDrawFirstResistanceZoneHigherThan(double currentHigherResistancePrice, ENUM_TIMEFRAMES timeFrame,int _firstZoneShift,ZoneContainer& zoneContainer,string timeFrameStr, long BOS_zone_color) + { + + for(int i=3 ; i< _firstZoneShift; i++) + { + if(resistancePatternFormed(timeFrame,i)) // if old resistance found + { + + // create a rectangle with a unique name + string currentIdCounter = IntegerToString(zoneContainer.getZonesIdCounter()); + + + datetime _leftEdge = iTime(_Symbol,timeFrame,i+2); + datetime _rightEdge = rightEdge; + double resistancePrice = iOpen(_Symbol,timeFrame,i+1); + double _higherEdgePrice = resistancePrice + resistanceExtendAboveCandle; + double _lowerEdgePrice = resistancePrice - resistanceLowerEdgeExtend ; + + if((resistancePrice > currentHigherResistancePrice) && ((resistancePrice - currentHigherResistancePrice) > rangeDistanceBetweenZones)) // this means the range is valid + { + + Zone* newZone = new Zone(currentIdCounter,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_RESISTANCE_NORMAL") ; + zoneContainer.addHistoryResistanceZoneOnTop(newZone); + zoneContainer.incrementZonesIdCounter(); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,newZone.getHigherEdge(),newZone.getLowerEdge(),BOS_zone_color); + + return 1 ; // range is valid so return 1 + } + else + if((resistancePrice > currentHigherResistancePrice) && !((resistancePrice - currentHigherResistancePrice) > rangeDistanceBetweenZones)) // the range is not valid, this means draw only the old one + { + + Zone* newZone = new Zone(currentIdCounter,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_RESISTANCE_NORMAL") ; + + zoneContainer.addHistoryResistanceZoneOnTop(newZone); + zoneContainer.incrementZonesIdCounter(); + + + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,newZone.getHigherEdge(),newZone.getLowerEdge(),BOS_zone_color); + + + return 0 ; // range is not valid , so return 0 + + } + } + } + return 2; // this is the case that we didnt find a zone above the current highest zone, which means the current highest zone now, will be breakout zone + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int detectAndDrawFirstSupportZoneLowerThan(double currentLowerSupportPrice, ENUM_TIMEFRAMES timeFrame,int _firstZoneShift,ZoneContainer& zoneContainer,string timeFrameStr, long BOS_zone_color) + { + + int result = 2 ; + for(int i=3 ; i< _firstZoneShift; i++) + { + if(supportPatternFormed(timeFrame,i)) // if old support found + { + // create a rectangle with a unique name + string currentIdCounter = IntegerToString(zoneContainer.getSupportZonesIdCounter()); + datetime _leftEdge = iTime(_Symbol,timeFrame,i+2); + datetime _rightEdge = rightEdge; + double supportPrice = iOpen(_Symbol,timeFrame,i+1); + double _higherEdgePrice = supportPrice + supportHigherEdgeExtend; + double _lowerEdgePrice = supportPrice - supportExtendBelowCandle ; + + if((supportPrice < currentLowerSupportPrice) && ((currentLowerSupportPrice - supportPrice) > rangeDistanceBetweenZones)) // this means the range is valid + { + + Zone* newZone = new Zone(currentIdCounter,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_SUPPORT_NORMAL") ; + zoneContainer.addHistorySupportZoneAtBottom(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,newZone.getHigherEdge(),newZone.getLowerEdge(),BOS_zone_color); + + return 1 ; + } + else + if((supportPrice < currentLowerSupportPrice) && !((currentLowerSupportPrice - supportPrice) > rangeDistanceBetweenZones)) // the range is not valid, this means draw only the old one + { + + Zone* newZone = new Zone(currentIdCounter,_higherEdgePrice,_lowerEdgePrice,_leftEdge,_rightEdge,timeFrameStr,"TYPE_SUPPORT_NORMAL") ; + zoneContainer.addHistorySupportZoneAtBottom(newZone); + zoneContainer.incrementZonesIdCounterSupport(); + objectsManager.drawRectangleInStrategyTester(currentIdCounter,_leftEdge,_rightEdge,newZone.getHigherEdge(),newZone.getLowerEdge(),BOS_zone_color); + return 0 ; + + } + } + } + return 2 ; // this is the case that we didnt find a zone below the current lowest zone, which means the lowest zone now, will be breakout zone + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool allSupportsAreNormalType(ZoneContainer& zoneContainer) + { + for(int i=0 ; i< zoneContainer.getNumberOfActiveZones() ; i++) + { + if(zoneContainer.getZoneByIndex(i).getType() == "TYPE_SUPPORT_BREAKOUT") + { + return false ; + } + + + } + return true ; + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool allResistancesAreNormalType(ZoneContainer& zoneContainer) + { + + for(int i=0 ; i< zoneContainer.getNumberOfActiveZones() ; i++) + { + if(zoneContainer.getZoneByIndex(i).getType() == "TYPE_RESISTANCE_BREAKOUT") + { + return false ; + } + + + } + return true ; + + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void deleteZoneWithGUI(string _id, ZoneContainer& zoneContainer) + { + + + zoneContainer.deleteZone(_id); + + if(!ObjectDelete(_Symbol,_id)) + { + Print("Failed to delete object error: " + GetLastError()); + } + + + Print("Deleted the zone with gui!"); + + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void deleteZoneGuiOnly(string _id,ZoneContainer& zoneContainer) + { + + + if(!ObjectDelete(_Symbol,_id)) + { + Print("Failed to delete object error: " + GetLastError()); + } + + Print("Deleted the zone gui!"); + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool updateBreakAboveStructureAndDelete(ZoneContainer& zoneContainer, ENUM_TIMEFRAMES timeFrame, string timeFrameStr, double& brokenResistanceLowerEdge, string& type) + { + bool finishedDeleting = false ; + + if(zoneContainer.getNumberOfActiveZones() != 0) // if there are zones found + { + if(marketObserverTiger.candleClosedAboveResistanceByIndex(0,timeFrame,zoneContainer)) // check if candle closed above the zone + { + + + datetime _leftEdgeRestestZone = iTime(_Symbol,timeFrame,4); + datetime _rightEdgeRetestZone = D'2023.11.01 00:00:00'; + + + while(!finishedDeleting && zoneContainer.getNumberOfActiveZones() != 0) // this while is used in the case of a candle closing above more than 1 zone at once + { + + + if(zoneContainer.getNumberOfActiveZones() != 0 && marketObserverTiger.candleClosedAboveResistanceByIndex(0,timeFrame,zoneContainer)) + { + zoneContainer.getZoneByIndex(0).getHigherEdge(); + temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(0).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(0).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame(timeFrameStr); + + type = zoneContainer.getZoneByIndex(0).getType(); + temporaryRestestSupportZone.setType("TYPE_SUPPORT_TEMPORARY"); + + brokenResistanceLowerEdge = zoneContainer.getZoneByIndex(0).getLowerEdge(); // save the lower edge of the broken zone, in order to return it in the parameter + + deleteZoneWithGUI((zoneContainer.getZoneByIndex(0).getId()),zoneContainer); // delete the zone with the GUI + } + else + { + finishedDeleting = true ; + } + + + } + + + return true ; + + } + + + } + return false ; + + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool updateBreakBelowStructureAndDelete(ZoneContainer& zoneContainer, ENUM_TIMEFRAMES timeFrame, string timeFrameStr, double& brokenSupportHigherEdge, string& type) + { + bool finishedDeleting = false ; + + if(zoneContainer.getNumberOfActiveZones() != 0) // if there are zones found + { + + if(marketObserverTiger.candleClosedBelowSupportByIndex(zoneContainer.getNumberOfActiveZones() -1,timeFrame,zoneContainer)) // check if candle closed below the zone + { + + datetime _leftEdgeRestestZone = iTime(_Symbol,timeFrame,4); + datetime _rightEdgeRetestZone = D'2023.11.01 00:00:00'; + + + while(!finishedDeleting && zoneContainer.getNumberOfActiveZones() != 0) // this while is used in the case of a candle closing above more than 1 zone at once + { + + + if(zoneContainer.getNumberOfActiveZones() != 0 && marketObserverTiger.candleClosedBelowSupportByIndex(zoneContainer.getNumberOfActiveZones()-1,timeFrame,zoneContainer)) + { + zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge(); + temporaryRestestSupportZone.setHigherEdgePrice(zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge()); + temporaryRestestSupportZone.setLowerEdgePrice(zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getLowerEdge()); + temporaryRestestSupportZone.setLeftEdge(_leftEdgeRestestZone); + temporaryRestestSupportZone.setRightEdge(_rightEdgeRetestZone); + temporaryRestestSupportZone.setId("9999"); // the + "t" stands for temporary and it is made to keep the zones id's unique + temporaryRestestSupportZone.setTimeFrame(timeFrameStr); + + type = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getType(); + temporaryRestestSupportZone.setType("TYPE_RESISTANCE_TEMPORARY"); + + brokenSupportHigherEdge = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getHigherEdge(); + + deleteZoneWithGUI((zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getId()),zoneContainer); // delete the zone with the GUI + } + else + { + finishedDeleting = true ; + } + + + } + + + return true ; + + + } + + + } + + return false ; + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double findClosestResistancePrice(ZoneContainer& zoneContainer) + { + + double closestResistancePrice = -1; + if(zoneContainer.getNumberOfActiveZones() != 0) + { + + closestResistancePrice = zoneContainer.getZoneByIndex(0).getLowerEdge(); + } + + return closestResistancePrice ; + + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +double findClosestSupportPrice(ZoneContainer& zoneContainer) + { + + double closestSupportPrice = -1 ; + if(zoneContainer.getNumberOfActiveZones() != 0) + { + + closestSupportPrice = zoneContainer.getZoneByIndex(zoneContainer.getNumberOfActiveZones()-1).getLowerEdge(); + } + + return closestSupportPrice ; + + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool buyStopLossUnderZone(double resistanceZoneLowerEdge, double stopLossValue) + { + + if(stopLossValue < resistanceZoneLowerEdge) + { + return true ; + } + else + { + Comment("stop loss is not under the zone im not taking a buy"); + return false ; + + } + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +bool sellStopLossAboveZone(double supportZoneHigherEdge, double stopLossValue) + { + + if(stopLossValue > supportZoneHigherEdge) + { + return true ; + } + else + { + Comment("stop loss is not above the zone, so im not taking a sell"); + return false ; + } + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void manageRiskIfNeeded() + { + + if(PositionsTotal()!= 0) // There is an active trade + { + manageRiskOnBuysIfNeeded(); + manageRiskOnSellsIfNeeded(); + + } + + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void manageRiskOnBuysIfNeeded() + { + if(candleClosedBearish(PERIOD_M15,1) && !bearishCandleIsWeak(PERIOD_M15,1, WICK_RATIO_REJECTION)) + { + + for(int i = 0 ; i < NUM_MAX_ALLOWED_TRADES ; i++) + { + if((BuyActiveTradesArray[i] != NULL) && !(BuyActiveTradesArray[i].riskAlreadyManaged())) // if the trade still hasnt managead risk , then do it now. + { + closePartialFromSpecificPosition(BuyActiveTradesArray[i].getTradeId(),riskManagementPartial); + BuyActiveTradesArray[i].manageRisk(); + } + } + + } + + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void manageRiskOnSellsIfNeeded() + { + + if(candleClosedBullish(PERIOD_M15,1) && !bullishCandleIsWeak(PERIOD_M15,1, WICK_RATIO_REJECTION)) + { + for(int i = 0 ; i < NUM_MAX_ALLOWED_TRADES ; i++) + { + if((SellActiveTradesArray[i] != NULL) && !(SellActiveTradesArray[i].riskAlreadyManaged())) // if the trade still hasnt managead risk , then do it now. + { + closePartialFromSpecificPosition(SellActiveTradesArray[i].getTradeId(),riskManagementPartial); + SellActiveTradesArray[i].manageRisk(); + } + } + + } + } + + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void secureProfitIfNeeded() + { + + if(PositionsTotal() != 0) // if there are active trades + { + + secureProfitOnBuysIfNeeded(); + secureProfitOnSellsIfNeeded(); + + } + + } + + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void secureProfitOnBuysIfNeeded() + { + + for(int i=0 ; i< NUM_MAX_ALLOWED_TRADES ; i++) + { + + if((BuyActiveTradesArray[i] != NULL) && !(BuyActiveTradesArray[i].firstPartialIsSecured())) // if first partial is not yet secured for the current position + { + + double currentProfit = positionProfitInPips(BuyActiveTradesArray[i].getTradeId()); + if(currentProfit >= firstPartialProfitInPips) + { + closePartialFromSpecificPosition(BuyActiveTradesArray[i].getTradeId(),firstPartialCloseFactor) ; + BuyActiveTradesArray[i].secureFirstPartial(); + } + + } + } + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +void secureProfitOnSellsIfNeeded() + { + + for(int i=0 ; i< NUM_MAX_ALLOWED_TRADES ; i++) + { + + if((SellActiveTradesArray[i] != NULL) && !(SellActiveTradesArray[i].firstPartialIsSecured())) // if first partial is not yet secured for the current position + { + + double currentProfit = positionProfitInPips(SellActiveTradesArray[i].getTradeId()); + if(currentProfit >= firstPartialProfitInPips) + { + closePartialFromSpecificPosition(SellActiveTradesArray[i].getTradeId(),firstPartialCloseFactor) ; + SellActiveTradesArray[i].secureFirstPartial(); + } + } + } + } + + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int findAvailableSpotInBuyManagerArr() // returns the index , or -1 if all are full + { + + for(int i=0 ; i < NUM_MAX_ALLOWED_TRADES ; i++) + { + if(BuyActiveTradesArray[i] == NULL) + { + return i; + + } + + } + return -1 ; + } + +//+------------------------------------------------------------------+ +//| | +//+------------------------------------------------------------------+ +int findAvailableSpotInSellManagerArr() // returns the index , or -1 if all are full + { + + for(int i=0 ; i positionStopLoss(BuyActiveTradesArray[i].getTradeId())) // if new stop loss is higher than the current position's stop loss + { + positionTrailStopLoss(BuyActiveTradesArray[i].getTradeId(),newStopLoss,0); + } + } + + + + if((SellActiveTradesArray[i] != NULL)) // CHECK TRAIL FOR SELLS + { + double newStopLoss = iHigh(_Symbol,_timeFrame,1); + newStopLoss = newStopLoss + stopLossAboveWickBy ; + if(newStopLoss < positionStopLoss(SellActiveTradesArray[i].getTradeId())) // if new stop loss is lower than the current position's stop loss + { + positionTrailStopLoss(SellActiveTradesArray[i].getTradeId(),newStopLoss,0); + } + } + + + + + } + } +//+------------------------------------------------------------------+ diff --git a/TigerWicksOnly.ex5 b/TigerWicksOnly.ex5 new file mode 100644 index 0000000000000000000000000000000000000000..a35b8ce98775c81123bd51c3265302f4951739e2 GIT binary patch literal 73358 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

    s@icHe#}FgP6paHDT1E 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 z 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

  • o)G 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