diff --git a/Classes/x-saherelm.x-alert.class.mq5 b/Classes/x-saherelm.x-alert.class.mq5 index c92a6d59..227c74d7 100644 --- a/Classes/x-saherelm.x-alert.class.mq5 +++ b/Classes/x-saherelm.x-alert.class.mq5 @@ -228,7 +228,7 @@ class XCAlert : public XCBase // // Send an Alert by Handling all Different Specified // type's of Alert's if they are Enabled ... - void Alert(string message) + void SendAlert(string message) { // // Handle Log, if Enabled ... @@ -1505,9 +1505,9 @@ class XCBaseAlert : public XCBase // // Send an Alert by Handling all Different Specified // type's of Alert's if they are Enabled ... - void Alert(string message) + void SendAlert(string message) { - mAlert.Alert(message); + mAlert.SendAlert(message); } // diff --git a/Documents/BKP/catb.test.ea.tmp.mq5 b/Documents/BKP/catb.test.ea.tmp.mq5 new file mode 100644 index 00000000..f486dd5c --- /dev/null +++ b/Documents/BKP/catb.test.ea.tmp.mq5 @@ -0,0 +1,942 @@ +/////////////////////////////////////////////////////// +// +// SaherElm IT Center XCATB MQL5 Expert Advisor +// ------------------------------------------------- +// Name: XCAEA +// Description: an Exper Advisor which used XCATB +// +// Maintainer: +// ------------ +// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) +// +////////////////////////////////////////////////////// +// +// Global Properties ... +#property copyright "Copyright 2023, SaherElm IT Center" +#property link "https://saherelm.ir" +#property version "1.00" +#property description "EA based on X121 XCATB indicator" +#property strict + +// +// Include Common Library ... +#include "../Classes/x-saherelm.x-alert.class.mq5" +#include "../Classes/x-saherelm.x-trade.class.mq5" +#include "../Classes/x-saherelm.x-volume.class.mq5" +#include "../Helpers/x-saherelm.x121.xcatb.helper.mq5" +#include "../Libraries/x-saherelm.common.lib.mq5" +#include "../Libraries/x-saherelm.x121.xcatb.lib.mq5" +#include "../XCAEA/Classes/xcaea.x-trade.manager.class.mq5" + +// +#define ShortName "XCATB_EA" + +// +// Inputs ... + +// +// Common ... +input group "Common"; +input long eaMagicNumber = 78692110; // Magic Number +input int eaSlippage = 10; // Slippgae +input string eaLogSuffix = ""; // Log Suffix + +// +// Detector ... +input group "Detector"; + +// +// Validating ... +input group "Validations"; +input bool eaForceHasSwing = false; // Force Blocks to Have Swing +input bool eaForceObBarType = false; // Force Block Has Reversal Bar +input bool eaForceOBFVGBarType = false; // Force FVG Has Same Bars +input bool eaForceHasFLiquidity = false; // Force Blocks to Have Following Liquidity +input bool eaForceHasRLiquidity = false; // Force Blocks to Have Reversal Liquidity +input bool eaValidateGapSequence = false; // Validate Block's Gap Sequence +input bool eaValidateBlockEdgeBreakout = false; // Validate Block's Edge Breakout + +// +// Filtering ... +input group "Filters"; +input bool eaFilterBasedOnPV = false; // Filter Based on Peak and Vale +input bool eaFilterBasedOnSar = false; // Filter Based on Sar +input bool eaFilterBasedOnRSI = false; // Filter Based on RSI +input bool eaFilterBasedOnADX = false; // Filter Based on ADX +input bool eaFilterBasedOnATR = false; // Filter Based on ATR +input bool eaFilterBasedOnTrend = false; // Filter Based on Trend +input bool eaFilterBasedOnDelta = false; // Filter Based on Delta +input bool eaFilterBasedOnVolume = false; // Filter Based on Volume +input bool eaFilterBasedOnSignalBar = false; // Filter Based on Signal Bar +input bool eaFilterBasedOnHKSignalBar = false; // Filter Based on Hiken Ashi Signal Bar + +// +// Signal ... +input group "Signal"; +input int eaSignalR2R = 3; // Risk Reward Ratio +input double eaSLAtrMultiplier = 0.5; // ATR Multiplier for SL + +// +// Volume ... +input group "Volume"; +input ENUM_X_VOLUME_SELECT_TYPE eaVolumeSelect = X_VOLUME_EQUITY; // Volume Applying Type +input double eaStaticVoluem = 0.0; // Static Volume +input double eaDynamicVolumeStepBalance = 0.0; // Step of Balance for Increase Volume +input double eaDynamicVolumeStepVolume = X_MIN_VOLUME; // Step of Volume Increasing +input double eaConstantRiskBalance = 0.0; // Constant Risk Balance per Trade +input double eaConstantPercent = 0.5; // Constant Percent of Balance Per Trade +input double eaConstantBalance = 0.0; // Constant Balance for Calculations + +// +// Management ... +input group "Management"; +input bool eaAllowTrade = true; // Allow Trade on Signals +input bool eaAllowLongs = true; // Allow Long Trades +input bool eaAllowShorts = true; // Allow Short Trades +input ENUM_XCAEA_TRADE_RESTRICTION_PERIOD eaRestrictionsPeriod = XCAEA_TRADE_RESTRICATION_NONE; // Trade Restrictions Period +input int eaMaxAllowedTPs = 0; // Max Allowed TP(s) per Day +input int eaMaxAllowedSLs = 0; // Max Allowed SL(s) per Day +input int eaMaxAllowedTrades = 0; // Max Allowed Trades per Day +input int eaMaxAllowedPositions = 5; // Max Allowed Same Time Trades +input double eaMaxAllowedSpread = 25; // Max Allowed Spread For Trade +input double eaMaxAllowedDrawdownFactor = 0.3; // Max Allowed DrawDown for Trade +input string eaCloseAllOpenTradesAt = ""; // Close All Open Trades per Day At Specified Time + +// +// Alert ... +// Here we Provider All Requirements for +// Configuring Alert Provider ... +input group "Alert"; +input bool eaEnableAlerts = true; // Enable Alerts +input bool eaLogAlerts = true; // Log Alerts +input bool eaMailAlerts = false; // Mail Alerts +input bool eaPushAlerts = true; // Push Alerts +input bool eaTerminalAlerts = true; // Terminal Alerts + +// +// Time Report ... +input group "Reports"; +input bool eaReportNewMonths = false; // Report New Month +input bool eaReportNewWeeks = false; // Report New Weeks +input bool eaReportNewDays = true; // Report New Days +input bool eaReportNewHours = false; // Report New Hours +input bool eaReportTrades = true; // Report Trades +input bool eaReportSignals = true; // Report Signals +input bool eaReportProtector = true; // Report Protector Actions +input bool eaReportAfterTradesBalance = true; // Report Balance after a Trade Finished + +// +// Variables ... + +// +XCAlert *eaAlert; +XCTrade *eaTrade; +XSignal eaSignal; +XCVolume *eaVolume; +X121XCatbInputs eaInputs; +XCX121XCatbHelper *eaHelper; +XBarTracker eaBarTraker; +XTimeTracker eaTimeTracker; +XCXCAEATradeManager *eaTradeManager; +XCAEAStrategyConditions eaConditions; + +// +XTriggerBlock eaTB; + +// +CArrayObj *eaObjects; + +// +string eaTag = ""; + +// +// Event Handlers ... + +// +// Initialization ... +int OnInit() +{ + // + // Validate Inputs and Required Parameters + // for EA to Works fine ... + if (!ValidateInputs()) + { + return INIT_PARAMETERS_INCORRECT; + } + + // + // Initial Requirements ... + InitRequirements(); + + // + // Initialize Volume Manger ... + if (!InitVolume()) + { + return INIT_FAILED; + } + + // + return (INIT_SUCCEEDED); +} + +// +// DeInitialization ... +void OnDeinit(const int reason) +{ + // + // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function + // REASON_REMOVE 1 Program removed from a chart + // REASON_RECOMPILE 2 Program recompiled + // REASON_CHARTCHANGE 3 A symbol or a chart period is changed + // REASON_CHARTCLOSE 4 Chart closed + // REASON_PARAMETERS 5 Inputs changed by a user + // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings + // REASON_TEMPLATE 7 Another chart template applied + // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value + // REASON_CLOSE 9 Terminal closed + + // + // eaObjects.Clear(); + + // + delete eaHelper; + ZeroMemory(eaHelper); + + // + delete eaAlert; + ZeroMemory(eaAlert); + + // + delete eaTrade; + ZeroMemory(eaTrade); + + // + delete eaVolume; + ZeroMemory(eaVolume); + + // + eaSignal.Clean(); + eaBarTraker.Clean(); + eaConditions.Clean(); + eaTimeTracker.Clean(); + + // + DestroyTimer(); +} + +// +// On Tick Handler ... +void OnTick() +{ + // + HandleTimeReport(); + + // + // Handle Position Management / Protections ... + // eaTradeManager.Manage(); + + // // + // eaSignal.Clean(); + // eaConditions.Clean(); + + // + // Check Bar Processing ... + if (!eaBarTraker.CanProcessBar()) + { + return; + } + + // + bool has = false; + + // + // Retrieve Bars ... + // XOHCL zBar; + // XOHCL cBar; + // has = zBar.Init( + // _Symbol, + // _Period, + // 0 // + // ); + // has = + // has && + // zBar.GetPreviousBar(cBar); + // if (!has) + // { + // // + // zBar.Clean(); + // cBar.Clean(); + + // // + // return; + // } + + // + // double bid = GetBid(zBar.symbol); + + // + // XTriggerBlock iTB; + // has = GetNewestX121TriggerBlock( + // _Symbol, + // _Period, + // iTB // + // ); + // if (has) + // { + // // + // // Check Newest TB is Newer Than Exists TB ... + // bool canPass = + // !eaTB.IsValid() + // ? true + // : iTB.ToIndex() < eaTB.ToIndex(); + // if (canPass) + // { + // // + // eaTB = iTB; + // eaSignal = iTB.signal; + + // // + // // Prepare eaConditions if Reuqired ... + // } + // } + + // + // has = eaSignal.IsValid(); + // if (has) + // { + // // + // // Here we ensure which has a New Signal and must + // // prepare and Execute it ... + // Print("new Signal Detected ..."); + // } + + // + // eaTB.Clean(); + // zBar.Clean(); + // cBar.Clean(); + // eaSignal.Clean(); + // eaConditions.Clean(); +} + +// +// Handle On Trade Event ... +void OnTrade() +{ + eaTrade.HandleOnTrade(); +} + +// +// On Timer ... +void OnTimer() +{ +} + +// +// Chart Event Handler ... +void OnChartEvent( + const int id, + const long &lparam, + const double &dparam, + const string &sparam // +) +{ +} + +// +// Event Listeners ... + +/** + * Handle StopLoss Triggered Positions ... + * + * @param deal: XDeal instance ... + */ +void OnStopLossTriggered(const XDeal &deal) +{ + eaTradeManager.HandleSL(deal); +} + +/** + * Handle Take Profit Triggered Positions ... + * + * @param deal: XDeal instance ... + */ +void OnTakeProfitTriggered(const XDeal &deal) +{ + eaTradeManager.HandleTP(deal); +} + +/** + * Handle Force Close a Position ... + * + * @param ticket: ULONG ... + * @param position: XPosition instance ... + * @param comment: string ... + */ +void OnPositionForceClosed( + const ulong ticket, + const XPosition &position, + const string comment // +) +{ + eaTradeManager.HandleForceClose(position); +} + +/** + * Handle Position Partially Closed Event ... + * + * @param ticket: ULONG ... + * @param profit: double ... + * @param comment: string ... + */ +void OnPositionPartiallyClosed( + const ulong ticket, + const double profit, + const string comment // +) +{ + eaTradeManager.HandlePartiallyClosed( + ticket, + profit, + comment // + ); +} + +/** + * Handle Deals Changes ... + * + * @param count: Integer, Number of Changes ... + */ +void OnDealsChanged(int count) +{ +} + +/** + * Handle Orders Changes ... + * + * @param count: Integer, Number of Changes ... + */ +void OnOrdersChanged(int count) +{ +} + +/** + * Handle Positions Changes ... + * + * @param count: Integer, Number of Changes ... + */ +void OnPositionsChanged(int count) +{ +} + +// +// Custom Functions ... + +/** + * Validate all Inputs of Expert Adviser ... + * + * @return ( bool ) + */ +bool ValidateInputs() +{ + // + bool result = false; + + // + string errMessage = ""; + + // + bool isCommonValid = ( + // + eaSlippage > 0 && + eaMagicNumber > 0 + // + ); + if (!isCommonValid) + { + // + errMessage += "common configurations error;" + "\n"; + } + + // + result = + // + // Common ... + isCommonValid && + // + // Otere ... + true + // + ; + + // + if (!result) + { + // + // Since here Logger not Initiallized, we Use Raw Print Command ... + Print(ShortName + " Errors: \n", errMessage); + } + + // + return result; +} + +/** + * Initialize Timer ... + * + * @return ( bool ) + */ +bool InitTimer() +{ + // + bool result = false; + + // + // TODO: Initialize Timer if necessary ... + // result = EventSetTimer(1); + // result = EventSetMillisecondTimer(100); + result = true; + + // + return result; +} + +/** + * Destroy Timer ... + */ +void DestroyTimer() +{ + // + // TODO: Use This ... + // EventKillTimer(); +} + +/** + * Initial Volume Manager Class Based on Given Configuration ... + * + * @return ( bool ) + */ +bool InitVolume() +{ + // + bool result = false; + + // + eaVolume = new XCVolume(); + + // + result = eaVolume.Init( + eaVolumeSelect, + eaStaticVoluem, + eaDynamicVolumeStepBalance, + eaDynamicVolumeStepVolume, + eaConstantRiskBalance, + eaConstantPercent, + eaConstantBalance // + ); + + // + return result; +} + +/** + * Initial Requirements of EA ... + */ +void InitRequirements() +{ + // + // Initial Bar Tracker ... + eaBarTraker.Init( + _Symbol, + _Period // + ); + + // + // Preparing Tags ... + eaTag = + (IsValid(eaLogSuffix) + ? eaLogSuffix + "_" + : "") + + ShortName; + + // + eaAlert = new XCAlert(); + eaAlert.SetPrefix(eaLogSuffix); + eaAlert.SetLogAlerts(eaLogAlerts); + eaAlert.SetMailAlerts(eaMailAlerts); + eaAlert.SetPushAlerts(eaPushAlerts); + eaAlert.SetEnableAlerts(eaEnableAlerts); + eaAlert.SetTerminalAlerts(eaTerminalAlerts); + + // + // Objects ... + eaObjects = new CArrayObj(); + + // + // Configure XCA ... + eaInputs.Default(); + + // + // Hide all Visible Buffers ... + eaInputs.Hide(); + + // + // we Can make Show all requirements here ... + + // + eaInputs.showATRBand = true; + + // // + // // Signal ... + // eaInputs.signalR2R = eaSignalR2R; + // eaInputs.slAtrMultiplier = eaSLAtrMultiplier; + + // // + // // Set Validators ... + // eaInputs.forceHasSwing = eaForceHasSwing; + // eaInputs.forceObBarType = eaForceObBarType; + // eaInputs.forceOBFVGBarType = eaForceOBFVGBarType; + // eaInputs.forceHasFLiquidity = eaForceHasFLiquidity; + // eaInputs.forceHasRLiquidity = eaForceHasRLiquidity; + // eaInputs.validateGapSequence = eaValidateGapSequence; + // eaInputs.validateBlockEdgeBreakout = eaValidateBlockEdgeBreakout; + + // // + // // Set Filters ... + // eaInputs.filterBasedOnPV = eaFilterBasedOnPV; + // eaInputs.filterBasedOnSar = eaFilterBasedOnSar; + // eaInputs.filterBasedOnRSI = eaFilterBasedOnRSI; + // eaInputs.filterBasedOnADX = eaFilterBasedOnADX; + // eaInputs.filterBasedOnATR = eaFilterBasedOnATR; + // eaInputs.filterBasedOnTrend = eaFilterBasedOnTrend; + // eaInputs.filterBasedOnDelta = eaFilterBasedOnDelta; + // eaInputs.filterBasedOnVolume = eaFilterBasedOnVolume; + // eaInputs.filterBasedOnSignalBar = eaFilterBasedOnSignalBar; + // eaInputs.filterBasedOnHKSignalBar = eaFilterBasedOnHKSignalBar; + + // // + // // Alerts ... + // // eaInputs.alertPrefix = eaTag; + // // eaInputs.logAlerts = eaLogAlerts; + // // eaInputs.pushAlerts = eaMailAlerts; + // // eaInputs.mailAlerts = eaPushAlerts; + // // eaInputs.terminalAlerts = eaTerminalAlerts; + + // + // eaHelper = new XCX121XCatbHelper(); + // bool isInited = eaHelper.Init( + // _Symbol, + // _Period, + // eaInputs // + // ); + + // // + // // EA Trade ... + // eaTrade = new XCTrade( + // eaSlippage, + // eaMagicNumber, + // eaMaxAllowedSpread, + // eaMaxAllowedPositions, + // eaMaxAllowedDrawdownFactor // + // ); + // eaTrade.AddOnStopLossEventHandler(OnStopLossTriggered); + // eaTrade.AddOnTakeProfitEventHandler(OnTakeProfitTriggered); + // eaTrade.AddOnForceClosePositionEventHandler(OnPositionForceClosed); + // eaTrade.AddOnPartialClosePositionEventHandler(OnPositionPartiallyClosed); + + // // + // // EA Trae Manager ... + // eaTradeManager = new XCXCAEATradeManager( + // eaTrade // + // ); + // eaTradeManager.SaveTrades(true); + // eaTradeManager.SetAlertEnableAlerts(eaEnableAlerts); + // eaTradeManager.SetAlertPrefix(eaTag); + // eaTradeManager.SetAlertLogAlerts(eaLogAlerts); + // eaTradeManager.SetAlertMailAlerts(eaMailAlerts); + // eaTradeManager.SetAlertPushAlerts(eaPushAlerts); + // eaTradeManager.SetAlertTerminalAlerts(eaTerminalAlerts); + + // // + // // Setting Trade Reports ... + // eaTradeManager + // .SetTradeReports( + // eaReportTrades, + // eaReportSignals, + // eaReportProtector, + // eaReportAfterTradesBalance // + // ); + + // // + // // Setting Trade Permissions ... + // eaTradeManager + // .SetTradePermissions( + // eaAllowTrade, + // eaAllowLongs, + // eaAllowShorts // + // ); + + // // + // // Setting Trade Restrictions ... + // eaTradeManager + // .SetTradeRestrictions( + // eaRestrictionsPeriod, + // eaMaxAllowedTPs, + // eaMaxAllowedSLs, + // eaMaxAllowedTrades // + // ); +} + +/** + * Handling Time Reporting ... + */ +void HandleTimeReport() +{ + // + if (eaAlert == NULL) + { + return; + } + + // + // Monthly Report .... + if (eaReportNewMonths && + eaTimeTracker.IsNewMonth()) + { + // + string msg = "New Month ..."; + + // + eaAlert.Alert(msg); + } + + // + // Weekly Report .... + if (eaReportNewWeeks && + eaTimeTracker.IsNewWeek()) + { + // + string msg = "New Week ..."; + + // + eaAlert.Alert(msg); + } + + // + // Daily Report .... + if (eaReportNewDays && + eaTimeTracker.IsNewDay()) + { + // + string msg = "New Day ..."; + + // + eaAlert.Alert(msg); + } + + // + // Hourly Report .... + if (eaReportNewHours && + eaTimeTracker.IsNewHour()) + { + // + string msg = "New Hour ..."; + + // + eaAlert.Alert(msg); + } +} + +// +// Apply Signal Targets ... +// void ApplySignalTargets(XSignal &signal) +// { +// // +// bool has = signal.IsValid(); +// if (!has) +// { +// return; +// } + +// // +// // Clean Signal Targets ... +// Clean(signal.targets); + +// // +// // Calculate Requirements ... +// double r2r = 1; +// // maxAllowedR2R > 0 +// // ? maxAllowedR2R +// // : 1; +// double risk = signal.GetRisk(); +// double reward = risk * r2r; + +// // +// double isLong = IsLong(signal.type); + +// // +// // Handling Signal TP ... +// signal.tp = +// isLong +// ? signal.entry + reward +// : signal.entry - reward; + +// // +// // Try to Apply Money Management ... + +// // +// if (r2r <= 1) +// { +// return; +// } + +// // +// // XTarget iTarget; + +// // // +// // // Partial Close 0.5 of Position on Reward 1 ... +// // reward = risk * 1; +// // iTarget.target = +// // isLong +// // ? signal.entry + reward +// // : signal.entry - reward; +// // iTarget.volumeMultiplier = 0.5; + +// // // +// // AddRef(iTarget, signal.targets); +// // iTarget.Clean(); + +// // // +// // if (r2r <= 2) +// // { +// // return; +// // } + +// // +// // Making Loop ... +// // for (int i = 2; i < ((int)r2r - 1); i++) +// // { +// // // +// // iTarget.Clean(); + +// // // +// // reward = i * risk; +// // iTarget.target = +// // isLong +// // ? signal.entry + reward +// // : signal.entry - reward; +// // iTarget.volumeMultiplier = 1 / (r2r - 2); + +// // // +// // AddRef(iTarget, signal.targets); +// // } + +// // +// // Sort Targets ... +// ENUM_X_DIRECTION sortingDir = +// isLong +// ? X_DIRECTION_BULLISH +// : X_DIRECTION_BEARISH; +// ApplySortOnTargets( +// sortingDir, +// signal.targets // +// ); +// } + + +///////////////////////////////////////////////////// + + +// +static XTriggerBlock mX121TriggerBlocks[]; + +// +int HasX121TriggerBlocks() +{ + return HasChild(mX121TriggerBlocks); +} + +// +int CountX121TriggerBlocks() +{ + return ArraySize(mX121TriggerBlocks); +} + +// +void CleanX121TriggerBlocks(int maxAllowed = 0) +{ + // + if (maxAllowed <= 0) + { + Clean(mX121TriggerBlocks); + } + else if (maxAllowed > 0) + { + // + CleanupArray( + mX121TriggerBlocks, + maxAllowed // + ); + } +} + +// +bool GetNewestX121TriggerBlock( + string forSymbol, + ENUM_TIMEFRAMES forPeriod, + XTriggerBlock &tb // +) +{ + // + bool result = false; + + // + tb.Clean(); + + // + result = + IsValid(forSymbol) && + IsValid(forPeriod) && + HasX121TriggerBlocks(); + if (!result) + { + return result; + } + + // + // Loop Through Trigger Blocks to Find Filtered Newest ... + int count = CountX121TriggerBlocks(); + for (int i = 0; i < count; i++) + { + // + bool canSet = !tb.IsValid() + ? true + : tb.ToIndex() < mX121TriggerBlocks[i].ToIndex(); + if (canSet) + { + tb = mX121TriggerBlocks[i]; + } + } + + // + result = tb.IsValid(); + if (!result) + { + tb.Clean(); + } + + // + return result; +} + + +/////////////////////////////////////////////////// + + + // + // Add Trigger Block to Collection + // and Cleanup Unuseds ... + AddRef( + tb, + mX121TriggerBlocks // + ); + CleanX121TriggerBlocks(20); diff --git a/Experts/xcatb.test.ea.mq5 b/Experts/xcatb.test.ea.mq5 index 2b173097..bd62df7b 100644 --- a/Experts/xcatb.test.ea.mq5 +++ b/Experts/xcatb.test.ea.mq5 @@ -21,6 +21,8 @@ // // Include Common Library ... #include "../Classes/x-saherelm.x-alert.class.mq5" +#include "../Classes/x-saherelm.x-bar.analyser.class.mq5" +#include "../Classes/x-saherelm.x-poi.drawer.class.mq5" #include "../Classes/x-saherelm.x-trade.class.mq5" #include "../Classes/x-saherelm.x-volume.class.mq5" #include "../Helpers/x-saherelm.x121.xcatb.helper.mq5" @@ -107,11 +109,11 @@ input string eaCloseAllOpenTradesAt = ""; // Here we Provider All Requirements for // Configuring Alert Provider ... input group "Alert"; -input bool eaEnableAlerts = true; // Enable Alerts -input bool eaLogAlerts = true; // Log Alerts -input bool eaMailAlerts = false; // Mail Alerts -input bool eaPushAlerts = true; // Push Alerts -input bool eaTerminalAlerts = true; // Terminal Alerts +input bool eaEnableAlerts = true; // Enable Alerts +input bool eaLogAlerts = true; // Log Alerts +input bool eaMailAlerts = false; // Mail Alerts +input bool eaPushAlerts = true; // Push Alerts +input bool eaTerminalAlerts = false; // Terminal Alerts // // Time Report ... @@ -132,23 +134,18 @@ input bool eaReportAfterTradesBalance = true; // Report Balance after a Trade Fi XCAlert *eaAlert; XCTrade *eaTrade; XSignal eaSignal; +string eaTag = ""; XCVolume *eaVolume; -X121XCatbInputs eaInputs; -XCX121XCatbHelper *eaHelper; +CArrayObj *eaObjects; +XCPOIDrawer *eaDrawer; XBarTracker eaBarTraker; +X121XCatbInputs eaInputs; XTimeTracker eaTimeTracker; +XCX121XCatbHelper *eaHelper; +XCBarAnalyser *eaBarAnalyser; XCXCAEATradeManager *eaTradeManager; XCAEAStrategyConditions eaConditions; -// -XTriggerBlock eaTB; - -// -CArrayObj *eaObjects; - -// -string eaTag = ""; - // // Event Handlers ... @@ -210,10 +207,18 @@ void OnDeinit(const int reason) delete eaTrade; ZeroMemory(eaTrade); + // + delete eaDrawer; + ZeroMemory(eaDrawer); + // delete eaVolume; ZeroMemory(eaVolume); + // + delete eaBarAnalyser; + ZeroMemory(eaBarAnalyser); + // eaSignal.Clean(); eaBarTraker.Clean(); @@ -239,6 +244,11 @@ void OnTick() eaSignal.Clean(); eaConditions.Clean(); + // + bool has = false; + int barIndex = 0; + int cBarIndex = 0; + // // Check Bar Processing ... if (!eaBarTraker.CanProcessBar()) @@ -247,16 +257,13 @@ void OnTick() } // - bool has = false; - - // - // Retrieve Bars ... + // Reading Required Bars ... XOHCL zBar; XOHCL cBar; has = zBar.Init( _Symbol, _Period, - 0 // + barIndex // ); has = has && @@ -272,50 +279,131 @@ void OnTick() } // - double bid = GetBid(zBar.symbol); + cBarIndex = barIndex + 1; // + // Update All Required Buffers ... + eaHelper.Update(cBarIndex); + + // + // Check Trigger Block Detected or Not ... XTriggerBlock iTB; - has = GetNewestX121TriggerBlock( + has = DetectTriggerBlock( + // _Symbol, _Period, - iTB // + // + iTB, + // + eaBarAnalyser, + // + // Required Buffers ... + eaHelper.atrBuffer, + eaHelper.rsiBuffer, + eaHelper.adxBuffer, + eaHelper.adxpBuffer, + eaHelper.adxnBuffer, + eaHelper.peakBuffer, + eaHelper.valeBuffer, + eaHelper.deltaBuffer, + eaHelper.sarBuffer, + eaHelper.sarStateBuffer, + eaHelper.trendBuffer, + eaHelper.trendStateBuffer, + eaHelper.atrUpperBuffer, + eaHelper.atrLowerBuffer, + eaHelper.sBarOpenBuffer, + eaHelper.sBarCloseBuffer, + eaHelper.hkSBarOpenBuffer, + eaHelper.hkSBarCloseBuffer, + eaHelper.peakGoldenBuffer, + eaHelper.valeGoldenBuffer, + eaHelper.deltaSignalBuffer, + eaHelper.bullishVolumeSignalBuffer, + eaHelper.bearishVolumeSignalBuffer, + // + cBarIndex, + // + // Signalling ... + eaInputs.signalR2R, + eaInputs.slAtrMultiplier, + // + // Configs ... + eaInputs.rsiOBLevel, + eaInputs.rsiOSLevel, + eaInputs.adxThreshold, + // + // Validators ... + eaInputs.forceObBarType, + eaInputs.forceOBFVGBarType, + eaInputs.forceHasSwing, + eaInputs.forceHasFLiquidity, + eaInputs.forceHasRLiquidity, + eaInputs.validateGapSequence, + eaInputs.validateBlockEdgeBreakout, + // + // Filters ... + eaInputs.filterBasedOnPV, + eaInputs.filterBasedOnSar, + eaInputs.filterBasedOnRSI, + eaInputs.filterBasedOnADX, + eaInputs.filterBasedOnATR, + eaInputs.filterBasedOnTrend, + eaInputs.filterBasedOnDelta, + eaInputs.filterBasedOnVolume, + eaInputs.filterBasedOnSignalBar, + eaInputs.filterBasedOnHKSignalBar // ); if (has) { // - // Check Newest TB is Newer Than Exists TB ... - bool canPass = - !eaTB.IsValid() - ? true - : iTB.ToIndex() < eaTB.ToIndex(); - if (canPass) - { - // - eaTB = iTB; - eaSignal = iTB.signal; + eaBarTraker.Waits(); - // - // Prepare eaConditions if Reuqired ... - } - } - - // - has = eaSignal.IsValid(); - if (has) - { // - // Here we ensure which has a New Signal and must - // prepare and Execute it ... - Print("new Signal Detected ..."); + eaSignal = iTB.signal; + + // + // Here we Can Fill eaConditions ... + + // + // Check Signal Type ... + bool isLong = IsLong(eaSignal.type); + + // + // Update Entry ... + eaSignal.entry = GetEntry( + eaSignal.symbol, + eaSignal.type // + ); + + // + // Update Signal Targets ... + UpdateSignalTargets(eaSignal); + + // + // Handle Volume Management ... + double iVolume = eaVolume.CalculateVolume(eaSignal); + if (iVolume > X_MIN_VOLUME && + iVolume != eaSignal.volume) + { + eaSignal.volume = iVolume; + } + + // + // Execute Signal ... + has = eaTradeManager.Execute( + eaSignal, + eaConditions // + ); } // - // eaTB.Clean(); + // Cleanup Resources ... + + // + iTB.Clean(); zBar.Clean(); cBar.Clean(); - eaSignal.Clean(); - eaConditions.Clean(); } // @@ -543,6 +631,13 @@ bool InitVolume() */ void InitRequirements() { + // + // Initial Bar Tracker ... + eaBarTraker.Init( + _Symbol, + _Period // + ); + // // Preparing Tags ... eaTag = @@ -552,11 +647,13 @@ void InitRequirements() ShortName; // - // Initial Bar Tracker ... - eaBarTraker.Init( - _Symbol, - _Period // - ); + eaAlert = new XCAlert(); + eaAlert.SetPrefix(eaLogSuffix); + eaAlert.SetLogAlerts(eaLogAlerts); + eaAlert.SetMailAlerts(eaMailAlerts); + eaAlert.SetPushAlerts(eaPushAlerts); + eaAlert.SetEnableAlerts(eaEnableAlerts); + eaAlert.SetTerminalAlerts(eaTerminalAlerts); // // Objects ... @@ -573,6 +670,9 @@ void InitRequirements() // // we Can make Show all requirements here ... + // + eaInputs.showATRBand = false; + // // Signal ... eaInputs.signalR2R = eaSignalR2R; @@ -604,10 +704,10 @@ void InitRequirements() // // Alerts ... eaInputs.alertPrefix = eaTag; - eaInputs.logAlerts = eaLogAlerts; - eaInputs.pushAlerts = eaMailAlerts; - eaInputs.mailAlerts = eaPushAlerts; - eaInputs.terminalAlerts = eaTerminalAlerts; + eaInputs.logAlerts = false; // eaLogAlerts; + eaInputs.pushAlerts = false; // eaMailAlerts; + eaInputs.mailAlerts = false; // eaPushAlerts; + eaInputs.terminalAlerts = false; // eaTerminalAlerts; // eaHelper = new XCX121XCatbHelper(); @@ -618,15 +718,8 @@ void InitRequirements() ); // - // EA Alert ... - eaAlert = new XCAlert( - eaTag, - eaEnableAlerts, - eaLogAlerts, - eaTerminalAlerts, - eaMailAlerts, - eaPushAlerts // - ); + eaDrawer = new XCPOIDrawer(); + eaBarAnalyser = new XCBarAnalyser(); // // EA Trade ... @@ -648,11 +741,11 @@ void InitRequirements() eaTrade // ); eaTradeManager.SaveTrades(true); - eaTradeManager.SetAlertEnableAlerts(eaEnableAlerts); eaTradeManager.SetAlertPrefix(eaTag); eaTradeManager.SetAlertLogAlerts(eaLogAlerts); eaTradeManager.SetAlertMailAlerts(eaMailAlerts); eaTradeManager.SetAlertPushAlerts(eaPushAlerts); + eaTradeManager.SetAlertEnableAlerts(eaEnableAlerts); eaTradeManager.SetAlertTerminalAlerts(eaTerminalAlerts); // @@ -690,6 +783,12 @@ void InitRequirements() */ void HandleTimeReport() { + // + if (eaAlert == NULL) + { + return; + } + // // Monthly Report .... if (eaReportNewMonths && @@ -699,7 +798,7 @@ void HandleTimeReport() string msg = "New Month ..."; // - eaAlert.Alert(msg); + eaAlert.SendAlert(msg); } // @@ -711,7 +810,7 @@ void HandleTimeReport() string msg = "New Week ..."; // - eaAlert.Alert(msg); + eaAlert.SendAlert(msg); } // @@ -723,7 +822,7 @@ void HandleTimeReport() string msg = "New Day ..."; // - eaAlert.Alert(msg); + eaAlert.SendAlert(msg); } // @@ -735,13 +834,14 @@ void HandleTimeReport() string msg = "New Hour ..."; // - eaAlert.Alert(msg); + eaAlert.SendAlert(msg); } } -// -// Apply Signal Targets ... -void ApplySignalTargets(XSignal &signal) +/** + * Update Signal Targets ... + */ +void UpdateSignalTargets(XSignal &signal) { // bool has = signal.IsValid(); @@ -756,10 +856,9 @@ void ApplySignalTargets(XSignal &signal) // // Calculate Requirements ... - double r2r = 1; - // maxAllowedR2R > 0 - // ? maxAllowedR2R - // : 1; + double r2r = eaSignalR2R > 0 + ? eaSignalR2R + : 1; double risk = signal.GetRisk(); double reward = risk * r2r; @@ -777,10 +876,10 @@ void ApplySignalTargets(XSignal &signal) // Try to Apply Money Management ... // - if (r2r <= 1) - { - return; - } + // if (r2r <= 1) + // { + // return; + // } // // XTarget iTarget; @@ -834,3 +933,5 @@ void ApplySignalTargets(XSignal &signal) signal.targets // ); } + +// \ No newline at end of file diff --git a/Helpers/x-saherelm.x121.xcatb.helper.mq5 b/Helpers/x-saherelm.x121.xcatb.helper.mq5 index aff9d55d..95f20d5c 100644 --- a/Helpers/x-saherelm.x121.xcatb.helper.mq5 +++ b/Helpers/x-saherelm.x121.xcatb.helper.mq5 @@ -140,10 +140,14 @@ struct X121XCatbInputs bool showSar; // Show Sar bool showTrend; // Show Trend bool showATRBand; // Show ATR Band - bool showTrendBars; // Show Trend Bars bool showSignalBars; // Show Signal Bars bool showHKSignalBars; // Show Hiken Ashi Signal Bars + // + double rsiOBLevel; // RSI OB Level + double rsiOSLevel; // RSI OS Level + double adxThreshold; // ADX Threshold + // int startCalculationForLastBars; // Calculate Last n Bars @@ -204,7 +208,7 @@ struct X121XCatbInputs // // Alert ... - alertPrefix = NULL; // Alert Prefix + alertPrefix = ""; // Alert Prefix logAlerts = false; // Log Alerts pushAlerts = false; // Push Alerts mailAlerts = false; // Mail Alerts @@ -218,13 +222,17 @@ struct X121XCatbInputs showSar = false; // Show Sar showTrend = false; // Show Trend showATRBand = false; // Show ATR Band - showTrendBars = false; // Show Trend Bars showSignalBars = false; // Show Signal Bars showHKSignalBars = false; // Show Hiken Ashi Signal Bars // startCalculationForLastBars = 0; // Calculate Last n Bars + // + rsiOBLevel = 70.0; // RSI OB Level + rsiOSLevel = 30.0; // RSI OS Level + adxThreshold = 25.0; // ADX Threshold + // ZeroMemory(this); } @@ -276,11 +284,11 @@ struct X121XCatbInputs // // Alert ... - alertPrefix = NULL; // Alert Prefix - logAlerts = true; // Log Alerts - pushAlerts = false; // Push Alerts - mailAlerts = false; // Mail Alerts - terminalAlerts = true; // Terminal Alerts + alertPrefix = ""; // Alert Prefix + logAlerts = false; // Log Alerts + pushAlerts = false; // Push Alerts + mailAlerts = false; // Mail Alerts + terminalAlerts = false; // Terminal Alerts // // Presentation ... @@ -290,12 +298,16 @@ struct X121XCatbInputs showSar = false; // Show Sar showTrend = false; // Show Trend showATRBand = false; // Show ATR Band - showTrendBars = false; // Show Trend Bars showSignalBars = false; // Show Signal Bars showHKSignalBars = false; // Show Hiken Ashi Signal Bars // startCalculationForLastBars = 1500; // Calculate Last n Bars + + // + rsiOBLevel = 70.0; // RSI OB Level + rsiOSLevel = 30.0; // RSI OS Level + adxThreshold = 25.0; // ADX Threshold } // @@ -308,7 +320,6 @@ struct X121XCatbInputs showSar = false; showTrend = false; showATRBand = false; - showTrendBars = false; showSignalBars = false; showHKSignalBars = false; } @@ -843,7 +854,6 @@ class XCX121XCatbHelper : public XCBaseHelper mInputs.showSar, mInputs.showTrend, mInputs.showATRBand, - mInputs.showTrendBars, mInputs.showSignalBars, mInputs.showHKSignalBars, mInputs.startCalculationForLastBars @@ -2842,6 +2852,15 @@ class XCX121XCatbHelper : public XCBaseHelper // // Tools ... + // + void Update( + int barIndex // Bar Index + ) + { + // + Calculate(barIndex); + } + // void Free() override { @@ -2897,7 +2916,7 @@ class XCX121XCatbHelper : public XCBaseHelper // return result; } - + // int zIndex = barIndex; diff --git a/Indicators/x-saherelm.x121.xcatb.mq5 b/Indicators/x-saherelm.x121.xcatb.mq5 index d0ea0481..533f7860 100644 --- a/Indicators/x-saherelm.x121.xcatb.mq5 +++ b/Indicators/x-saherelm.x121.xcatb.mq5 @@ -115,11 +115,11 @@ input bool filterBasedOnHKSignalBar = false; // Filter Based on Hiken Ashi Signa // // Alert ... input group "Alerts"; -input string mAlertPrefix = ""; // Alert Prefix -input bool _logAlerts = true; // Log Alerts -input bool _pushAlerts = false; // Push Alerts -input bool _mailAlerts = false; // Mail Alerts -input bool _terminalAlerts = true; // Terminal Alerts +input string mAlertPrefix = ""; // Alert Prefix +input bool _logAlerts = false; // Log Alerts +input bool _pushAlerts = false; // Push Alerts +input bool _mailAlerts = false; // Mail Alerts +input bool _terminalAlerts = false; // Terminal Alerts // // Presentation ... @@ -130,7 +130,6 @@ input bool showPVGolden = false; // Show PV Golden input bool showSar = false; // Show Sar input bool showTrend = false; // Show Trend input bool showATRBand = false; // Show ATR Band -input bool showTrendBars = false; // Show Trend Bars input bool showSignalBars = false; // Show Signal Bars input bool showHKSignalBars = false; // Show Hiken Ashi Signal Bars @@ -329,7 +328,7 @@ double trendColorBuffer[]; // #define sBarOpenBufferIndex 10 -double sBarOpenSBuffer[]; +double sBarOpenBuffer[]; // #define sBarHighBufferIndex 11 @@ -1182,8 +1181,8 @@ void DefineBuffers() // // Open ... - ArraySetAsSeries(sBarOpenSBuffer, true); - SetIndexBuffer(sBarOpenBufferIndex, sBarOpenSBuffer, INDICATOR_DATA); + ArraySetAsSeries(sBarOpenBuffer, true); + SetIndexBuffer(sBarOpenBufferIndex, sBarOpenBuffer, INDICATOR_DATA); // // High ... @@ -1975,7 +1974,7 @@ void CalculateValues( trendStateBuffer, atrUpperBuffer, atrLowerBuffer, - sBarOpenSBuffer, + sBarOpenBuffer, sBarCloseBuffer, hkSBarOpenBuffer, hkSBarCloseBuffer, @@ -2055,7 +2054,7 @@ void CalculateValues( } else if (canAlert) { - mAlert.Alert(message); + mAlert.SendAlert(message); } } } @@ -2286,7 +2285,7 @@ void CalculateSBar( barIndex, mAppliedLength, open, - sBarOpenSBuffer, + sBarOpenBuffer, barsSignalMethod // ); @@ -2303,8 +2302,8 @@ void CalculateSBar( ); // - double min = MathMin(sBarCloseBuffer[barIndex], sBarOpenSBuffer[barIndex]); - double max = MathMin(sBarCloseBuffer[barIndex], sBarOpenSBuffer[barIndex]); + double min = MathMin(sBarCloseBuffer[barIndex], sBarOpenBuffer[barIndex]); + double max = MathMin(sBarCloseBuffer[barIndex], sBarOpenBuffer[barIndex]); // sBarLowBuffer[barIndex] = min; @@ -2313,7 +2312,7 @@ void CalculateSBar( // // Calculate HK Signal Color ... double iSignalColorValue = - sBarOpenSBuffer[barIndex] < sBarCloseBuffer[barIndex] + sBarOpenBuffer[barIndex] < sBarCloseBuffer[barIndex] ? bullishColorIDX : bearishColorIDX; sBarColorBuffer[barIndex] = diff --git a/Libraries/x-saherelm.x121.xcatb.lib.mq5 b/Libraries/x-saherelm.x121.xcatb.lib.mq5 index c5724551..2cd5a39d 100644 --- a/Libraries/x-saherelm.x121.xcatb.lib.mq5 +++ b/Libraries/x-saherelm.x121.xcatb.lib.mq5 @@ -132,91 +132,11 @@ struct XTriggerBlock // }; -// -XTriggerBlock mX121TriggerBlocks[]; - -// -int HasX121TriggerBlocks() -{ - return HasChild(mX121TriggerBlocks); -} - -// -int CountX121TriggerBlocks() -{ - return ArraySize(mX121TriggerBlocks); -} - -// -void CleanX121TriggerBlocks(int maxAllowed = 0) -{ - // - if (maxAllowed <= 0) - { - Clean(mX121TriggerBlocks); - } - else if (maxAllowed > 0) - { - // - CleanupArray( - mX121TriggerBlocks, - maxAllowed // - ); - } -} - -// -bool GetNewestX121TriggerBlock( - string forSymbol, - ENUM_TIMEFRAMES forPeriod, - XTriggerBlock &tb // -) -{ - // - bool result = false; - - // - tb.Clean(); - - // - result = - IsValid(forSymbol) && - IsValid(forPeriod) && - HasX121TriggerBlocks(); - if (!result) - { - return result; - } - - // - // Loop Through Trigger Blocks to Find Filtered Newest ... - int count = CountX121TriggerBlocks(); - for (int i = 0; i < count; i++) - { - // - bool canSet = !tb.IsValid() - ? true - : tb.ToIndex() < mX121TriggerBlocks[i].ToIndex(); - if (canSet) - { - tb = mX121TriggerBlocks[i]; - } - } - - // - result = tb.IsValid(); - if (!result) - { - tb.Clean(); - } - - // - return result; -} - // // Extensions ... +// +// Detect Trigger Block ... bool DetectTriggerBlock( // string symbol, @@ -290,36 +210,36 @@ bool DetectTriggerBlock( // // Custom Configs ... - // - _r2r = 2; - _slAtrMultiplier = 1; + // // + // _r2r = 2; + // _slAtrMultiplier = 1; - // - // Validators ... - _forceHasSwing = true; - _forceObBarType = true; - _forceFVGBarType = true; - _validateGapSequence = true; + // // + // // Validators ... + // _forceHasSwing = true; + // _forceObBarType = true; + // _forceFVGBarType = true; + // _validateGapSequence = true; - // - _forceHasFLiquidity = false; - _forceHasRLiquidity = false; - _validateBlockEdgeBreakout = true; + // // + // _forceHasFLiquidity = false; + // _forceHasRLiquidity = false; + // _validateBlockEdgeBreakout = true; - // - // Filters ... - _filterBasedOnPV = true; - _filterBasedOnATR = true; - _filterBasedOnDelta = true; - _filterBasedOnVolume = true; + // // + // // Filters ... + // _filterBasedOnPV = true; + // _filterBasedOnATR = true; + // _filterBasedOnDelta = true; + // _filterBasedOnVolume = true; - // - _filterBasedOnSar = true; - _filterBasedOnRSI = false; - _filterBasedOnADX = false; - _filterBasedOnTrend = false; - _filterBasedOnSignalBar = true; - _filterBasedOnHKSignalBar = true; + // // + // _filterBasedOnSar = true; + // _filterBasedOnRSI = false; + // _filterBasedOnADX = false; + // _filterBasedOnTrend = false; + // _filterBasedOnSignalBar = true; + // _filterBasedOnHKSignalBar = true; // tb.Clean(); @@ -1098,15 +1018,6 @@ bool DetectTriggerBlock( targets, slAdditional // ); - - // - // Add Trigger Block to Collection - // and Cleanup Unuseds ... - AddRef( - tb, - mX121TriggerBlocks // - ); - CleanX121TriggerBlocks(20); } //