From 4b7fe917554c2f5c300db3fa2b14b39ebbf5fb8b Mon Sep 17 00:00:00 2001 From: CristianAlam <91946810+CristianAlam@users.noreply.github.com> Date: Sat, 12 Jul 2025 19:32:16 +0300 Subject: [PATCH] Delete shark_tiger directory --- shark_tiger/Algo_Skeleton_Functions.mqh | 1958 --------------------- shark_tiger/Breakout_Fractals.ex5 | Bin 66390 -> 0 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 80262 -> 0 bytes shark_tiger/Entries_Newest.mq5 | 333 ---- shark_tiger/Gandalf.ex5 | Bin 30574 -> 0 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 97590 -> 0 bytes shark_tiger/NewGenTest.mq5 | 1643 ----------------- shark_tiger/ObjectConfirmationUnit.mqh | 50 - shark_tiger/Phoenix_Functions.mqh | 618 ------- shark_tiger/Phoenix_Reborn.ex5 | Bin 33828 -> 0 bytes shark_tiger/Phoenix_Reborn.mq5 | 201 --- shark_tiger/Point_Value_Testing.ex5 | Bin 6804 -> 0 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 46688 -> 0 bytes shark_tiger/Tiger.mq5 | 601 ------- shark_tiger/TigerEntryTaker.ex5 | Bin 51062 -> 0 bytes shark_tiger/TigerEntryTaker.mq5 | 1023 ----------- shark_tiger/TigerEntryTakerNew.ex5 | Bin 56044 -> 0 bytes shark_tiger/TigerEntryTakerNew.mq5 | 1161 ------------ shark_tiger/TigerEntryTakerNewGen.ex5 | Bin 56532 -> 0 bytes shark_tiger/TigerEntryTakerNewGen.mq5 | 1060 ----------- shark_tiger/TigerEntryTakerNewGenNext.mq5 | 1274 -------------- shark_tiger/TigerNewFeature.ex5 | Bin 72656 -> 0 bytes shark_tiger/TigerNewFeature.mq5 | 1442 --------------- shark_tiger/TigerObserver.ex5 | Bin 34970 -> 0 bytes shark_tiger/TigerObserver.mq5 | 694 -------- shark_tiger/TigerWicksIncluded.ex5 | Bin 70946 -> 0 bytes shark_tiger/TigerWicksIncluded.mq5 | 1465 --------------- shark_tiger/TigerWicksOnly.ex5 | Bin 73358 -> 0 bytes shark_tiger/TigerWicksOnly.mq5 | 443 ----- shark_tiger/TigerZonesComplete.mq5 | 423 ----- shark_tiger/Tiger_Entries_4H.ex5 | Bin 74164 -> 0 bytes shark_tiger/Tiger_Entries_4H.mq5 | 232 --- shark_tiger/TrendBreakouts.ex5 | Bin 33786 -> 0 bytes shark_tiger/TrendBreakouts.mq5 | 182 -- shark_tiger/Zone.mqh | 341 ---- shark_tiger/ZoneContainer.mqh | 686 -------- shark_tiger/ZoneRejectionOneCandle.ex5 | Bin 161346 -> 0 bytes shark_tiger/ZoneRejectionOneCandle.mq5 | 1651 ----------------- shark_tiger/ZoneRjectionTest4H.ex5 | Bin 159958 -> 0 bytes shark_tiger/ZoneRjectionTest4H.mq5 | 1642 ----------------- shark_tiger/candleStringDetector.ex5 | Bin 29468 -> 0 bytes shark_tiger/candleStringDetector.mq5 | 98 -- shark_tiger/library_functions.mqh | 765 -------- 72 files changed, 30920 deletions(-) delete mode 100644 shark_tiger/Algo_Skeleton_Functions.mqh delete mode 100644 shark_tiger/Breakout_Fractals.ex5 delete mode 100644 shark_tiger/Breakout_Fractals.mq5 delete mode 100644 shark_tiger/BuyEntryManager.mqh delete mode 100644 shark_tiger/BuyGandalf.mqh delete mode 100644 shark_tiger/BuyRejectionDetector.mqh delete mode 100644 shark_tiger/BuyTradeManager.mqh delete mode 100644 shark_tiger/BuyTradeManagerTiger.mqh delete mode 100644 shark_tiger/Entries_Newest.ex5 delete mode 100644 shark_tiger/Entries_Newest.mq5 delete mode 100644 shark_tiger/Gandalf.ex5 delete mode 100644 shark_tiger/Gandalf.mq5 delete mode 100644 shark_tiger/GeneralTests.mq5 delete mode 100644 shark_tiger/GraphicalObjectsManager.mqh delete mode 100644 shark_tiger/HighFractal.mqh delete mode 100644 shark_tiger/HighFractalContainer.mqh delete mode 100644 shark_tiger/LotSizeCalculator.mqh delete mode 100644 shark_tiger/LowFractal.mqh delete mode 100644 shark_tiger/LowFractalContainer.mqh delete mode 100644 shark_tiger/MarketObserver.mqh delete mode 100644 shark_tiger/MarketObserverTiger.mqh delete mode 100644 shark_tiger/NewCandleDetector.mqh delete mode 100644 shark_tiger/NewGenTest.ex5 delete mode 100644 shark_tiger/NewGenTest.mq5 delete mode 100644 shark_tiger/ObjectConfirmationUnit.mqh delete mode 100644 shark_tiger/Phoenix_Functions.mqh delete mode 100644 shark_tiger/Phoenix_Reborn.ex5 delete mode 100644 shark_tiger/Phoenix_Reborn.mq5 delete mode 100644 shark_tiger/Point_Value_Testing.ex5 delete mode 100644 shark_tiger/Point_Value_Testing.mq5 delete mode 100644 shark_tiger/PositionEntryTest.mq5 delete mode 100644 shark_tiger/SellEntryManager.mqh delete mode 100644 shark_tiger/SellGandalf.mqh delete mode 100644 shark_tiger/SellRejectionDetector.mqh delete mode 100644 shark_tiger/SellTradeManager.mqh delete mode 100644 shark_tiger/SellTradeManagerTiger.mqh delete mode 100644 shark_tiger/SellTradeMangerTiger.mqh delete mode 100644 shark_tiger/Shark.mq5 delete mode 100644 shark_tiger/Shark_tester.mq5 delete mode 100644 shark_tiger/TempLineObjectAttributes.mqh delete mode 100644 shark_tiger/TempObjectAttributes.mqh delete mode 100644 shark_tiger/Tiger.ex5 delete mode 100644 shark_tiger/Tiger.mq5 delete mode 100644 shark_tiger/TigerEntryTaker.ex5 delete mode 100644 shark_tiger/TigerEntryTaker.mq5 delete mode 100644 shark_tiger/TigerEntryTakerNew.ex5 delete mode 100644 shark_tiger/TigerEntryTakerNew.mq5 delete mode 100644 shark_tiger/TigerEntryTakerNewGen.ex5 delete mode 100644 shark_tiger/TigerEntryTakerNewGen.mq5 delete mode 100644 shark_tiger/TigerEntryTakerNewGenNext.mq5 delete mode 100644 shark_tiger/TigerNewFeature.ex5 delete mode 100644 shark_tiger/TigerNewFeature.mq5 delete mode 100644 shark_tiger/TigerObserver.ex5 delete mode 100644 shark_tiger/TigerObserver.mq5 delete mode 100644 shark_tiger/TigerWicksIncluded.ex5 delete mode 100644 shark_tiger/TigerWicksIncluded.mq5 delete mode 100644 shark_tiger/TigerWicksOnly.ex5 delete mode 100644 shark_tiger/TigerWicksOnly.mq5 delete mode 100644 shark_tiger/TigerZonesComplete.mq5 delete mode 100644 shark_tiger/Tiger_Entries_4H.ex5 delete mode 100644 shark_tiger/Tiger_Entries_4H.mq5 delete mode 100644 shark_tiger/TrendBreakouts.ex5 delete mode 100644 shark_tiger/TrendBreakouts.mq5 delete mode 100644 shark_tiger/Zone.mqh delete mode 100644 shark_tiger/ZoneContainer.mqh delete mode 100644 shark_tiger/ZoneRejectionOneCandle.ex5 delete mode 100644 shark_tiger/ZoneRejectionOneCandle.mq5 delete mode 100644 shark_tiger/ZoneRjectionTest4H.ex5 delete mode 100644 shark_tiger/ZoneRjectionTest4H.mq5 delete mode 100644 shark_tiger/candleStringDetector.ex5 delete mode 100644 shark_tiger/candleStringDetector.mq5 delete mode 100644 shark_tiger/library_functions.mqh diff --git a/shark_tiger/Algo_Skeleton_Functions.mqh b/shark_tiger/Algo_Skeleton_Functions.mqh deleted file mode 100644 index c4c345a..0000000 --- a/shark_tiger/Algo_Skeleton_Functions.mqh +++ /dev/null @@ -1,1958 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/Breakout_Fractals.ex5 b/shark_tiger/Breakout_Fractals.ex5 deleted file mode 100644 index 5c267c41a5ef05f0391b0370417b429dec9e43e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66390 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 I>`W{F4T<%Q+W-In diff --git a/shark_tiger/Breakout_Fractals.mq5 b/shark_tiger/Breakout_Fractals.mq5 deleted file mode 100644 index faad5b5..0000000 --- a/shark_tiger/Breakout_Fractals.mq5 +++ /dev/null @@ -1,404 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/BuyGandalf.mqh b/shark_tiger/BuyGandalf.mqh deleted file mode 100644 index f802a88..0000000 --- a/shark_tiger/BuyGandalf.mqh +++ /dev/null @@ -1,85 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/BuyRejectionDetector.mqh b/shark_tiger/BuyRejectionDetector.mqh deleted file mode 100644 index 91f0fc3..0000000 --- a/shark_tiger/BuyRejectionDetector.mqh +++ /dev/null @@ -1,53 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/BuyTradeManager.mqh b/shark_tiger/BuyTradeManager.mqh deleted file mode 100644 index 9ff3bc9..0000000 --- a/shark_tiger/BuyTradeManager.mqh +++ /dev/null @@ -1,592 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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 - //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); - 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 - //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(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 - //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 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/shark_tiger/BuyTradeManagerTiger.mqh b/shark_tiger/BuyTradeManagerTiger.mqh deleted file mode 100644 index d9295ba..0000000 --- a/shark_tiger/BuyTradeManagerTiger.mqh +++ /dev/null @@ -1,72 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/Entries_Newest.ex5 b/shark_tiger/Entries_Newest.ex5 deleted file mode 100644 index 33fa53c3124f1e3c0f2be7cf3d8525eb2af85963..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80262 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 z 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 I6yg5=2Wo3f$p8QV diff --git a/shark_tiger/Entries_Newest.mq5 b/shark_tiger/Entries_Newest.mq5 deleted file mode 100644 index 1b205b9..0000000 --- a/shark_tiger/Entries_Newest.mq5 +++ /dev/null @@ -1,333 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/Gandalf.ex5 b/shark_tiger/Gandalf.ex5 deleted file mode 100644 index cc7a2bc36ed13c0e597607fed60b8b3e8b5b1c51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30574 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 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/shark_tiger/GeneralTests.mq5 b/shark_tiger/GeneralTests.mq5 deleted file mode 100644 index c57d650..0000000 --- a/shark_tiger/GeneralTests.mq5 +++ /dev/null @@ -1,1668 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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); - - 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/shark_tiger/GraphicalObjectsManager.mqh b/shark_tiger/GraphicalObjectsManager.mqh deleted file mode 100644 index 73c2cc8..0000000 --- a/shark_tiger/GraphicalObjectsManager.mqh +++ /dev/null @@ -1,1076 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/HighFractal.mqh b/shark_tiger/HighFractal.mqh deleted file mode 100644 index 8fea724..0000000 --- a/shark_tiger/HighFractal.mqh +++ /dev/null @@ -1,254 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/HighFractalContainer.mqh b/shark_tiger/HighFractalContainer.mqh deleted file mode 100644 index 07321ae..0000000 --- a/shark_tiger/HighFractalContainer.mqh +++ /dev/null @@ -1,131 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/LowFractal.mqh b/shark_tiger/LowFractal.mqh deleted file mode 100644 index 96244f9..0000000 --- a/shark_tiger/LowFractal.mqh +++ /dev/null @@ -1,255 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/LowFractalContainer.mqh b/shark_tiger/LowFractalContainer.mqh deleted file mode 100644 index e343409..0000000 --- a/shark_tiger/LowFractalContainer.mqh +++ /dev/null @@ -1,137 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/MarketObserverTiger.mqh b/shark_tiger/MarketObserverTiger.mqh deleted file mode 100644 index 17a709b..0000000 --- a/shark_tiger/MarketObserverTiger.mqh +++ /dev/null @@ -1,105 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/NewCandleDetector.mqh b/shark_tiger/NewCandleDetector.mqh deleted file mode 100644 index 678a7b4..0000000 --- a/shark_tiger/NewCandleDetector.mqh +++ /dev/null @@ -1,378 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/NewGenTest.ex5 b/shark_tiger/NewGenTest.ex5 deleted file mode 100644 index 26600d19c789967784d57e0aafa8036ed8305841..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97590 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 U;2V)#fKrgxlv|jpNulkqO)?q1%K!iX diff --git a/shark_tiger/NewGenTest.mq5 b/shark_tiger/NewGenTest.mq5 deleted file mode 100644 index 49d1571..0000000 --- a/shark_tiger/NewGenTest.mq5 +++ /dev/null @@ -1,1643 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/ObjectConfirmationUnit.mqh b/shark_tiger/ObjectConfirmationUnit.mqh deleted file mode 100644 index 7ffdd76..0000000 --- a/shark_tiger/ObjectConfirmationUnit.mqh +++ /dev/null @@ -1,50 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/Phoenix_Functions.mqh b/shark_tiger/Phoenix_Functions.mqh deleted file mode 100644 index ba50e5c..0000000 --- a/shark_tiger/Phoenix_Functions.mqh +++ /dev/null @@ -1,618 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/Phoenix_Reborn.ex5 b/shark_tiger/Phoenix_Reborn.ex5 deleted file mode 100644 index fb050220c53dd0111462420bf6341514bfcbab92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33828 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

QGLyl`Yv%X#G~9}P5Jqa6V`P1${#I0~X=Gz`>I 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 diff --git a/shark_tiger/TigerWicksIncluded.mq5 b/shark_tiger/TigerWicksIncluded.mq5 deleted file mode 100644 index c4709b3..0000000 --- a/shark_tiger/TigerWicksIncluded.mq5 +++ /dev/null @@ -1,1465 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/TigerWicksOnly.ex5 b/shark_tiger/TigerWicksOnly.ex5 deleted file mode 100644 index a35b8ce98775c81123bd51c3265302f4951739e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73358 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

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

