        //
        int zIndex = 0;
        int cIndex = zIndex + 1;
        int pIndex = cIndex + 1;
        int ppIndex = pIndex + 1;

        //
        // Last Bar ...
        XOHCL cBar;
        result = cBar.Init(
            position.symbol,
            position.period,
            cIndex //
        );
        if (!result)
        {
            return result;
        }

        //
        // Previous Bar of Last Bar ...
        XOHCL pBar;
        result = cBar.GetPreviousBar(pBar);
        if (!result)
        {
            return result;
        }

        //
        // Last Swing Low Bar ...
        XOHCL lastSwingLow;
        result = cBar.FindLastSwingLow(lastSwingLow);
        if (!result)
        {
            return result;
        }

        //
        // Last Swing High Bar ...
        XOHCL lastSwingHigh;
        result = cBar.FindLastSwingHigh(lastSwingHigh);
        if (!result)
        {
            return result;
        }

        //
        // Common Conditions For Bullish and Bearish Powers ...

        //
        // For Trend ...
        XOHCL tmpHSW[];
        XOHCL tmpLSW[];

        //
        // Detect Bullish/Bearish Patterns and Trends ...

        //
        // Bullish ...
        bool hasBullishPower = cBar.HasBullishPower();
        bool hasBullishPattern = HasBullishPattern(cBar);
        bool hasBullishPressure = cBar.HasBullishPressure();
        bool isBullishTrend = cBar.HasBullishTrend(
            tmpHSW,
            tmpLSW,
            true //
        );
        bool isBullishTrend1 = cBar.HasBullishTrend(
            tmpHSW,
            tmpLSW,
            false //
        );
        bool hasBullishTrend =
            //
            isBullishTrend
            //
            ||
            //
            isBullishTrend1
            //
            ;

        //
        // Bearish ...
        bool hasBearishPower = cBar.HasBearishPower();
        bool hasBearishPattern = HasBearishPattern(cBar);
        bool hasBearishPressure = cBar.HasBearishPressure();
        bool isBearishTrend = cBar.HasBearishTrend(
            tmpHSW,
            tmpLSW,
            true //
        );
        bool isBearishTrend1 = cBar.HasBearishTrend(
            tmpHSW,
            tmpLSW,
            false //
        );
        bool hasBearishTrend =
            //
            isBearishTrend
            //
            ||
            //
            isBearishTrend1
            //
            ;

        //
        // Define Conditions ...
        MqlTick ticks[];
        int ticksCount = CopyTicks(
            position.symbol,
            ticks,
            COPY_TICKS_ALL,
            0,
            5 //
        );

        //
        // TODO: Check Volume if Required ...

        //
        bool isTicksBullishForLong =
            //
            GetTickExit(ticks[0], POSITION_TYPE_BUY, position.symbol) > GetTickExit(ticks[1], POSITION_TYPE_BUY, position.symbol) &&
            GetTickExit(ticks[1], POSITION_TYPE_BUY, position.symbol) > GetTickExit(ticks[2], POSITION_TYPE_BUY, position.symbol) &&
            GetTickExit(ticks[2], POSITION_TYPE_BUY, position.symbol) > GetTickExit(ticks[3], POSITION_TYPE_BUY, position.symbol)
            //
            ;

        //
        bool isTicksBearishForLong =
            //
            GetTickExit(ticks[0], POSITION_TYPE_BUY, position.symbol) < GetTickExit(ticks[1], POSITION_TYPE_BUY, position.symbol) &&
            GetTickExit(ticks[1], POSITION_TYPE_BUY, position.symbol) < GetTickExit(ticks[2], POSITION_TYPE_BUY, position.symbol) &&
            GetTickExit(ticks[2], POSITION_TYPE_BUY, position.symbol) < GetTickExit(ticks[3], POSITION_TYPE_BUY, position.symbol)
            //
            ;

        //
        bool isTicksBullishForShort =
            //
            GetTickExit(ticks[0], POSITION_TYPE_SELL, position.symbol) > GetTickExit(ticks[1], POSITION_TYPE_SELL, position.symbol) &&
            GetTickExit(ticks[1], POSITION_TYPE_SELL, position.symbol) > GetTickExit(ticks[2], POSITION_TYPE_SELL, position.symbol) &&
            GetTickExit(ticks[2], POSITION_TYPE_SELL, position.symbol) > GetTickExit(ticks[3], POSITION_TYPE_SELL, position.symbol)
            //
            ;

        //
        bool isTicksBearishForShort =
            //
            GetTickExit(ticks[0], POSITION_TYPE_SELL, position.symbol) < GetTickExit(ticks[1], POSITION_TYPE_SELL, position.symbol) &&
            GetTickExit(ticks[1], POSITION_TYPE_SELL, position.symbol) < GetTickExit(ticks[2], POSITION_TYPE_SELL, position.symbol) &&
            GetTickExit(ticks[2], POSITION_TYPE_SELL, position.symbol) < GetTickExit(ticks[3], POSITION_TYPE_SELL, position.symbol)
            //
            ;

        //
        bool hasBullishDecision =
            //
            cBar.IsBullishDecision()
            //
            ;

        //
        bool hasBearishDecision =
            //
            cBar.IsBearishDecision()
            //
            ;

        //
        bool hasBullishConditions =
            //
            (
                //
                hasBullishTrend &&
                hasBullishDecision &&
                (hasBullishPower ||
                 hasBullishPattern ||
                 hasBullishPressure)
                //
                )
            //
            ;

        //
        bool hasBearishConditions =
            //
            (
                //
                hasBearishTrend &&
                hasBearishDecision &&
                (hasBearishPower ||
                 hasBearishPattern ||
                 hasBearishPressure)
                //
                )
            //
            ;
