226 lines
7.8 KiB
Plaintext
226 lines
7.8 KiB
Plaintext
//+------------------------------------------------------------------+
|
|
//| 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);
|
|
}
|
|
//+------------------------------------------------------------------+ |