#ifndef STRATEGY_ICT_PRO
#define STRATEGY_ICT_PRO
#include "StrategyBase.mqh"

class StrategyICT : public IStrategy
{
private:
    string lastReason;
    double minRR;

public:
    StrategyICT() { minRR = 1.5; }

    string Name() override { return "ICT Pro Strategy (ATR-FVG)"; }

    string GetLastEntryReason()
    {
        return lastReason;
    }

    bool CheckEntry(double &entryPrice, double &sl, double &tp) override
{
    if (_Period != PERIOD_M1)
        return false;

    if (!IsTrendAligned())
    {
        lastReason = "❌ ناهماهنگ با ساختار بازار (M5)";
        return false;
    }

    double direction = 0.0;
    if (!FindFVG(entryPrice, sl, direction))
    {
        lastReason = "❌ FVG معتبر پیدا نشد";
        return false;
    }

    entryPrice = (direction > 0) ? SymbolInfoDouble(_Symbol, SYMBOL_ASK)
                                 : SymbolInfoDouble(_Symbol, SYMBOL_BID);

    double risk = MathAbs(entryPrice - sl);
    if (risk <= 0)
    {
        lastReason = "❌ فاصله غیرمنطقی SL با Entry";
        return false;
    }

    tp = (direction > 0) ? entryPrice + risk * minRR
                         : entryPrice - risk * minRR;

    tp = NormalizeDouble(tp, _Digits);
    sl = NormalizeDouble(sl, _Digits);
    entryPrice = NormalizeDouble(entryPrice, _Digits);

    // ✅ شرط جدید: بررسی حداقل فاصله 20 پوینت
    double pointDistanceSL = MathAbs(entryPrice - sl);
    double pointDistanceTP = MathAbs(tp - entryPrice);
    double minPoints = 20 * _Point;

    if (pointDistanceSL < minPoints || pointDistanceTP < minPoints)
    {
        lastReason = "❌ فاصله SL یا TP کمتر از ۲۰ پوینت";
        return false;
    }

    lastReason = "✅ ورود بر اساس FVG + روند تایید شده (ATR adjusted)";
    return true;
}

private:
    bool IsTrendAligned()
    {
        double highPrev = iHigh(_Symbol, PERIOD_M5, 2);
        double highLast = iHigh(_Symbol, PERIOD_M5, 1);
        double lowPrev = iLow(_Symbol, PERIOD_M5, 2);
        double lowLast = iLow(_Symbol, PERIOD_M5, 1);

        if (highLast > highPrev && lowLast > lowPrev)
            return (iClose(_Symbol, PERIOD_M5, 0) > iOpen(_Symbol, PERIOD_M5, 0)); // صعودی
        else if (highLast < highPrev && lowLast < lowPrev)
            return (iClose(_Symbol, PERIOD_M5, 0) < iOpen(_Symbol, PERIOD_M5, 0)); // نزولی

        return false;
    }

    bool FindFVG(double &entry, double &sl, double &direction)
    {
        for (int i = 10; i < 100; i++)
        {
            double high1 = iHigh(_Symbol, PERIOD_M1, i);
            double low1 = iLow(_Symbol, PERIOD_M1, i);
            double high2 = iHigh(_Symbol, PERIOD_M1, i - 1);
            double low2 = iLow(_Symbol, PERIOD_M1, i - 1);
            double high3 = iHigh(_Symbol, PERIOD_M1, i - 2);
            double low3 = iLow(_Symbol, PERIOD_M1, i - 2);

            int localatrHandle = iATR(_Symbol, PERIOD_M1, 14);
if (localatrHandle == INVALID_HANDLE)
    return false;

double atrBuffer[];
if (CopyBuffer(localatrHandle, 0, i, 1, atrBuffer) <= 0)
    return false;

double atr = atrBuffer[0];

            if (low1 > high3) // FVG صعودی
            {
                direction = +1;
                sl = low3 - atr * 0.8;
                entry = 0; // پر میشه بعداً
                return true;
            }
            if (high1 < low3) // FVG نزولی
            {
                direction = -1;
                sl = high3 + atr * 0.8;
                entry = 0;
                return true;
            }
        }
        return false;
    }
};

#endif

نظرتو راجب این کلاس استراتژی بگو و نکات اصلاحی و در نهایت نسخه بازنویسی شده اس رو بهم بده