//+------------------------------------------------------------------+ //| MajorStructure_Bias_EA.mq5 | //| Step 1: 4H Major Structure & Bias Logic | //+------------------------------------------------------------------+ #property copyright "Professional Trader & AI Assistant" #property version "1.00" #property strict //--- Input Parameters input int MajorSwingLookback = 5; // تعداد کندل‌های چپ و راست برای تایید سوئینگ ماژور (در 4H = 5 یعنی 40 ساعت) input int MaxBarsToScan = 200; // حداکثر تعداد کندل‌های 4H برای جستجو (برای بهینه‌سازی سرعت) //--- Global Variables int lastMajorHighIndex = -1; int lastMajorLowIndex = -1; double lastMajorHighPrice = 0; double lastMajorLowPrice = 0; datetime lastMajorHighTime = 0; datetime lastMajorLowTime = 0; string biasDirection = "NEUTRAL"; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { Print("EA Initialized. Scanning 4H Chart for Major Structure..."); return (INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { Comment(""); // پاک کردن داشبورد هنگام حذف EA } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // فقط یک بار در هر کندل جدید 4 ساعته محاسبات را انجام می‌دهیم تا CPU درگیر نشود static datetime lastBarTime = 0; datetime currentBarTime = iTime(_Symbol, PERIOD_H4, 0); if (lastBarTime == currentBarTime) return; lastBarTime = currentBarTime; // 1. دریافت داده‌های تایم فریم 4 ساعته double high[], low[]; datetime time[]; ArraySetAsSeries(high, true); ArraySetAsSeries(low, true); ArraySetAsSeries(time, true); int copiedH = CopyHigh(_Symbol, PERIOD_H4, 0, MaxBarsToScan, high); int copiedL = CopyLow(_Symbol, PERIOD_H4, 0, MaxBarsToScan, low); int copiedT = CopyTime(_Symbol, PERIOD_H4, 0, MaxBarsToScan, time); if (copiedH <= 0 || copiedL <= 0 || copiedT <= 0) { Print("Error copying 4H data."); return; } // 2. پیدا کردن آخرین سقف ماژور lastMajorHighIndex = FindMajorSwing(high, true); if (lastMajorHighIndex != -1) { lastMajorHighPrice = high[lastMajorHighIndex]; lastMajorHighTime = time[lastMajorHighIndex]; } // 3. پیدا کردن آخرین کف ماژور lastMajorLowIndex = FindMajorSwing(low, false); if (lastMajorLowIndex != -1) { lastMajorLowPrice = low[lastMajorLowIndex]; lastMajorLowTime = time[lastMajorLowIndex]; } // 4. تعیین بایاس (جهت بازار) بر اساس قانون تازگی DetermineBias(); // 5. نمایش خروجی روی چارت (داشبورد) DisplayDashboard(); } //+------------------------------------------------------------------+ //| تابع پیدا کردن سوئینگ ماژور (سقف یا کف) | //+------------------------------------------------------------------+ int FindMajorSwing(double &data[], bool isHigh) { // حلقه از کندل‌های قدیمی‌تر به جدیدتر (اندیس بزرگتر به کوچکتر) // ما از MajorSwingLookback شروع می‌کنیم تا کندل‌های کافی برای مقایسه داشته باشیم for (int i = MaxBarsToScan - MajorSwingLookback - 1; i >= MajorSwingLookback; i--) { bool isMajor = true; // بررسی کندل‌های سمت چپ (جدیدتر - اندیس کوچکتر) for (int j = 1; j <= MajorSwingLookback; j++) { if (isHigh) { if (data[i] <= data[i - j]) { isMajor = false; break; } } else { if (data[i] >= data[i - j]) { isMajor = false; break; } } } if (!isMajor) continue; // بررسی کندل‌های سمت راست (قدیمی‌تر - اندیس بزرگتر) for (int j = 1; j <= MajorSwingLookback; j++) { if (isHigh) { if (data[i] <= data[i + j]) { isMajor = false; break; } } else { if (data[i] >= data[i + j]) { isMajor = false; break; } } } // اگر هر دو شرط برقرار بود، این یک سوئینگ ماژور است if (isMajor) return i; } return -1; // پیدا نشد } //+------------------------------------------------------------------+ //| تابع تعیین جهت بازار (Bias) | //+------------------------------------------------------------------+ void DetermineBias() { if (lastMajorHighIndex == -1 || lastMajorLowIndex == -1) { biasDirection = "NEUTRAL (Data Not Found)"; return; } // در آرایه‌های سری، اندیس کوچکتر = زمان جدیدتر if (lastMajorHighIndex < lastMajorLowIndex) { // سقف ماژور جدیدتر از کف ماژور است -> بازار نزولی است biasDirection = "BEARISH (Short Only)"; } else if (lastMajorLowIndex < lastMajorHighIndex) { // کف ماژور جدیدتر از سقف ماژور است -> بازار صعودی است biasDirection = "BULLISH (Long Only)"; } else { biasDirection = "NEUTRAL (Equal Time)"; } } //+------------------------------------------------------------------+ //| تابع نمایش داشبورد روی چارت | //+------------------------------------------------------------------+ void DisplayDashboard() { string dash = "\n========== 4H MAJOR STRUCTURE ==========\n"; dash += "Symbol: " + _Symbol + "\n"; dash += "----------------------------------------\n"; if (lastMajorHighIndex != -1) { dash += "Last MAJOR HIGH: " + DoubleToString(lastMajorHighPrice, _Digits) + "\n"; dash += "High Time: " + TimeToString(lastMajorHighTime, TIME_DATE | TIME_MINUTES) + "\n"; } else { dash += "Last MAJOR HIGH: Not Found\n"; } dash += "----------------------------------------\n"; if (lastMajorLowIndex != -1) { dash += "Last MAJOR LOW: " + DoubleToString(lastMajorLowPrice, _Digits) + "\n"; dash += "Low Time: " + TimeToString(lastMajorLowTime, TIME_DATE | TIME_MINUTES) + "\n"; } else { dash += "Last MAJOR LOW: Not Found\n"; } dash += "========================================\n"; dash += "CURRENT BIAS (Direction): " + biasDirection + "\n"; dash += "========================================\n"; Comment(dash); // چاپ در تب Experts برای لاگ‌گیری Print("Bias Updated: ", biasDirection, " | High Index: ", lastMajorHighIndex, " | Low Index: ", lastMajorLowIndex); } //+------------------------------------------------------------------+