/////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 Class Library // -------------------------------------- // Name: XSCXPVFMCStrategy // Description: provides all based classes for use ... // // // Maintainer: // ------------ // Hadi Khazaee Asl (hadi_khazaee_asl@yahoo.com) // ////////////////////////////////////////////////////// // // Global Properties ... #property library #property copyright "Copyright 2023, SaherElm IT Center" #property link "https://www.saherelm.ir" #property version "1.00" #property strict // // Imports ... #include "../Helpers/x-saherelm.xhk.helper.mq5" #include "../Helpers/x-saherelm.xmc.helper.mq5" #include "../Helpers/x-saherelm.xtd.helper.mq5" #include "../Helpers/x-saherelm.xpv.helper.mq5" #include "../Helpers/x-saherelm.xvlm.helper.mq5" #include "../Helpers/x-saherelm.xosc.helper.mq5" #include "../Classes/x-saherelm.xstrategy.class.mq5" // string XPVFMCStartegyToken = "XPVFMC"; // class XSCXPVFMCStrategy : public XSCBaseStrategy { // // Public ... public: // // Constructor(s) ... void XSCXPVFMCStrategy( // // Base ... string _symbol, // Trading Symbol ENUM_TIMEFRAMES _period, // Trading TimeFrame double _volume, // Voluem double _r2r, // Risk/Reward Ratio int _slippage, // Trader Slippage long _magicNumber, // Trader Magic Number bool _useTPSLAsPoint = false, // Converts TP and SL by Provided Points bool _forceMaxTPSLAsPoint = false, // Force Max TP and SL by Provided Points double _tpPoint = 0, // TP As Point double _slPoint = 0, // SL As Point bool _allowLong = true, bool _allowShort = true, int _maxAllowedLongs = 0, int _maxAllowedShorts = 0 // ) : XSCBaseStrategy(_symbol, _period, _volume, _r2r, _slippage, _magicNumber, _useTPSLAsPoint, _forceMaxTPSLAsPoint, _tpPoint, _slPoint, _allowLong, _allowShort, _maxAllowedLongs, _maxAllowedShorts // ) { // SetAlertPrefix(GetTag()); // PrepareRequirements(); } // // Deconstructor ... void ~XSCXPVFMCStrategy() { // delete mcHelper; delete pvHelper; delete tdHelper; delete hkHelper; delete oscHelper; delete vlmHelper; } // // Getter / Setter (s) ... // // Overrides ... // // Customize Strategy Identifier ... string GetTag() override { return XPVFMCStartegyToken; } // // Check Conditions For Signal ... bool HasSignal( XSignal &signal // ) override { // bool result = false; // signal.Clean(); // double sl = 0; double tp = 0; double risk = 0; double entry = 0; double reward = 0; double r2r = R2R(); ENUM_POSITION_TYPE type = POSITION_TYPE_BUY; ENUM_X_ORDER_MODES mode = X_ORDER_MODE_MARKET; // bool hasLong = false; bool hasShort = false; // // XMC ... XMCConditions mcConditions; result = mcHelper.GetConditions(mcConditions); if (!result) { return result; } // // XPV ... XPVConditions pvConditions; result = pvHelper.GetConditions(pvConditions); if (!result) { return result; } // // XTD ... XTDConditions tdConditions; result = tdHelper.GetConditions(tdConditions); if (!result) { return result; } // // XHK ... XHKConditions hkConditions; result = hkHelper.GetConditions(hkConditions); if (!result) { return result; } // // XVLM ... XVLMConditions vlmConditions; result = vlmHelper.GetConditions(vlmConditions); // double atr = oscHelper.GetATR(1); // double rsis[]; ArraySetAsSeries(rsis, true); oscHelper.CopyRSI( 0, 3, rsis // ); // double points = GetPoints(mSymbol); // int zIndex = 0; int cIndex = zIndex + 1; int pIndex = cIndex + 1; int ppIndex = pIndex + 1; // // For Trend ... XOHCL tmpHSW[]; XOHCL tmpLSW[]; // // For Verifications ... // // Bar On Trading Period ... XOHCL cBar; result = cBar.Init( mSymbol, mPeriod, cIndex // ); if (!result) { return result; } // // // // Find Lowest Low and Highest High ... // double hh3 = cBar.FindHighest( // 3, // MODE_HIGH // // ); // double ll3 = cBar.FindLowest( // 3, // MODE_LOW // // ); // XOHCL pBar; result = cBar.GetPreviousBar(pBar); if (!result) { return result; } // bool hasBullishPattern = HasBullishPattern(cBar); bool isBullishTrend = cBar.HasBullishTrend( tmpHSW, tmpLSW, true // ); // bool hasBearishPattern = HasBearishPattern(cBar); // bool isBearishTrend = cBar.HasBearishTrend( tmpHSW, tmpLSW, false // ); // // Check Support Exists or Find ... bool hasSupport = support.IsValid(); if (!hasSupport) { // hasSupport = // cBar.HasSupport(support) // && // MathAbs(pvConditions.fib3s[cIndex] - support.high) <= 10 * points // ; } // // Check Resistance Exists or Find ... bool hasResistance = resistance.IsValid(); if (!hasResistance) { // hasResistance = // cBar.HasResistance(resistance) // && // MathAbs(pvConditions.fib3s[cIndex] - resistance.low) <= 10 * points // ; } // if (hasSupport) { // DrawSupport( support, ChartID() // ); // supportTime = cBar.time; // // Check Price is Around Support ... double priceDiff = MathMin( MathAbs(cBar.low - support.high), MathAbs(cBar.high - support.high)) / points; result = // priceDiff <= 50 // ; if (!result) { // CheckSupportValidation(); return result; } // if (result && !isSupportTested) { isSupportTested = true; } // // Long ... hasLong = // ( // isBullishTrend // || // hasBullishPattern // ) // && // ( // (tdConditions.isSwitchedToBullish && hkConditions.isSMHKBullish) // || // (hkConditions.isSMHKSwitchedToBullish && tdConditions.isBullish) // || // (mcConditions.isFastCrossedOverSlow && mcConditions.isSlowOverVerifier) // ) // ; // if (hasLong) { // type = POSITION_TYPE_BUY; XOHCL swingLow; bool hasSwing = cBar.FindLastSwingLow(swingLow); if (!hasSwing) { sl = support.high - (50 * points); } else { // DrawSwingLow(swingLow, ChartID()); sl = swingLow.low - atr; RemoveSwingLow(swingLow); swingLow.Clean(); } } } // // // if (hasResistance) // { // // // DrawResistance( // support, // ChartID() // // ); // // // supportTime = cBar.time; // // // // Check Price is Around Support ... // double priceDiff = MathMin( // MathAbs(cBar.low - support.high), // MathAbs(cBar.high - support.high)) / // points; // result = // // // priceDiff <= 50 // // // ; // if (!result) // { // // // CheckResistanceValidation(); // return result; // } // // // if (result && !isResistanceTested) // { // isResistanceTested = true; // } // } // result = hasLong || hasShort; if (!result) { // CheckSupportValidation(); return result; } // if (hasSupport) { // isSupportTested = false; supportTime = NULL; RemoveSupport(support); support.Clean(); } // if (hasResistance) { // isResistanceTested = false; resistanceTime = NULL; RemoveResistance(resistance); resistance.Clean(); } // entry = GetEntry(mSymbol, type); CalculateTPSLByPrice( sl, tp, type, entry, r2r // ); // result = signal.Prepare( mSymbol, GetTag(), mPeriod, type, mode, entry, mVolume, sl, tp // ); // return result; } // // Protected ... protected: // // Props ... // XOHCL support; XOHCL resistance; // // XMC ... XMCInputs mcInputs; XSCXMCHelper *mcHelper; // XTDInputs tdInputs; XSCXTDHelper *tdHelper; // // XPV ... XPVInputs pvInputs; XSCXPVHelper *pvHelper; // // XOSC ... XOSCInputs oscInputs; XSCXOSCHelper *oscHelper; // // XVLM ... XVLMInputs vlmInputs; XSCXVLMHelper *vlmHelper; // // XHK ... XHKInputs hkInputs; XSCXHKHelper *hkHelper; // // Private ... private: // // Props ... // void PrepareRequirements() { // support.Clean(); supportTime = NULL; isSupportTested = false; // resistance.Clean(); resistanceTime = NULL; isResistanceTested = false; // // Prepare XTD ... tdInputs.Default(); // tdHelper = new XSCXTDHelper(); tdHelper.Init( mSymbol, mPeriod, tdInputs // ); // // Preparing XHK ... hkInputs.Default(); hkInputs.smoothingLength = 14; // hkInputs.drawHikenAshi = false; hkInputs.drawSmoothedHikenAshi = true; // hkHelper = new XSCXHKHelper(); hkHelper.Init( mSymbol, mPeriod, hkInputs // ); // // Preparing XMC ... mcInputs.Default(); // mcInputs.showSar = false; mcInputs.showFastMa = true; mcInputs.showSlowMa = true; mcInputs.showVerifierMa = true; // mcHelper = new XSCXMCHelper(); mcHelper.Init( mSymbol, mPeriod, mcInputs // ); // // Preparing XPV ... pvInputs.Default(); // pvInputs.showPeaksAndVales = true; pvInputs.showLevels = false; pvInputs.showConsolidations = false; pvInputs.showFibo1Levels = false; pvInputs.showFibo2Levels = false; pvInputs.showFibo3Levels = true; pvInputs.showFibo4Levels = false; pvInputs.showFibo5Levels = false; // pvHelper = new XSCXPVHelper(); pvHelper.Init( mSymbol, mPeriod, pvInputs // ); // // Preparing XOSC ... oscInputs.Default(); oscHelper = new XSCXOSCHelper(); oscHelper.Init( mSymbol, mPeriod, oscInputs // ); // // Preparing XVLM ... vlmInputs.Default(); vlmHelper = new XSCXVLMHelper(); vlmHelper.Init( mSymbol, mPeriod, vlmInputs // ); } // bool isSupportTested; datetime supportTime; void CheckSupportValidation() { // if (!isSupportTested) { // if (support.IsValid() && IsValid(supportTime)) { // int age = (int)(((int)(TimeToSeconds(TimeCurrent()) - TimeToSeconds(supportTime))) / PeriodSeconds(mPeriod)); if (age >= 50) { // isSupportTested = false; supportTime = NULL; RemoveSupport(support); support.Clean(); } } return; } // XOHCL cBar; bool isInited = cBar.Init( mSymbol, mPeriod, 1 // ); if (!isInited) { return; } // double points = GetPoints(mSymbol); // // Find Price Distance ... double highDiff = MathAbs(cBar.high - support.high); double lowDiff = MathAbs(cBar.low - support.high); // bool isBreaked = MathMax(highDiff, lowDiff) >= 100 * points; if (!isBreaked) { return; } // isSupportTested = false; RemoveSupport(support); supportTime = NULL; support.Clean(); } // bool isResistanceTested; datetime resistanceTime; void CheckResistanceValidation() { // if (!isResistanceTested) { // if (resistance.IsValid() && IsValid(resistanceTime)) { // int age = (int)(((int)(TimeToSeconds(TimeCurrent()) - TimeToSeconds(resistanceTime))) / PeriodSeconds(mPeriod)); if (age >= 50) { // isResistanceTested = false; resistanceTime = NULL; RemoveResistance(resistance); resistance.Clean(); } } return; } // XOHCL cBar; bool isInited = cBar.Init( mSymbol, mPeriod, 1 // ); if (!isInited) { return; } // double points = GetPoints(mSymbol); // // Find Price Distance ... double highDiff = MathAbs(cBar.high - resistance.low); double lowDiff = MathAbs(cBar.low - resistance.low); // bool isBreaked = MathMax(highDiff, lowDiff) >= 100 * points; if (!isBreaked) { return; } // isResistanceTested = false; RemoveResistance(resistance); resistanceTime = NULL; resistance.Clean(); } }; //