diff --git a/Experts/x-saherelm.x121.test.ea.mq5 b/Experts/x-saherelm.x121.test.ea.mq5 deleted file mode 100644 index 074bdf85..00000000 --- a/Experts/x-saherelm.x121.test.ea.mq5 +++ /dev/null @@ -1,652 +0,0 @@ -/////////////////////////////////////////////////////// -// -// SaherElm IT Center X121EA MQL5 Expert Advisor -// ------------------------------------------------- -// Name: X121EA -// Description: an Exper Advisor which used RSI and MA -// to Analyse Market ... -// -// Maintainer: -// ------------ -// Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) -// -//////////////////////////////////////////////////////x -// -// Global Properties ... -#property copyright "Copyright 2023, SaherElm IT Center" -#property link "https://saherelm.ir" -#property version "1.00" -#property description "SaherElm X121EA" -#property strict - -// -// Imports ... -#include "../Helpers/x-saherelm.xct.helper.mq5" -#include "../Helpers/x-saherelm.xcc.helper.mq5" -#include "../Classes/x-saherelm.x121.setup.xea.mq5" - -// -#define ShortName "X121EA" - -// -// Inputs ... - -// -// Common ... -input group "Common"; -input long x121EAMagicNumber = 78692110; // Magic Number -input int x121EASlippage = 10; // Slippgae - -// -// Symbols ... -input group "Symbol(s)"; -input string x121EASymbols = "EURUSDb,USDCHFb,EURCHFb,USDJPYb,EURJPYb,GBPUSDb"; // Symbols -input bool x121EAUseAllSymbols = false; // Use All Available Symbols -input bool x121EAUseAllWatchListSymbols = false; // Use All Watch List Symbols - -// -// Signals ... -input group "Signals"; -input bool x121EAAllowLong = true; // Allow Long Trades -input bool x121EAAllowShort = true; // Allow Short Trades -input int x121EAStartSignallingHoure = 3; // Start Signalling at Specific Time -input int x121EAEndSignallingHoure = 22; // End Signalling at Specific Time -input int x121EACloseOnSpecificTime = -1; // Close All Trades in Specific Time -input int x121EADelayBetweenTwoSignal = 10; // Delay Between two Same Signals -input int x121EAReuiredSignalVerifications = 4; // Required Verifications for Signals -input bool x121EAExecuteSignalsOnBreakout = false; // Execute Signals On Breakouts -input bool x121EAGetVerificationFromOtherTimeFrames = true; // Get Verifications from Other Time Frames - -// -// Risk Management ... -input group "Risk Management"; -input double x121EAVolume = 0.01; // Static Volume -input double x121EATPPoint = 1000; // TP Point -input double x121EASLPoint = 1000; // SL Point -input bool x121EAIgnoreSL = false; // Ignore Calculated SL -input bool x121EAIgnoreTP = false; // Ignore Calculated TP -input bool x121EACloseOnOpposit = false; // Close all Positions on Opposit -input int x121EAMaxAllowedTrades = 2; // Max Allowed Positions Per Symbol -input bool x121EAUseMaxAllowedPerDirection = true; // Use Max Allowed Positions Per Direction -input int x121EAMinFreeMargingForOpenTrades = 900; // Min Margin For Opening Trades -input bool x121EAIncreaseNextSignalsVolume = true; // Increase Next Signals Volume -input double x121EAIncreaseNextSignalsVolumeMultiplier = 1; // Increase Next Signals Volume Multiplier -input bool x121EAAcceptNextDirectionalSignalsWhenFirstInProfit = true; // Accept Same Symbol/Type Signal when Last in Profit - -// -input group "Trailling"; -input bool x121EAAllowTrailStop = true; // Enable Trailling Stop Losses -input bool x121EADisableTrailingWhenOpposit = true; // Disable Trailling When has Opposite In Drawdown -input double x121EAFirstTrailDistance = 100; // Start Trailling Distance -input double x121EAFirstTrailPoint = 60; // First Stop Trail -input double x121EANextTrailDistance = 50; // Next Trailling Distance -input double x121EANextTrailPoint = 25; // Next Trailling Step - -// -input group "Supporting"; -input bool x121EAAllowSupport = false; // Allow Support Signals -input bool x121EASupportOnlyForces = false; // Support Only Force Signals -double x121EASupportDistance = 0; // Supporting Distance -input int x121EAMaxNumberOfSupports = 0; // Max Number of Support Signals -input double x121EASupportVolumeMultiplier = 0; // Support Signals Volume Multiplier -input double x121EAMaxAllowedSupportVolume = 0; // Max Allowed Support Signals Volume - -// -input group "Grid"; -input bool x121EAAllowGrid = false; // Allow Grid Signals -input bool x121EAGridOnlyForces = false; // Grid Only Force Signals -input int x121EAMaxNumberOfGrids = 0; // Max Number of Grid Signals -input double x121EAGridDistance = 0; // Grid Distance -input double x121EAGridVolumeMultiplier = 0; // Grid Volume Multiplier -input double x121EAMaxAllowedGridVolume = 0; // Max Allowed Grid Signals Volume - -// -input group "Recovery"; -input bool x121EAAllowRecovery = false; // Allow Recovery Signals -input bool x121EARecoverOnlyForces = false; // Recover Only Force Signals -input int x121EAMaxNumberOfRecoveries = 0; // Max Number of Recovery Signals -input double x121EARecoveryDistance = 0; // Recovery Distance -input double x121EARecoveryVolumeMultiplier = 0; // Recovery Volume Multiplier -input double x121EAMaxAllowedRecoveryVolume = 0; // Max Allowed Recovery Signals Volume - -// -input group "Hedging"; -input int x121EARestingAfterHedge = 1000; // Resting Seconds After Hedge -input double x121EAMinRequiredProfitPerTrade = 0.3; // Minimum Required Profit for Hedging -input double x121EAMinRequiredProfitPerVolumeFactor = 0.01; // Minimum Required Profit for Hedging Per Volume - -// -// Alert ... -input group "Alerts"; -input bool x121EAEnableAlerts = true; // Enable Alerts -input bool x121EALogAlerts = true; // Log Alerts -input bool x121EAMailAlerts = false; // Mail Alerts -input bool x121EAPushAlerts = false; // Push Alerts -input bool x121EATerminalAlerts = false; // Terminal Alerts - -// -// Definitions ... - -// -// Local Variables ... - -// -string x121EAUsedSymbols[]; -XSCX121SetupEA *x121EA; - -// -XSCXCTHelper *x121EACTHelper; -XSCXCCHelper *x121EACCHelper; - -// -// Event Handlers ... - -// -// Initialization ... -int OnInit() -{ - // - drawPrefix = ShortName; - - // - if (!InitialEA()) - { - return INIT_PARAMETERS_INCORRECT; - } - - // - // Init Succeed ... - return INIT_SUCCEEDED; -} - -// -// DeInitialization ... -void OnDeinit(const int reason) -{ - // - // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function - // REASON_REMOVE 1 Program removed from a chart - // REASON_RECOMPILE 2 Program recompiled - // REASON_CHARTCHANGE 3 A symbol or a chart period is changed - // REASON_CHARTCLOSE 4 Chart closed - // REASON_PARAMETERS 5 Inputs changed by a user - // REASON_ACCOUNT 6 Another account has been activated or reconnection to the trade server has occurred due to changes in the account settings - // REASON_TEMPLATE 7 Another chart template applied - // REASON_INITFAILED 8 The OnInit() handler returned a non-zero value - // REASON_CLOSE 9 Terminal closed - - // - // De Initialize XSampleEA Providers ... - delete x121EA; - - // - delete x121EACTHelper; - delete x121EACCHelper; -} - -// -// On Tick Handler ... -void OnTick() -{ - // - x121EA.OnTick(); - - // - X121ReportState(); -} - -// -// Custom Functions ... - -// -bool InitialEA() -{ - // - bool result = false; - - // - // Bar Timer ... - XCTInputs ctInputs; - ctInputs.Default(); - x121EACTHelper = new XSCXCTHelper(); - result = x121EACTHelper.Init( - _Symbol, - _Period, - ctInputs // - ); - if (!result) - { - return result; - } - - // - // Bar Styles ... - XCCInputs ccInputs; - ccInputs.Default(); - x121EACCHelper = new XSCXCCHelper(); - result = x121EACCHelper.Init( - _Symbol, - _Period, - ccInputs // - ); - if (!result) - { - return result; - } - - // - // TesterHideIndicators(true); - - // - string inputSymbols[]; - int inputSymbolsCount = SplitContent( - inputSymbols, - x121EASymbols // - ); - - // - string allSymbols[]; - int allSymbolsCount = GetAllSymbols( - allSymbols // - ); - - // - string watchListSymbols[]; - int watchListSymbolsCount = GetAllSymbols( - watchListSymbols, - true // - ); - - // - Clean(x121EAUsedSymbols); - if (x121EAUseAllSymbols) - { - // - Copy( - allSymbols, - x121EAUsedSymbols // - ); - } - else if (x121EAUseAllWatchListSymbols) - { - // - Copy( - watchListSymbols, - x121EAUsedSymbols // - ); - } - else if (IsValidSize(inputSymbolsCount)) - { - // - Copy( - inputSymbols, - x121EAUsedSymbols // - ); - } - else - { - // - Add( - _Symbol, - x121EAUsedSymbols // - ); - } - int symbolsCount = ArraySize(x121EAUsedSymbols); - result = IsValidSize(symbolsCount); - if (!result) - { - return result; - } - - // - x121EA = new XSCX121SetupEA( - x121EASlippage, - x121EAMagicNumber // - ); - - // - // Configure EA Class Instance ... - - // - // Signals ... - x121EA.AllowLong(x121EAAllowLong); - x121EA.AllowShort(x121EAAllowShort); - x121EA.DelayBetweenTwoSignal(x121EADelayBetweenTwoSignal); - x121EA.ExecuteSignalsOnBreakout(x121EAExecuteSignalsOnBreakout); - x121EA.ReuiredSignalVerifications(x121EAReuiredSignalVerifications); - x121EA.GetVerificationFromOtherTimeFrames(x121EAGetVerificationFromOtherTimeFrames); - - // - // Risk Management ... - x121EA.Volume(x121EAVolume); - x121EA.TPPoint(x121EATPPoint); - x121EA.SLPoint(x121EASLPoint); - x121EA.IgnoreSL(x121EAIgnoreSL); - x121EA.IgnoreTP(x121EAIgnoreTP); - x121EA.MaxAllowedTrades(x121EAMaxAllowedTrades); - x121EA.IncreaseNextSignalsVolume(x121EAIncreaseNextSignalsVolume); - x121EA.UseMaxAllowedPerDirection(x121EAUseMaxAllowedPerDirection); - x121EA.MinFreeMargingForOpenTrades(x121EAMinFreeMargingForOpenTrades); - x121EA.IncreaseNextSignalsVolumeMultiplier(x121EAIncreaseNextSignalsVolumeMultiplier); - x121EA.AcceptNextDirectionalSignalsWhenFirstInProfit(x121EAAcceptNextDirectionalSignalsWhenFirstInProfit); - - // - // Protection ... - - // - // Signalling ... - x121EA.CloseOnOpposit(x121EACloseOnOpposit); - x121EA.EndSignallingHoure(x121EAEndSignallingHoure); - x121EA.CloseOnSpecificTime(x121EACloseOnSpecificTime); - x121EA.StartSignallingHoure(x121EAStartSignallingHoure); - - // - // Trailling ... - x121EA.AllowTrailStop(x121EAAllowTrailStop); - x121EA.NextTrailPoint(x121EANextTrailPoint); - x121EA.FirstTrailPoint(x121EAFirstTrailPoint); - x121EA.NextTrailDistance(x121EANextTrailDistance); - x121EA.FirstTrailDistance(x121EAFirstTrailDistance); - x121EA.DisableTrailingWhenOpposit(x121EADisableTrailingWhenOpposit); - - // - // Supporting ... - x121EA.AllowSupport(x121EAAllowSupport); - x121EA.SupportOnlyForces(x121EASupportOnlyForces); - x121EA.SupportDistance(x121EASupportDistance); - x121EA.MaxNumberOfSupports(x121EAMaxNumberOfSupports); - x121EA.SupportVolumeMultiplier(x121EASupportVolumeMultiplier); - x121EA.MaxAllowedSupportVolume(x121EAMaxAllowedSupportVolume); - - // - // Grid ... - x121EA.AllowGrid(x121EAAllowGrid); - x121EA.GridOnlyForces(x121EAGridOnlyForces); - x121EA.GridDistance(x121EAGridDistance); - x121EA.MaxNumberOfGrids(x121EAMaxNumberOfGrids); - x121EA.GridVolumeMultiplier(x121EAGridVolumeMultiplier); - x121EA.MaxAllowedGridVolume(x121EAMaxAllowedGridVolume); - - // - // Recovery ... - x121EA.AllowRecovery(x121EAAllowRecovery); - x121EA.RecoverOnlyForces(x121EARecoverOnlyForces); - x121EA.RecoveryDistance(x121EARecoveryDistance); - x121EA.MaxNumberOfRecoveries(x121EAMaxNumberOfRecoveries); - x121EA.RecoveryVolumeMultiplier(x121EARecoveryVolumeMultiplier); - x121EA.MaxAllowedRecoveryVolume(x121EAMaxAllowedRecoveryVolume); - - // - // Hedging ... - x121EA.RestingAfterHedge(x121EARestingAfterHedge); - x121EA.MinProfitPerTrade(x121EAMinRequiredProfitPerTrade); - x121EA.MinProfitPerVolumeFactor(x121EAMinRequiredProfitPerVolumeFactor); - - // - // Alert ... - x121EA.SetAlertPrefix(ShortName); - x121EA.SetAlertEnableAlerts(x121EAEnableAlerts); - x121EA.SetAlertLogAlerts(x121EALogAlerts); - x121EA.SetAlertMailAlerts(x121EAMailAlerts); - x121EA.SetAlertPushAlerts(x121EAPushAlerts); - x121EA.SetAlertTerminalAlerts(x121EATerminalAlerts); - - // - // Configure Indicators ... - X121SetupInputs setupInputsDefault; - setupInputsDefault.Default(); - X121PreConfigureStyles(setupInputsDefault); - - // - // Prepare Providers and Add them into mX121EA class ... - for (int i = 0; i < symbolsCount; i++) - { - // - // Requirements ... - string iSymbol = x121EAUsedSymbols[i]; - ENUM_TIMEFRAMES iHostPeriod = _Period; - - // - XSCX121SetupCycles *iSetupCycle; - iSetupCycle = new XSCX121SetupCycles(); - result = iSetupCycle.Init( - setupInputsDefault, - iSymbol, - iHostPeriod // - ); - if (!result) - { - break; - } - - // - result = x121EA.AddSetup(iSetupCycle); - if (!result) - { - break; - } - } - - // - return result; -} - -// -void X121PreConfigureStyles(X121SetupInputs &inputs) -{ - // - // XHTD ... - inputs.htdInputs.show = false; - - // - // XATSL ... - inputs.atslInputs.show = false; - - // - // XSLN ... - inputs.slnInputs.show = false; - - // - // XDMNT ... - inputs.dmntInputs.showBull = false; - inputs.dmntInputs.showBear = false; - - // - // XSTR ... - inputs.strInputs.showTrends = false; - inputs.strInputs.fillTrends = false; - - // - // XPV ... - inputs.pvInputs.showPeaksAndVales = false; - inputs.pvInputs.showLevels = false; - inputs.pvInputs.showConsolidations = false; - inputs.pvInputs.showFibo1Levels = false; - inputs.pvInputs.showFibo2Levels = false; - inputs.pvInputs.showFibo3Levels = false; - inputs.pvInputs.showFibo4Levels = false; - inputs.pvInputs.showFibo5Levels = false; - - // - // XMC ... - inputs.mcInputs.showSar = false; - inputs.mcInputs.showFastMa = false; - inputs.mcInputs.showSlowMa = false; - inputs.mcInputs.showVerifierMa = false; - - // - // XHK ... - inputs.hkInputs.drawHikenAshi = false; - inputs.hkInputs.drawSmoothedHikenAshi = false; - - // - // XCHE ... - inputs.cheInputs.showLongExit1Line = false; - inputs.cheInputs.showShortExit1Line = false; - inputs.cheInputs.showLongExit2Line = false; - inputs.cheInputs.showShortExit2Line = false; - - // - // XICH ... - inputs.ichInputs.showTenkanSen = false; - inputs.ichInputs.showKijunSen = false; - inputs.ichInputs.showKijunSenPlus = false; - inputs.ichInputs.showKijunSenNegative = false; - inputs.ichInputs.showChikouSpan = false; - inputs.ichInputs.showSenkouSpanA = false; - inputs.ichInputs.showSenkouSpanB = false; - inputs.ichInputs.showKumo = false; - - // - // XMRB ... - inputs.mrbInputs.showFastMa = false; - inputs.mrbInputs.showSlowMa = false; - inputs.mrbInputs.showRibbon = false; - - // - // XASCT ... - inputs.asctInputs.showLongs = false; - inputs.asctInputs.showShorts = false; - - // - // XSSLC ... - inputs.sslcInputs.showUp = false; - inputs.sslcInputs.showDown = false; - - // - // XHULL ... - inputs.hullInputs.showUpZone = false; - inputs.hullInputs.showDownZone = false; -} - -// -void X121ReportState() -{ - // - string comment = NULL; - - // - comment = - ShortName + "\n" + - "------------" + "\n" + - "Trading Symbols: " + ToString(ArraySize(x121EAUsedSymbols)) + "\n" + "\n"; - - // - // Detect What we Want to Show as Comment ... - // bool isInForceState = x121EA.ForceState(); - double bullishScore = 0; // x121EA.GetBullishScore(); - double bearishScore = 0; // x121EA.GetBearishScore(); - double drawDownPercent = x121EA.GetDrawdownPercent(); - - // - comment += - // - (bullishScore > 0 || bearishScore > 0 - ? "Scores:" + "\n" + - "------------" + "\n" + - "Bullish: " + ToString(bullishScore) + "\n" + - "Bearish: " + ToString(bearishScore) + "\n" + - "------------" + "\n" - : "") + - "Drawdown: " + ToString(drawDownPercent) + "%" + "\n" + - // "------------" + "\n" + - // "Force State: " + ToString(isInForceState) + "\n" + - // - "" - // - ; - - // - XPosition positions[]; - int positionsCount = x121EA.mTrader.GetPositions( - positions // - ); - if (IsValidSize(positionsCount)) - { - // - int longs = 0; - double longVolumes = 0; - double longProfits = 0; - - // - int shorts = 0; - double shortVolumes = 0; - double shortProfits = 0; - - // - // Retrieve Required Informations of Positions ... - CountPositions( - positions, - longs, - longProfits, - longVolumes, - shorts, - shortProfits, - shortVolumes // - ); - - // - comment += - // - "------------" + "\n" + - "Positions: " + "\n" + - "------------" + "\n" + - (longs <= 0 - ? "" - : "\n" + "Longs:" + "\n" + - "------------" + "\n" + - "Count: " + ToString(longs) + "\n" + - "Profits: " + ToString(longProfits) + "\n" + - "" - // - ) + - // - (shorts <= 0 - ? "" - : "\n" + "Shorts:" + "\n" + - "------------" + "\n" + - "Count: " + ToString(shorts) + "\n" + - "Profits: " + ToString(shortProfits) + "\n" + - "" - // - ) + - // - "" - // - ; - } - - // - if (positionsCount > 1 && x121EAMinRequiredProfitPerTrade > 0 && x121EAMinRequiredProfitPerVolumeFactor > 0) - { - // - double profit = SpecifiedCalculatePositionsProfit( - positions // - ); - double requiredProfitForHedge = SpecifiedCalculateRequiredProfitForHedge( - positions, - x121EAMinRequiredProfitPerTrade, - x121EAMinRequiredProfitPerVolumeFactor // - ); - - // - comment += - // - "\n" + "Hedging: " + "\n" + - "------------" + "\n" + - "Profits: " + ToString(profit) + "\n" + - "RequiredProft: " + ToString(requiredProfitForHedge) + "\n" + - // - "" - // - ; - } - - // - if (IsValid(comment)) - { - Comment(comment); - } -} - -// diff --git a/Indicators/x-saherelm.xrl.mq5 b/Indicators/x-saherelm.xrl.mq5 index d7689f9e..f8b1f733 100644 --- a/Indicators/x-saherelm.xrl.mq5 +++ b/Indicators/x-saherelm.xrl.mq5 @@ -30,16 +30,16 @@ // input group "Market"; input group "Fast"; -input int fastLength = 9; // Length -input ENUM_APPLIED_PRICE fastAppliedTo = PRICE_CLOSE; // Applied To -input int slowLength = 18; // Length -input ENUM_APPLIED_PRICE slowAppliedTo = PRICE_CLOSE; // Applied To +input int fastLength = 9; // Length +input ENUM_APPLIED_PRICE fastAppliedTo = PRICE_CLOSE; // Applied To +input int slowLength = 18; // Length +input ENUM_APPLIED_PRICE slowAppliedTo = PRICE_CLOSE; // Applied To // input group "Presentation"; -input bool showFast = true; // Show Fast -input bool showSlow = true; // Show Slow -input bool showVerifier = true; // Show Verifier +input bool showFast = true; // Show Fast +input bool showSlow = true; // Show Slow +input bool showVerifier = true; // Show Verifier // // Buffers ... @@ -52,16 +52,16 @@ input bool showVerifier = true; // Show Verifier #property indicator_plots 6 // -#define hideColorIDX 0 +#define hideColorIDX 0 #define neuturalColorIDX 1 -#define bullColorIDX 2 -#define bearColorIDX 3 +#define bullColorIDX 2 +#define bearColorIDX 3 // // Fast ... // -#define fastBufferIndex 0 +#define fastBufferIndex 0 #define fastBufferPlotIndex 0 double fastBuffer[]; @@ -80,7 +80,7 @@ double fastBufferColor[]; // Slow ... // -#define slowBufferIndex 2 +#define slowBufferIndex 2 #define slowBufferPlotIndex 1 double slowBuffer[]; @@ -99,7 +99,7 @@ double slowBufferColor[]; // Verifier ... // -#define verifierBufferIndex 4 +#define verifierBufferIndex 4 #define verifierBufferPlotIndex 2 double verifierBuffer[]; @@ -137,12 +137,10 @@ XLinearRegression verifierCalculator; // // Initialization ... -int OnInit() -{ +int OnInit() { // // Validate Inputs ... - if (!ValidateInputs()) - { + if(!ValidateInputs()) { return INIT_PARAMETERS_INCORRECT; } @@ -168,8 +166,7 @@ int OnInit() // // DeInitialization ... -void OnDeinit(const int reason) -{ +void OnDeinit(const int reason) { // // REASON_PROGRAM 0 The EA has stopped working calling the ExpertRemove() function // REASON_REMOVE 1 Program removed from a chart @@ -186,150 +183,52 @@ void OnDeinit(const int reason) // // Calculating what we want ... int OnCalculate( - const int rates_total, // Total Bars on Chart ... - const int prev_calculated, // Total Calculated Bars on Charts ... - const datetime &time[], // History of Open Time ... - const double &open[], // History of Open Price ... - const double &high[], // History of High Price ... - const double &low[], // History of Low Price ... - const double &close[], // History of Close Price ... - const long &tick_volume[], // History of Tick Volumes on Bar ... - const long &volume[], // History of Trade Volumes ... - const int &spread[] // History of Spread Price ... -) -{ + const int rates_total, // Total Bars on Chart ... + const int prev_calculated, // Total Calculated Bars on Charts ... + const datetime &time[], // History of Open Time ... + const double &open[], // History of Open Price ... + const double &high[], // History of High Price ... + const double &low[], // History of Low Price ... + const double &close[], // History of Close Price ... + const long &tick_volume[], // History of Tick Volumes on Bar ... + const long &volume[], // History of Trade Volumes ... + const int &spread[] // History of Spread Price ... +) { // int limit = (prev_calculated > 0) ? prev_calculated - 1 : 0; - // - // Calculate Verifier ... - for (int i = limit; i < rates_total && !IsStopped(); i++) - { - // - double verifierSlope; - double verifierIntercept; - - // - double verifierAppliedPrice = iGetPrice(slowAppliedTo, open[i], high[i], low[i], close[i]); - - // - double verifier = verifierCalculator.Calculate( - verifierAppliedPrice, - slowLength, - verifierSlope, - verifierIntercept, - i, - rates_total // - ); - verifierBuffer[i] = verifier; - - // - double verifierColor = - (i > 0) - ? (verifierBuffer[i] > verifierBuffer[i - 1]) - ? bullColorIDX - : (verifierBuffer[i] < verifierBuffer[i - 1]) - ? bearColorIDX - : verifierBuffer[i - 1] - : neuturalColorIDX; - verifierBufferColor[i] = verifierColor; - } - - // - // Fast ... - - // - // Calculate Fast Intercept and Slope ... - double fastSlope = 0; - double fastIntercept = 0; - for (int i = limit; i < rates_total && !IsStopped(); i++) - { - // - double fastAppliedPrice = iGetPrice(fastAppliedTo, open[i], high[i], low[i], close[i]); - - // - double fastLRValue = fastCalculator.Calculate( - fastAppliedPrice, - fastLength, - fastSlope, - fastIntercept, - i, - rates_total // - ); - fastLRBuffer[i] = fastLRValue; - } - // // Calculate Fast ... - for (int i = 0; i < fastLength && !IsStopped(); i++) - { - // - double fast = fastIntercept + fastSlope * (fastLength - i - 1); - fastBuffer[rates_total - i - 1] = fast; - - // - double fastColor = - (fastSlope > 0) - ? bullColorIDX - : (fastSlope < 0) - ? bearColorIDX - : neuturalColorIDX; - - // - fastBufferColor[rates_total - i - 1] = fastColor; - } - - // - int fastDrawBegin = rates_total - fastLength; - PlotIndexSetInteger(fastBufferIndex, PLOT_DRAW_BEGIN, fastDrawBegin); - - // - // Slow ... - - // - // Calculate Slow Intercept and Slope ... - double slowSlope = 0; - double slowIntercept = 0; - for (int i = limit; i < rates_total && !IsStopped(); i++) - { - // - double slowAppliedPrice = iGetPrice(slowAppliedTo, open[i], high[i], low[i], close[i]); - - // - double slowLRValue = slowCalculator.Calculate( - slowAppliedPrice, - slowLength, - slowSlope, - slowIntercept, - i, - rates_total // - ); - slowLRBuffer[i] = slowLRValue; - } + CalculateFast( + open, + high, + low, + close, + limit, + rates_total // + ); // // Calculate Slow ... - for (int i = 0; i < slowLength && !IsStopped(); i++) - { - // - double slow = slowIntercept + slowSlope * (slowLength - i - 1); - slowBuffer[rates_total - i - 1] = slow; - - // - double slowColor = - (slowSlope > 0) - ? bullColorIDX - : (slowSlope < 0) - ? bearColorIDX - : neuturalColorIDX; - - // - slowBufferColor[rates_total - i - 1] = slowColor; - } + CalculateSlow( + open, + high, + low, + close, + limit, + rates_total // + ); // - int slowDrawBegin = rates_total - slowLength; - PlotIndexSetInteger(slowBufferIndex, PLOT_DRAW_BEGIN, slowDrawBegin); + // Calculate Verifier ... + CalculateVerifier( + open, + high, + low, + close, + limit, + rates_total // + ); // return rates_total; @@ -340,8 +239,7 @@ int OnCalculate( // // Validate Input Args for Initialization ... -bool ValidateInputs() -{ +bool ValidateInputs() { // bool result = false; @@ -356,8 +254,7 @@ bool ValidateInputs() // // Retrieve all Exists Input Max Length ... // use for Start Of Drawing ... -int ExtractMaxLengthOfInputs() -{ +int ExtractMaxLengthOfInputs() { // int result = 0; @@ -371,15 +268,13 @@ int ExtractMaxLengthOfInputs() // // Set Indicator Short Name and also we can define Buffers Labels ... -void SetIndicatorName() -{ +void SetIndicatorName() { IndicatorSetString(INDICATOR_SHORTNAME, ShortName); } // // Define Indexes and Styles ... -void DefineBuffers() -{ +void DefineBuffers() { // // Fast ... @@ -391,8 +286,9 @@ void DefineBuffers() SetIndexBuffer(fastBufferColorIndex, fastBufferColor, INDICATOR_COLOR_INDEX); // - PlotIndexSetInteger(fastBufferIndex, PLOT_SHOW_DATA, showFast); - PlotIndexSetInteger(fastBufferIndex, PLOT_DRAW_TYPE, fastDrawType); + PlotIndexSetDouble(fastBufferPlotIndex, PLOT_EMPTY_VALUE, 0); + PlotIndexSetInteger(fastBufferPlotIndex, PLOT_SHOW_DATA, showFast); + PlotIndexSetInteger(fastBufferPlotIndex, PLOT_DRAW_TYPE, fastDrawType); // // Slow ... @@ -405,8 +301,9 @@ void DefineBuffers() SetIndexBuffer(slowBufferColorIndex, slowBufferColor, INDICATOR_COLOR_INDEX); // - PlotIndexSetInteger(slowBufferIndex, PLOT_SHOW_DATA, showSlow); - PlotIndexSetInteger(slowBufferIndex, PLOT_DRAW_TYPE, slowDrawType); + PlotIndexSetDouble(slowBufferPlotIndex, PLOT_EMPTY_VALUE, 0); + PlotIndexSetInteger(slowBufferPlotIndex, PLOT_SHOW_DATA, showSlow); + PlotIndexSetInteger(slowBufferPlotIndex, PLOT_DRAW_TYPE, slowDrawType); // // Verifier ... @@ -419,8 +316,9 @@ void DefineBuffers() SetIndexBuffer(verifierBufferColorIndex, verifierBufferColor, INDICATOR_COLOR_INDEX); // - PlotIndexSetInteger(verifierBufferIndex, PLOT_SHOW_DATA, showVerifier); - PlotIndexSetInteger(verifierBufferIndex, PLOT_DRAW_TYPE, verifierDrawType); + PlotIndexSetDouble(verifierBufferPlotIndex, PLOT_EMPTY_VALUE, 0); + PlotIndexSetInteger(verifierBufferPlotIndex, PLOT_SHOW_DATA, showVerifier); + PlotIndexSetInteger(verifierBufferPlotIndex, PLOT_DRAW_TYPE, verifierDrawType); // // Data Buffers ... @@ -430,4 +328,153 @@ void DefineBuffers() SetIndexBuffer(slowLRBufferIndex, slowLRBuffer, INDICATOR_CALCULATIONS); } +// +// Custom Functions ... + +// +void CalculateFast( + const double &open[], // History of Open Price ... + const double &high[], // History of High Price ... + const double &low[], // History of Low Price ... + const double &close[], // History of Close Price ... + int limit, + const int rates_total // +) { + // + // Fast ... + + // + // Calculate Fast Intercept and Slope ... + double fastSlope = 0; + double fastIntercept = 0; + for(int i = limit; i < rates_total && !IsStopped(); i++) { + // + double fastAppliedPrice = iGetPrice(fastAppliedTo, open[i], high[i], low[i], close[i]); + + // + double fastLRValue = fastCalculator.Calculate( + fastAppliedPrice, + fastLength, + fastSlope, + fastIntercept, + i, + rates_total // + ); + fastLRBuffer[i] = fastLRValue; + } + + // + // Calculate Fast ... + for(int i = 0; i < fastLength && !IsStopped(); i++) { + // + double fast = fastIntercept + fastSlope * (fastLength - i - 1); + fastBuffer[rates_total - i - 1] = fast; + + // + double fastColor = + (fastSlope > 0) ? bullColorIDX : (fastSlope < 0) ? bearColorIDX : + neuturalColorIDX; + + // + fastBufferColor[rates_total - i - 1] = fastColor; + } + + // + int fastDrawBegin = rates_total - fastLength; + PlotIndexSetInteger(fastBufferPlotIndex, PLOT_DRAW_BEGIN, fastDrawBegin); +} + +// +void CalculateSlow( + const double &open[], // History of Open Price ... + const double &high[], // History of High Price ... + const double &low[], // History of Low Price ... + const double &close[], // History of Close Price ... + int limit, + const int rates_total // +) { + // + // Slow ... + + // + // Calculate Slow Intercept and Slope ... + double slowSlope = 0; + double slowIntercept = 0; + for(int i = limit; i < rates_total && !IsStopped(); i++) { + // + double slowAppliedPrice = iGetPrice(slowAppliedTo, open[i], high[i], low[i], close[i]); + + // + double slowLRValue = slowCalculator.Calculate( + slowAppliedPrice, + slowLength, + slowSlope, + slowIntercept, + i, + rates_total // + ); + slowLRBuffer[i] = slowLRValue; + } + + // + // Calculate Slow ... + for(int i = 0; i < slowLength && !IsStopped(); i++) { + // + double slow = slowIntercept + slowSlope * (slowLength - i - 1); + slowBuffer[rates_total - i - 1] = slow; + + // + double slowColor = + (slowSlope > 0) ? bullColorIDX : (slowSlope < 0) ? bearColorIDX : + neuturalColorIDX; + + // + slowBufferColor[rates_total - i - 1] = slowColor; + } + + // + int slowDrawBegin = rates_total - slowLength; + PlotIndexSetInteger(slowBufferPlotIndex, PLOT_DRAW_BEGIN, slowDrawBegin); +} + +// +void CalculateVerifier( + const double &open[], // History of Open Price ... + const double &high[], // History of High Price ... + const double &low[], // History of Low Price ... + const double &close[], // History of Close Price ... + int limit, + const int rates_total // +) { + // + // Calculate Verifier ... + for(int i = limit; i < rates_total && !IsStopped(); i++) { + // + double verifierSlope; + double verifierIntercept; + + // + double verifierAppliedPrice = iGetPrice(slowAppliedTo, open[i], high[i], low[i], close[i]); + + // + double verifier = verifierCalculator.Calculate( + verifierAppliedPrice, + slowLength, + verifierSlope, + verifierIntercept, + i, + rates_total // + ); + verifierBuffer[i] = verifier; + + // + double verifierColor = + (i > 0) ? + (verifierBuffer[i] > verifierBuffer[i - 1]) ? bullColorIDX : (verifierBuffer[i] < verifierBuffer[i - 1]) ? bearColorIDX : + verifierBuffer[i - 1] : + neuturalColorIDX; + verifierBufferColor[i] = verifierColor; + } +} + // \ No newline at end of file diff --git a/MQL5.code-workspace b/MQL5.code-workspace index 1c16752b..395aab15 100644 --- a/MQL5.code-workspace +++ b/MQL5.code-workspace @@ -8,6 +8,6 @@ "C_Cpp.default.includePath": [ "c:\\Users\\saherelm\\AppData\\Roaming\\MetaQuotes\\Terminal\\FAE4959D5A0334AE230243FCFFFD4053\\MQL5\\Include" ], - "C_Cpp.clang_format_style": "file:c:\\Users\\SaherElm\\.vscode\\extensions\\l-i-v.mql-tools-2.1.0\\files\\.clang-format" + "C_Cpp.clang_format_style": "file:c:\\Users\\saherelm\\.vscode\\extensions\\l-i-v.mql-tools-2.1.0\\files\\.clang-format" } } \ No newline at end of file