/////////////////////////////////////////////////////// // // SaherElm IT Center MQL5 Class Library // -------------------------------------- // Name: XSCXOBVGStrategy // 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.xtm.helper.mq5" #include "../Helpers/x-saherelm.xstr.helper.mq5" #include "../Classes/x-saherelm.xstrategy.class.mq5" // string XOBVGStartegyToken = "XOBVG"; // class XSCXOBVGStrategy : public XSCBaseStrategy { // // Public ... public: // // Constructor(s) ... void XSCXOBVGStrategy( // // Base ... string _symbol, // Trading Symbol ENUM_TIMEFRAMES _period, // Trading TimeFrame ENUM_TIMEFRAMES _hindPeriod, // Hind Period ENUM_TIMEFRAMES _mediestPeriod, // Mediest Period 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 // ) { // mHindPeriod = _hindPeriod; mMediestPeriod = _mediestPeriod; // SetAlertPrefix(GetTag()); // hindBar.Clean(); hindBullishOrderBlock.Clean(); hindBearishOrderBlock.Clean(); // medBar.Clean(); medBullishOrderBlock.Clean(); medBearishOrderBlock.Clean(); } // // Deconstructor ... void ~XSCXOBVGStrategy() { } // // Getter / Setter (s) ... // ENUM_TIMEFRAMES HindPeriod() { return mHindPeriod; } // void HindPeriod(ENUM_TIMEFRAMES value) { mHindPeriod = value; } // ENUM_TIMEFRAMES MediestPeriod() { return mMediestPeriod; } // void MediestPeriod(ENUM_TIMEFRAMES value) { mMediestPeriod = value; } // // Overrides ... // // Customize Strategy Identifier ... string GetTag() override { return XOBVGStartegyToken; } // // 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; // XOHCL tmpHSW[]; XOHCL tmpLSW[]; // bool useHammer = true; bool useMorningStar = false; bool useBullishEngulfing = true; bool useBullishMaurubozu = true; // bool useShootingStar = true; bool useEveningStar = false; bool useBearishEngulfing = true; bool useBearishMaurubozu = true; // XOHCL cBar; result = cBar.Init( mSymbol, mPeriod, 1 // ); if (!result) { return result; } // double ll3 = cBar.FindLowest( 3, MODE_LOW // ); double hh3 = cBar.FindHighest( 3, MODE_HIGH // ); // result = hindBar.IsValid(); if (!result) { // result = hindBar.Init( mSymbol, mHindPeriod, 1 // ); if (!result) { return result; } } // bool hasBullishOrderBlock = hindBullishOrderBlock.IsValid(); bool hasBearishOrderBlock = hindBearishOrderBlock.IsValid(); result = // hasBullishOrderBlock // || // hasBearishOrderBlock // ; if (!result) { // hasBullishOrderBlock = hindBar.HasBullishOrderBlock(hindBullishOrderBlock); hasBearishOrderBlock = hindBar.HasBearishOrderBlock(hindBearishOrderBlock); // result = // hasBullishOrderBlock // || // hasBearishOrderBlock // ; if (!result) { // hindBar.Clean(); return result; } } // if (hasBullishOrderBlock) { // DrawBullishOrderBlock( hindBullishOrderBlock, ChartID() // ); // // Try to Detect and Order Block Inside this ... // in Mediest ... result = medBar.IsValid(); if (!result) { // result = medBar.Init( mSymbol, mMediestPeriod, 1 // ); if (!result) { // medBar.Clean(); return result; } } // result = medBar.HasBullishOrderBlock(medBullishOrderBlock); if (!result) { // medBar.Clean(); return result; } // DrawBullishOrderBlock( medBullishOrderBlock, ChartID() // ); // // Check Order Block Is Inside HINDOB ... result = // (medBullishOrderBlock.low >= hindBullishOrderBlock.low && medBullishOrderBlock.low <= hindBullishOrderBlock.high) // || // (medBullishOrderBlock.high <= hindBullishOrderBlock.high && medBullishOrderBlock.high >= hindBullishOrderBlock.low) // ; // if (result) { // // Check Price ... result = // ll3 < medBullishOrderBlock.high && ll3 > hindBullishOrderBlock.low // ; if (!result) { // hindBar.Clean(); hindBullishOrderBlock.Clean(); hindBearishOrderBlock.Clean(); // medBar.Clean(); medBullishOrderBlock.Clean(); medBearishOrderBlock.Clean(); // fvgUpper = 0; fvgLower = 0; // RemoveDraws(); // return result; } // hasLong = result; } else { // // Detect and FVG Inside ... result = medBar.HasBullishFVG( fvgUpper, fvgLower // ); if (!result) { // hindBar.Clean(); hindBullishOrderBlock.Clean(); hindBearishOrderBlock.Clean(); // medBar.Clean(); medBullishOrderBlock.Clean(); medBearishOrderBlock.Clean(); // fvgUpper = 0; fvgLower = 0; // RemoveDraws(); // return result; } // DrawBullishFVG( medBar, fvgUpper, fvgLower, ChartID() // ); // result = // (fvgLower >= hindBullishOrderBlock.low && fvgLower <= hindBullishOrderBlock.high) // || // (fvgUpper <= hindBullishOrderBlock.high && fvgUpper >= hindBullishOrderBlock.low) // ; // // Check Price ... result = // ll3 < fvgUpper && ll3 > hindBullishOrderBlock.low // ; if (!result) { // hindBar.Clean(); hindBullishOrderBlock.Clean(); hindBearishOrderBlock.Clean(); // medBar.Clean(); medBullishOrderBlock.Clean(); medBearishOrderBlock.Clean(); // fvgUpper = 0; fvgLower = 0; // RemoveDraws(); // return result; } // hasLong = result; } } // if (hasBearishOrderBlock) { // DrawBearishOrderBlock( hindBearishOrderBlock, ChartID() // ); // // Try to Detect and Order Block Inside this ... // in Mediest ... result = medBar.IsValid(); if (!result) { // result = medBar.Init( mSymbol, mMediestPeriod, 1 // ); if (!result) { // medBar.Clean(); return result; } } // result = medBar.HasBearishOrderBlock(medBearishOrderBlock); if (!result) { // medBar.Clean(); return result; } // DrawBearishOrderBlock( medBearishOrderBlock, ChartID() // ); // // Check Order Block Is Inside HINDOB ... result = // (medBullishOrderBlock.low >= hindBearishOrderBlock.low && medBearishOrderBlock.low <= hindBearishOrderBlock.high) // || // (medBearishOrderBlock.high <= hindBearishOrderBlock.high && medBearishOrderBlock.high >= hindBearishOrderBlock.low) // ; if (!result) { // // Detect and FVG Inside ... result = medBar.HasBearishFVG( fvgUpper, fvgLower // ); if (!result) { // hindBar.Clean(); hindBullishOrderBlock.Clean(); hindBearishOrderBlock.Clean(); // medBar.Clean(); medBullishOrderBlock.Clean(); medBearishOrderBlock.Clean(); // fvgUpper = 0; fvgLower = 0; // RemoveDraws(); // return result; } // DrawBearishFVG( medBar, fvgUpper, fvgLower, ChartID() // ); // result = // (fvgLower >= hindBearishOrderBlock.low && fvgLower <= hindBearishOrderBlock.high) // || // (fvgUpper <= hindBearishOrderBlock.high && fvgUpper >= hindBearishOrderBlock.low) // ; if (!result) { // hindBar.Clean(); hindBullishOrderBlock.Clean(); hindBearishOrderBlock.Clean(); // medBar.Clean(); medBullishOrderBlock.Clean(); medBearishOrderBlock.Clean(); // fvgUpper = 0; fvgLower = 0; // RemoveDraws(); // return result; } } } // result = hasLong || hasShort; if (!result) { return result; } // if (hasLong) { // // Long ... // bool isHammer = !useHammer ? false : cBar.IsHammer(); bool isMorningStar = !useMorningStar ? false : cBar.IsMorningStar(); bool isBullishMarubozu = !useBullishEngulfing ? false : cBar.IsBullishMarubozu(); bool isBullishEngulfing = !useBullishMaurubozu ? false : cBar.IsBullishEngulfing(); // bool isBullishTrend = cBar.HasBullishTrend( tmpHSW, tmpLSW, true // ); // // Find Swing Low Above of EMA ... // Find Swing High Above of EMA ... // Fins Swing Low Below of EMA ... // Detect Bullish Pattern ... hasLong = // true // && // ( // isHammer // || // isMorningStar // || // isBullishMarubozu // || // isBullishEngulfing // ) // ; if (hasLong) { // type = POSITION_TYPE_BUY; // // sl = tmpLSW[ArraySize(tmpLSW) - 1].low; } } // if (hasShort) { // // Short ... bool isShootingStar = !useShootingStar ? false : cBar.IsShootingStar(); bool isEveningStar = !useEveningStar ? false : cBar.IsEveningStar(); bool isBearishEngulfing = !useBearishEngulfing ? false : cBar.IsBearishEngulfing(); bool isBearishMaurubozu = !useBearishMaurubozu ? false : cBar.IsBearishMarubozu(); // bool isBearishTrend = cBar.HasBearishTrend( tmpHSW, tmpLSW, true // ); // hasShort = // false // && // ( // isShootingStar // || // isEveningStar // || // isBearishEngulfing // || // isBearishMaurubozu // ) // ; if (hasShort) { // type = POSITION_TYPE_SELL; // // sl = tmpHSW[ArraySize(tmpHSW) - 1].high; } } // result = hasLong || hasShort; if (!result) { return result; } // 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 ... // ENUM_TIMEFRAMES mHindPeriod; // Hind Period ENUM_TIMEFRAMES mMediestPeriod; // Mediest Period // // Private ... private: // // Props ... // XOHCL hindBar; XOHCL hindBullishOrderBlock; XOHCL hindBearishOrderBlock; // XOHCL medBar; XOHCL medBullishOrderBlock; XOHCL medBearishOrderBlock; // double fvgUpper; double fvgLower; }; //