o)G 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 - - - -// 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 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/shark_tiger/SellEntryManager.mqh b/shark_tiger/SellEntryManager.mqh deleted file mode 100644 index 85f3e8d..0000000 --- a/shark_tiger/SellEntryManager.mqh +++ /dev/null @@ -1,119 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/SellGandalf.mqh b/shark_tiger/SellGandalf.mqh deleted file mode 100644 index a1c0560..0000000 --- a/shark_tiger/SellGandalf.mqh +++ /dev/null @@ -1,79 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/SellRejectionDetector.mqh b/shark_tiger/SellRejectionDetector.mqh deleted file mode 100644 index a51b7f9..0000000 --- a/shark_tiger/SellRejectionDetector.mqh +++ /dev/null @@ -1,52 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/SellTradeManager.mqh b/shark_tiger/SellTradeManager.mqh deleted file mode 100644 index 8ab5681..0000000 --- a/shark_tiger/SellTradeManager.mqh +++ /dev/null @@ -1,586 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/SellTradeManagerTiger.mqh b/shark_tiger/SellTradeManagerTiger.mqh deleted file mode 100644 index ce5dfdd..0000000 --- a/shark_tiger/SellTradeManagerTiger.mqh +++ /dev/null @@ -1,69 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/SellTradeMangerTiger.mqh b/shark_tiger/SellTradeMangerTiger.mqh deleted file mode 100644 index 0a82a3b..0000000 --- a/shark_tiger/SellTradeMangerTiger.mqh +++ /dev/null @@ -1,29 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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_tiger/Shark.mq5 b/shark_tiger/Shark.mq5 deleted file mode 100644 index 1074547..0000000 --- a/shark_tiger/Shark.mq5 +++ /dev/null @@ -1,846 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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_tiger/Shark_tester.mq5 b/shark_tiger/Shark_tester.mq5 deleted file mode 100644 index d89ba7c..0000000 --- a/shark_tiger/Shark_tester.mq5 +++ /dev/null @@ -1,1191 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/TempLineObjectAttributes.mqh b/shark_tiger/TempLineObjectAttributes.mqh deleted file mode 100644 index c878c48..0000000 --- a/shark_tiger/TempLineObjectAttributes.mqh +++ /dev/null @@ -1,40 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/TempObjectAttributes.mqh b/shark_tiger/TempObjectAttributes.mqh deleted file mode 100644 index 99949d1..0000000 --- a/shark_tiger/TempObjectAttributes.mqh +++ /dev/null @@ -1,81 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/Tiger.ex5 b/shark_tiger/Tiger.ex5 deleted file mode 100644 index 0c85b19d30e93e70cad04bedf10394376076074b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46688 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 C4ub>$ diff --git a/shark_tiger/Tiger.mq5 b/shark_tiger/Tiger.mq5 deleted file mode 100644 index d88c67c..0000000 --- a/shark_tiger/Tiger.mq5 +++ /dev/null @@ -1,601 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/TigerEntryTaker.ex5 b/shark_tiger/TigerEntryTaker.ex5 deleted file mode 100644 index 5ac2f28c560e7ed71d140b046ff1fe68981dc2e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51062 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 NPr_|e)#aX?jsLyF85sZo diff --git a/shark_tiger/TigerEntryTaker.mq5 b/shark_tiger/TigerEntryTaker.mq5 deleted file mode 100644 index d9e0ccb..0000000 --- a/shark_tiger/TigerEntryTaker.mq5 +++ /dev/null @@ -1,1023 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/TigerEntryTakerNew.ex5 b/shark_tiger/TigerEntryTakerNew.ex5 deleted file mode 100644 index 711e298d4e90b04049caa38b6d9b1ebc1f455694..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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/shark_tiger/TigerEntryTakerNewGen.ex5 b/shark_tiger/TigerEntryTakerNewGen.ex5 deleted file mode 100644 index c99f2ca61d264ff48a0f9ea48737fed57be5af5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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/shark_tiger/TigerEntryTakerNewGenNext.mq5 b/shark_tiger/TigerEntryTakerNewGenNext.mq5 deleted file mode 100644 index 1ac04eb..0000000 --- a/shark_tiger/TigerEntryTakerNewGenNext.mq5 +++ /dev/null @@ -1,1274 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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 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; - -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)); - - - } - -//+------------------------------------------------------------------+ -//| | -//+------------------------------------------------------------------+ - 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/shark_tiger/TigerNewFeature.ex5 b/shark_tiger/TigerNewFeature.ex5 deleted file mode 100644 index 7618eab4c56b5f8b34cabedef50a7ba1677823c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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/shark_tiger/TigerObserver.ex5 b/shark_tiger/TigerObserver.ex5 deleted file mode 100644 index 2f57dcf68bed07756da403abee0fdbce52dfb226..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34970 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 diff --git a/shark_tiger/TigerObserver.mq5 b/shark_tiger/TigerObserver.mq5 deleted file mode 100644 index 8205be0..0000000 --- a/shark_tiger/TigerObserver.mq5 +++ /dev/null @@ -1,694 +0,0 @@ -//+------------------------------------------------------------------+ -//| 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/shark_tiger/TigerWicksIncluded.ex5 b/shark_tiger/TigerWicksIncluded.ex5 deleted file mode 100644 index 9e798a6224acbe45c5e34a78388300bbb9d5cc85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70946 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