//+------------------------------------------------------------------+
//| MoneyCatcher-Ai.mq4 |
//| Copyright 2024, MoneyCatcher AI Systems |
//| https://w...content-available-to-author-only...r.ai |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MoneyCatcher AI Systems"
#property link "https://w...content-available-to-author-only...r.ai"
#property version "3.1"
#property strict
#property description "MoneyCatcher AI - نظام تداول ذكي متقدم"
#property description "باستخدام تقنيات الذكاء الاصطناعي للتداول"
#property description "الدعم: support@moneycatcher.ai"
//+------------------------------------------------------------------+
//| إعدادات النظام الأساسية |
//+------------------------------------------------------------------+
input group "══════════════════ إعدادات النظام ═══════════════════"
input string AuthorizedID = ""; // ID الترخيص (اختياري)
input bool EnableAI = true; // تفعيل نظام الذكاء الاصطناعي
input ENUM_TIMEFRAMES TradingTF = PERIOD_H1; // إطار التداول الرئيسي
input group "═══════════════ إدارة رأس المال ═════════════════"
input double FixedLotSize = 0.1; // حجم اللوت الثابت
input bool UseMoneyManagement = true; // استخدام إدارة رأس المال
input double RiskPercent = 1.5; // نسبة المخاطرة (٪)
input double MaxLotSize = 5.0; // الحد الأقصى للوت
input group "══════════════ إعدادات الوقف ═══════════════════"
input bool UseAutoStopLoss = true; // وقف الخسارة التلقائي
input int StopLossPips = 40; // وقف الخسارة (نقاط)
input bool UseAutoTakeProfit = true; // جني الأرباح التلقائي
input int TakeProfitPips = 80; // جني الأرباح (نقاط)
input bool UseBreakEven = true; // تفعيل نقطة التعادل
input int BreakEvenAt = 20; // تفعيل عند (نقاط)
input group "═══════════════ أوقات التداول ══════════════════"
input bool UseTradingHours = true; // تقييد أوقات التداول
input int TradingStartHour = 2; // ساعة البدء (توقيت السيرفر)
input int TradingEndHour = 22; // ساعة الانتهاء
input bool AvoidNews = true; // تجنب أخبار السوق
input int NewsBufferMinutes = 30; // دقائق قبل/بعد الخبر
input group "═══════════ إعدادات الذكاء الاصطناعي ════════════"
input int AILookbackPeriod = 100; // فترة تحليل الذكاء الاصطناعي
input double AIConfidenceLevel = 0.65; // مستوى ثقة الذكاء الاصطناعي
input bool UseMarketFilter = true; // فلتر حالة السوق
input group "══════════════ إعدادات متقدمة ═════════════════"
input int MagicNumber = 2024001; // الرقم السحري
input int MaxOpenTrades = 3; // الحد الأقصى للصفقات
input int Slippage = 3; // الانزلاق المسموح
input bool EnableHedging = false; // السماح بالتحوط
//+------------------------------------------------------------------+
//| المتغيرات العالمية |
//+------------------------------------------------------------------+
enum MARKET_CONDITION
{
MARKET_TREND_UP, // اتجاه صاعد
MARKET_TREND_DOWN, // اتجاه هابط
MARKET_RANGE, // سوق جانبي
MARKET_VOLATILE // سوق متقلب
};
struct TradeSignal
{
int direction; // 1 للشراء، -1 للبيع، 0 لا إشارة
double confidence; // ثقة الإشارة (0-1)
double entryPrice; // سعر الدخول المقترح
double stopLoss; // وقف الخسارة المقترح
double takeProfit; // جني الأرباح المقترح
string signalName; // اسم الإشارة
};
// المتغيرات
double gPoint;
datetime gLastBarTime;
int gTotalTradesToday;
double gDailyProfit;
double gAccountRisk;
bool gIsNewsTime;
MqlDateTime gCurrentTime;
//+------------------------------------------------------------------+
//| دالة التهيئة |
//+------------------------------------------------------------------+
int OnInit()
{
// ضبط القيم الأساسية
gPoint = _Point;
gLastBarTime = 0;
gTotalTradesToday = 0;
gDailyProfit = 0;
gIsNewsTime = false;
// التحقق من صحة الإعدادات
if(!ValidateSettings())
{
Print("خطأ: إعدادات غير صالحة!");
return INIT_PARAMETERS_INCORRECT;
}
// حساب مخاطرة الحساب
CalculateAccountRisk();
// عرض معلومات النظام
DisplayStartupInfo();
// إنشاء كائنات الرسم (للنسخ المميزة)
if(MQLInfoInteger(MQL_DLLS_ALLOWED))
CreateDashboard();
Print("====== MoneyCatcher AI ======");
Print("الإصدار: ", _Version);
Print("الرمز: ", Symbol());
Print("الرسم البياني: ", EnumToString(Period()));
Print("تم التهيئة بنجاح!");
return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
//| التحقق من صحة الإعدادات |
//+------------------------------------------------------------------+
bool ValidateSettings()
{
if(RiskPercent <= 0 || RiskPercent > 10)
{
Alert("نسبة المخاطرة يجب أن تكون بين 0.1 و 10");
return false;
}
if(FixedLotSize <= 0)
{
Alert("حجم اللوت يجب أن يكون أكبر من الصفر");
return false;
}
if(MaxOpenTrades <= 0)
{
Alert("يجب السماح بفتح صفقة واحدة على الأقل");
return false;
}
return true;
}
//+------------------------------------------------------------------+
//| حساب مخاطرة الحساب |
//+------------------------------------------------------------------+
void CalculateAccountRisk()
{
double balance = AccountInfoDouble(ACCOUNT_BALANCE);
double equity = AccountInfoDouble(ACCOUNT_EQUITY);
gAccountRisk = (equity / balance - 1) * 100;
if(gAccountRisk < -20)
{
Print("تحذير: مخاطرة الحساب مرتفعة: ", DoubleToString(gAccountRisk, 2), "%");
}
}
//+------------------------------------------------------------------+
//| عرض معلومات البدء |
//+------------------------------------------------------------------+
void DisplayStartupInfo()
{
Comment("\n",
"════════════════════════════════════════════════════\n",
" MoneyCatcher AI v3.1 \n",
"════════════════════════════════════════════════════\n",
"الحساب: ", AccountInfoString(ACCOUNT_NAME), "\n",
"الرصيد: $", DoubleToString(AccountInfoDouble(ACCOUNT_BALANCE), 2), "\n",
"الرمز: ", Symbol(), " | ", EnumToString(Period()), "\n",
"════════════════════════════════════════════════════\n",
"الصفقات النشطة: ", CountActiveTrades(), "\n",
"مخاطرة الحساب: ", DoubleToString(gAccountRisk, 2), "%\n",
"════════════════════════════════════════════════════\n",
"حالة النظام: ", (EnableAI ? "✓ الذكاء الاصطناعي مفعل" : "النظام التقليدي"), "\n",
"════════════════════════════════════════════════════"
);
}
//+------------------------------------------------------------------+
//| الدالة الرئيسية |
//+------------------------------------------------------------------+
void OnTick()
{
// تحديث الوقت الحالي
TimeCurrent(gCurrentTime);
// التحقق من الشمعة الجديدة
if(!IsNewBar())
return;
// تحديث بيانات اليوم
UpdateDailyStats();
// التحقق من وقت الأخبار
if(AvoidNews)
CheckNewsTime();
// التحليل الفني
TradeSignal signal = AnalyzeMarket();
// إدارة الصفقات المفتوحة
ManageOpenTrades();
// فتح صفقات جديدة إذا كان هناك إشارة
if(signal.direction != 0 && signal.confidence >= AIConfidenceLevel)
{
if(CheckTradingConditions())
{
OpenTrade(signal);
}
}
// تحديث لوحة المعلومات
UpdateDashboard();
}
//+------------------------------------------------------------------+
//| تحليل السوق باستخدام الذكاء الاصطناعي |
//+------------------------------------------------------------------+
TradeSignal AnalyzeMarket()
{
TradeSignal signal;
ZeroMemory(signal);
// إذا كان الذكاء الاصطناعي معطل، استخدام النظام التقليدي
if(!EnableAI)
{
signal = TraditionalAnalysis();
}
else
{
// نظام الذكاء الاصطناعي المتقدم
signal = AIAnalysis();
}
// تطبيق فلتر حالة السوق
if(UseMarketFilter)
{
MARKET_CONDITION condition = DetermineMarketCondition();
if(!IsConditionSuitable(signal.direction, condition))
{
signal.direction = 0;
signal.confidence = 0;
}
}
return signal;
}
//+------------------------------------------------------------------+
//| التحليل التقليدي |
//+------------------------------------------------------------------+
TradeSignal TraditionalAnalysis()
{
TradeSignal signal;
ZeroMemory(signal);
// مؤشرات متعددة للتحليل
double rsi = iRSI(Symbol(), TradingTF, 14, PRICE_CLOSE, 0);
double macd_main, macd_signal;
GetMACD(macd_main, macd_signal);
double ma_fast = iMA(Symbol(), TradingTF, 20, 0, MODE_EMA, PRICE_CLOSE, 0);
double ma_slow = iMA(Symbol(), TradingTF, 50, 0, MODE_EMA, PRICE_CLOSE, 0);
bool buyCondition = (rsi < 30 && macd_main > macd_signal && Close[0] > ma_fast);
bool sellCondition = (rsi > 70 && macd_main < macd_signal && Close[0] < ma_fast);
if(buyCondition)
{
signal.direction = 1;
signal.confidence = 0.7;
signal.entryPrice = Ask;
signal.signalName = "Trend_Reversal_Buy";
}
else if(sellCondition)
{
signal.direction = -1;
signal.confidence = 0.7;
signal.entryPrice = Bid;
signal.signalName = "Trend_Reversal_Sell";
}
return signal;
}
//+------------------------------------------------------------------+
//| تحليل الذكاء الاصطناعي |
//+------------------------------------------------------------------+
TradeSignal AIAnalysis()
{
TradeSignal signal;
ZeroMemory(signal);
// جمع بيانات السوق
double features[];
CollectMarketFeatures(features);
// محاكاة نظام ذكاء اصطناعي (يمكن استبدالها بشبكة عصبية حقيقية)
double aiScore = CalculateAIScore(features);
if(aiScore > AIConfidenceLevel)
{
signal.direction = 1;
signal.confidence = aiScore;
signal.entryPrice = Ask;
signal.signalName = "AI_Buy_Signal";
}
else if(aiScore < -AIConfidenceLevel)
{
signal.direction = -1;
signal.confidence = MathAbs(aiScore);
signal.entryPrice = Bid;
signal.signalName = "AI_Sell_Signal";
}
// حساب وقف الخسارة وجني الأرباح
if(signal.direction != 0)
{
CalculateStopLevels(signal);
}
return signal;
}
//+------------------------------------------------------------------+
//| جمع ميزات السوق للذكاء الاصطناعي |
//+------------------------------------------------------------------+
void CollectMarketFeatures(double &features[])
{
ArrayResize(features, 10);
// 1. قوة الاتجاه
features[0] = CalculateTrendStrength();
// 2. التقلب
features[1] = CalculateVolatility();
// 3. زخم السوق
features[2] = CalculateMomentum();
// 4. حجم التداول
features[3] = CalculateVolumeRatio();
// 5. مؤشر RSI
features[4] = iRSI(Symbol(), TradingTF, 14, PRICE_CLOSE, 0) / 100;
// 6. Stochastic
double stochK, stochD;
GetStochastic(stochK, stochD);
features[5] = stochK / 100;
// 7. فرق المتوسطات
features[6] = (iMA(Symbol(), TradingTF, 20, 0, MODE_SMA, PRICE_CLOSE, 0) -
iMA(Symbol(), TradingTF, 50, 0, MODE_SMA, PRICE_CLOSE, 0)) / Point;
// 8. سعر الإغلاق النسبي
features[7] = (Close[0] - iMA(Symbol(), TradingTF, 20, 0, MODE_SMA, PRICE_CLOSE, 0)) / Point;
// 9. عرض النطاق
features[8] = (iATR(Symbol(), TradingTF, 14, 0) / Point) / 100;
// 10. نسبة المخاطرة/المكافأة
features[9] = CalculateRiskRewardRatio();
}
//+------------------------------------------------------------------+
//| حساب نتيجة الذكاء الاصطناعي |
//+------------------------------------------------------------------+
double CalculateAIScore(double &features[])
{
// أوزان النموذج (محاكاة لشبكة عصبية)
double weights[] = {0.15, 0.12, 0.18, 0.10, 0.08, 0.07, 0.12, 0.09, 0.05, 0.04};
double bias = -0.3;
double score = bias;
for(int i = 0; i < ArraySize(features); i++)
{
score += features[i] * weights[i];
}
// تطبيق دالة sigmoid
score = 2.0 / (1.0 + MathExp(-2.0 * score)) - 1.0;
return score;
}
//+------------------------------------------------------------------+
//| تحديد حالة السوق |
//+------------------------------------------------------------------+
MARKET_CONDITION DetermineMarketCondition()
{
double atr = iATR(Symbol(), TradingTF, 14, 0);
double maDiff = MathAbs(iMA(Symbol(), TradingTF, 20, 0, MODE_EMA, PRICE_CLOSE, 0) -
iMA(Symbol(), TradingTF, 50, 0, MODE_EMA, PRICE_CLOSE, 0));
if(maDiff > atr * 2)
{
if(iMA(Symbol(), TradingTF, 20, 0, MODE_EMA, PRICE_CLOSE, 0) >
iMA(Symbol(), TradingTF, 50, 0, MODE_EMA, PRICE_CLOSE, 0))
return MARKET_TREND_UP;
else
return MARKET_TREND_DOWN;
}
else if(atr > iATR(Symbol(), TradingTF, 14, 20))
{
return MARKET_VOLATILE;
}
return MARKET_RANGE;
}
//+------------------------------------------------------------------+
//| التحقق من ملائمة حالة السوق |
//+------------------------------------------------------------------+
bool IsConditionSuitable(int direction, MARKET_CONDITION condition)
{
if(direction == 1) // شراء
{
if(condition == MARKET_TREND_DOWN)
return false;
}
else if(direction == -1) // بيع
{
if(condition == MARKET_TREND_UP)
return false;
}
if(condition == MARKET_VOLATILE && AvoidNews)
return false;
return true;
}
//+------------------------------------------------------------------+
//| حساب مستويات الوقف |
//+------------------------------------------------------------------+
void CalculateStopLevels(TradeSignal &signal)
{
double atr = iATR(Symbol(), TradingTF, 14, 0);
if(UseAutoStopLoss)
{
if(signal.direction == 1)
signal.stopLoss = signal.entryPrice - (StopLossPips * Point);
else
signal.stopLoss = signal.entryPrice + (StopLossPips * Point);
}
if(UseAutoTakeProfit)
{
if(signal.direction == 1)
signal.takeProfit = signal.entryPrice + (TakeProfitPips * Point);
else
signal.takeProfit = signal.entryPrice - (TakeProfitPips * Point);
}
}
//+------------------------------------------------------------------+
//| التحقق من ظروف التداول |
//+------------------------------------------------------------------+
bool CheckTradingConditions()
{
// التحقق من وقت التداول
if(UseTradingHours)
{
if(gCurrentTime.hour < TradingStartHour || gCurrentTime.hour >= TradingEndHour)
return false;
}
// التحقق من الأخبار
if(gIsNewsTime && AvoidNews)
return false;
// التحقق من الحد الأقصى للصفقات
if(CountActiveTrades() >= MaxOpenTrades)
return false;
// التحقق من رصيد الحساب
if(AccountInfoDouble(ACCOUNT_BALANCE) < 100)
{
Print("رصيد الحساب منخفض جدًا");
return false;
}
// التحقق من انتشار السوق
double spread = (Ask - Bid) / Point;
if(spread > 20)
{
Print("الانتشار مرتفع جدًا: ", spread);
return false;
}
return true;
}
//+------------------------------------------------------------------+
//| فتح صفقة جديدة |
//+------------------------------------------------------------------+
void OpenTrade(TradeSignal &signal)
{
// حساب حجم اللوت
double lotSize = CalculateLotSize();
// إعداد أمر التداول
MqlTradeRequest request;
MqlTradeResult result;
ZeroMemory(request);
ZeroMemory(result);
request.action = TRADE_ACTION_DEAL;
request.symbol = Symbol();
request.volume = lotSize;
request.type = (signal.direction == 1) ? ORDER_TYPE_BUY : ORDER_TYPE_SELL;
request.price = (signal.direction == 1) ? Ask : Bid;
request.sl = signal.stopLoss;
request.tp = signal.takeProfit;
request.deviation = Slippage;
request.magic = MagicNumber;
request.comment = signal.signalName;
request.type_filling = ORDER_FILLING_IOC;
// إرسال الأمر
if(OrderSend(request, result))
{
Print("تم فتح صفقة #", result.order, " ", signal.signalName,
" حجم: ", lotSize, " ثقة: ", DoubleToString(signal.confidence * 100, 1), "%");
gTotalTradesToday++;
}
else
{
Print("فشل فتح الصفقة: ", GetLastError());
}
}
//+------------------------------------------------------------------+
//| إدارة الصفقات المفتوحة |
//+------------------------------------------------------------------+
void ManageOpenTrades()
{
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
// تطبيق نقطة التعادل
if(UseBreakEven)
ApplyBreakEven(OrderTicket());
// إغلاق الصفقات بناءً على شروط الذكاء الاصطناعي
CheckForEarlyClose(OrderTicket());
}
}
}
}
//+------------------------------------------------------------------+
//| تطبيق نقطة التعادل |
//+------------------------------------------------------------------+
void ApplyBreakEven(int ticket)
{
if(OrderSelect(ticket, SELECT_BY_TICKET))
{
double currentProfit = OrderProfit();
double pointsInProfit = 0;
if(OrderType() == OP_BUY)
pointsInProfit = (Bid - OrderOpenPrice()) / Point;
else if(OrderType() == OP_SELL)
pointsInProfit = (OrderOpenPrice() - Ask) / Point;
if(pointsInProfit >= BreakEvenAt && OrderStopLoss() == 0)
{
double newStopLoss = OrderOpenPrice();
ModifyOrder(ticket, OrderOpenPrice(), OrderTakeProfit());
Print("تم تفعيل نقطة التعادل للصفقة #", ticket);
}
}
}
//+------------------------------------------------------------------+
//| حساب حجم اللوت |
//+------------------------------------------------------------------+
double CalculateLotSize()
{
double lotSize = FixedLotSize;
if(UseMoneyManagement)
{
double riskAmount = AccountInfoDouble(ACCOUNT_BALANCE) * (RiskPercent / 100);
double tickValue = MarketInfo(Symbol(), MODE_TICKVALUE);
double stopLossPoints = StopLossPips * 10; // تحويل للنقاط
if(stopLossPoints > 0 && tickValue > 0)
{
lotSize = riskAmount / (stopLossPoints * tickValue);
}
// التطبيع
double minLot = MarketInfo(Symbol(), MODE_MINLOT);
double maxLot = MarketInfo(Symbol(), MODE_MAXLOT);
double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
lotSize = MathMax(lotSize, minLot);
lotSize = MathMin(lotSize, MaxLotSize);
lotSize = NormalizeDouble(lotSize, 2);
}
return lotSize;
}
//+------------------------------------------------------------------+
//| التحقق من وقت الأخبار |
//+------------------------------------------------------------------+
void CheckNewsTime()
{
// هذه وظيفة تجميلية - في النسخة الحقيقية يمكن ربطها بمصدر أخبار
// محاكاة فترات الأخبار (8:30, 13:30, 15:00 توقيت السيرفر)
int newsHours[] = {8, 13, 15};
int newsMinutes[] = {30, 30, 0};
gIsNewsTime = false;
for(int i = 0; i < ArraySize(newsHours); i++)
{
if(gCurrentTime.hour == newsHours[i] &&
gCurrentTime.min >= (newsMinutes[i] - NewsBufferMinutes) &&
gCurrentTime.min <= (newsMinutes[i] + NewsBufferMinutes))
{
gIsNewsTime = true;
break;
}
}
}
//+------------------------------------------------------------------+
//| تحديث إحصائيات اليوم |
//+------------------------------------------------------------------+
void UpdateDailyStats()
{
static datetime lastDayCheck = 0;
MqlDateTime today;
TimeCurrent(today);
if(lastDayCheck == 0 || today.day != TimeDay(lastDayCheck))
{
gTotalTradesToday = 0;
gDailyProfit = 0;
lastDayCheck = TimeCurrent();
}
}
//+------------------------------------------------------------------+
//| تحديث لوحة المعلومات |
//+------------------------------------------------------------------+
void UpdateDashboard()
{
if(!MQLInfoInteger(MQL_VISUAL_MODE)) return;
string dashboard =
"\n" +
"════════════════════════════════════════════════════\n" +
" MoneyCatcher AI - لوحة التحكم \n" +
"════════════════════════════════════════════════════\n" +
"الوقت: " + TimeToString(TimeCurrent()) + "\n" +
"السعر: " + DoubleToString(Ask, _Digits) + "\n" +
"════════════════════════════════════════════════════\n" +
"الصفقات النشطة: " + IntegerToString(CountActiveTrades()) + "\n" +
"صفقات اليوم: " + IntegerToString(gTotalTradesToday) + "\n" +
"ربح اليوم: $" + DoubleToString(GetDailyProfit(), 2) + "\n" +
"════════════════════════════════════════════════════\n" +
"حالة السوق: " + GetMarketConditionText() + "\n" +
"الانتشار: " + DoubleToString((Ask-Bid)/Point, 0) + " نقطة\n" +
"════════════════════════════════════════════════════\n" +
(gIsNewsTime ? "⚠️ وقت الأخبار - التداول محدود\n" : "✓ وقت تداول عادي\n") +
"════════════════════════════════════════════════════";
Comment(dashboard);
}
//+------------------------------------------------------------------+
//| الدوال المساعدة |
//+------------------------------------------------------------------+
bool IsNewBar()
{
datetime currentBarTime = iTime(Symbol(), Period(), 0);
if(currentBarTime != gLastBarTime)
{
gLastBarTime = currentBarTime;
return true;
}
return false;
}
int CountActiveTrades()
{
int count = 0;
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
count++;
}
}
return count;
}
double GetDailyProfit()
{
double profit = 0;
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() &&
OrderMagicNumber() == MagicNumber &&
TimeDay(OrderOpenTime()) == TimeDay(TimeCurrent()))
{
profit += OrderProfit() + OrderSwap() + OrderCommission();
}
}
}
return profit;
}
string GetMarketConditionText()
{
MARKET_CONDITION condition = DetermineMarketCondition();
switch(condition)
{
case MARKET_TREND_UP: return "📈 اتجاه صاعد";
case MARKET_TREND_DOWN: return "📉 اتجاه هابط";
case MARKET_RANGE: return "↔️ سوق جانبي";
case MARKET_VOLATILE: return "⚡ سوق متقلب";
}
return "غير معروف";
}
void GetMACD(double &main, double &signal)
{
main = iMACD(Symbol(), TradingTF, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 0);
signal = iMACD(Symbol(), TradingTF, 12, 26, 9, PRICE_CLOSE, MODE_SIGNAL, 0);
}
void GetStochastic(double &K, double &D)
{
K = iStochastic(Symbol(), TradingTF, 14, 3, 3, MODE_SMA, 0, MODE_MAIN, 0);
D = iStochastic(Symbol(), TradingTF, 14, 3, 3, MODE_SMA, 0, MODE_SIGNAL, 0);
}
double CalculateTrendStrength()
{
double adx = iADX(Symbol(), TradingTF, 14, PRICE_CLOSE, MODE_MAIN, 0);
return adx / 100;
}
double CalculateVolatility()
{
double atr = iATR(Symbol(), TradingTF, 14, 0);
double avgAtr = iATR(Symbol(), TradingTF, 14, 20);
return atr / avgAtr - 1;
}
double CalculateMomentum()
{
double momentum = (Close[0] - Close[20]) / Point;
return momentum / 1000;
}
double CalculateVolumeRatio()
{
double volume = iVolume(Symbol(), TradingTF, 0);
double avgVolume = 0;
for(int i = 1; i <= 20; i++)
avgVolume += iVolume(Symbol(), TradingTF, i);
avgVolume /= 20;
return volume / avgVolume;
}
double CalculateRiskRewardRatio()
{
if(StopLossPips > 0 && TakeProfitPips > 0)
return (double)TakeProfitPips / StopLossPips;
return 1.0;
}
void CreateDashboard()
{
// إنشاء كائنات رسم للنسخة المميزة
// (يمكن إضافة رسوم بيانية ومؤشرات متقدمة هنا)
}
void CheckForEarlyClose(int ticket)
{
// منطق الإغلاق المبكر بناءً على تحليل الذكاء الاصطناعي
if(OrderSelect(ticket, SELECT_BY_TICKET))
{
double currentProfit = OrderProfit();
double openPrice = OrderOpenPrice();
double currentPrice = (OrderType() == OP_BUY) ? Bid : Ask;
// مثال: إغلاق إذا انعكس السوق بقوة
double priceMove = MathAbs(currentPrice - openPrice) / Point;
if(priceMove > TakeProfitPips * 0.5 && currentProfit > 0)
{
// يمكن إضافة منطق إغلاق ذكي هنا
}
}
}
void ModifyOrder(int ticket, double sl, double tp)
{
MqlTradeRequest request;
MqlTradeResult result;
ZeroMemory(request);
ZeroMemory(result);
if(OrderSelect(ticket, SELECT_BY_TICKET))
{
request.action = TRADE_ACTION_SLTP;
request.order = ticket;
request.symbol = OrderSymbol();
request.sl = sl;
request.tp = tp;
OrderSend(request, result);
}
}
//+------------------------------------------------------------------+
//| دالة إلغاء التهيئة |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// تنظيف الذاكرة والمؤشرات
ObjectsDeleteAll(0, -1);
// حفظ سجل التداول
SaveTradingLog();
// عرض رسالة الخروج
Print("====== MoneyCatcher AI - إنهاء ======");
Print("السبب: ", GetDeinitReasonText(reason));
Print("صفقات اليوم: ", gTotalTradesToday);
Print("ربح اليوم: $", DoubleToString(GetDailyProfit(), 2));
Print("====================================");
Comment("");
}
//+------------------------------------------------------------------+
//| الحصول على نص سبب الإنهاء |
//+------------------------------------------------------------------+
string GetDeinitReasonText(int reason)
{
switch(reason)
{
case REASON_ACCOUNT: return "تغيير الحساب";
case REASON_CHARTCHANGE: return "تغيير الرسم البياني";
case REASON_CHARTCLOSE: return "إغلاق الرسم البياني";
case REASON_PARAMETERS: return "تغيير المعلمات";
case REASON_RECOMPILE: return "إعادة الترجمة";
case REASON_REMOVE: return "إزالة الخبير";
case REASON_TEMPLATE: return "تغيير القالب";
default: return "سبب غير معروف";
}
}
//+------------------------------------------------------------------+
//| حفظ سجل التداول |
//+------------------------------------------------------------------+
void SaveTradingLog()
{
// في النسخة الكاملة، يمكن حفظ البيانات في ملف أو قاعدة بيانات
string logEntry = StringFormat("%s,%s,%.2f,%d,%.2f",
TimeToString(TimeCurrent()),
Symbol(),
AccountInfoDouble(ACCOUNT_EQUITY),
gTotalTradesToday,
GetDailyProfit()
);
// مثال لحفظ في ملف (يمكن تفعيله في النسخة المدفوعة)
// int handle = FileOpen("MoneyCatcher_Log.csv", FILE_READ|FILE_WRITE|FILE_CSV);
// if(handle != INVALID_HANDLE)
// {
// FileSeek(handle, 0, SEEK_END);
// FileWrite(handle, logEntry);
// FileClose(handle);
// }
}
//+------------------------------------------------------------------+