محتاج اكسبيرت تداول تلقائي يتداول على نماذج الهارمونيك ، نموذج القرش و الخفاش mt5
جربت اعمل واحد بالذكاء الاصطناعي و اتعمل بدون أخطاء لكن لما عملت باك تيست كانت الخسائر كبيرة مش عارف ليه ، و دة الكود
//+------------------------------------------------------------------+
//| Shark_Bat_Harmonic_MT5_Backtest_Ready.mq5 |
//+------------------------------------------------------------------+
#property strict
// ================== INPUTS ==================
input double InpLotSize = 0.1;
input int InpMagic = 777999;
input int ZZ_Depth = 12;
input int ZZ_Dev = 5;
input int ZZ_Back = 3;
// ================== GLOBALS ==================
int zzHandle;
double zz[];
datetime lastBarTime = 0;
//+------------------------------------------------------------------+
int OnInit()
{
zzHandle = iCustom(_Symbol,_Period,"Examples\\ZigZag",ZZ_Dept h,ZZ_Dev,ZZ_Back);
if(zzHandle == INVALID_HANDLE) {
Print("❌ فشل تحميل المؤشر! تأكد من وجوده في MQL5/Indicators/Examples");
return INIT_FAILED;
}
ArraySetAsSeries(zz,true);
return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
void OnTick()
{
if(iTime(_Symbol,_Period,0) == lastBarTime) return;
lastBarTime = iTime(_Symbol,_Period,0);
if(CopyBuffer(zzHandle,0,0,500,zz) <= 0) return;
double p[5]; datetime t[5]; int c = 0;
// استخراج نقاط ZigZag المؤكدة (تجاهل آخر شمعتين)
for(int i=2; i<500 && c<5; i++)
{
if(zz[i] != 0) {
p[c] = zz[i];
t[c] = iTime(_Symbol,_Period,i);
c++;
}
}
if(c < 5) return;
// ترتيب X A B C D
ArrayReverse(p); ArrayReverse(t);
double X=p[0], A=p[1], B=p[2], C=p[3];
double XA=MathAbs(A-X), AB=MathAbs(B-A), BC=MathAbs(C-B);
if(XA==0 || AB==0) return;
double rAB = AB/XA;
double rBC = BC/AB;
if(HasAnyOrderOrPosition()) return;
// --- BAT ---
if(rAB >= 0.38 && rAB <= 0.60)
{
double entry = (X > A) ? (X - XA*0.886)

X + XA*0.886);
double sl = X;
double risk = MathAbs(entry-sl);
double tp = (X > A) ? (entry + risk)

entry - risk);
if((X > A && C > B) || (X < A && C < B))
PlaceOrder((X > A ? ORDER_TYPE_BUY_LIMIT : ORDER_TYPE_SELL_LIMIT), entry, sl, tp, "Bat 1:1", t, p);
}
// --- SHARK ---
if(rBC >= 1.13 && rBC <= 1.60)
{
double entry = (X > A) ? (X - XA*1.13)

X + XA*1.13);
double sl = (X > A) ? (X - XA*1.27)

X + XA*1.27);
double risk = MathAbs(entry-sl);
double tp = (X > A) ? (entry + risk)

entry - risk);
PlaceOrder((X > A ? ORDER_TYPE_BUY_LIMIT : ORDER_TYPE_SELL_LIMIT), entry, sl, tp, "Shark 1:1", t, p);
}
}
//+------------------------------------------------------------------+
void PlaceOrder(ENUM_ORDER_TYPE type, double price, double sl, double tp, string comm, datetime &t[], double &p[])
{
MqlTradeRequest req = {}; MqlTradeResult res = {};
req.action = TRADE_ACTION_PENDING;
req.symbol = _Symbol;
req.volume = InpLotSize;
req.type = type;
req.price = NormalizeDouble(price, _Digits);
req.sl = NormalizeDouble(sl, _Digits);
req.tp = NormalizeDouble(tp, _Digits);
req.magic = InpMagic;
req.comment = comm;
req.type_filling = GetFillingMode();
if(!OrderSend(req,res))
Print("❌ خطأ في التنفيذ: ", GetLastError());
else
DrawPattern(t,p,clrDeepSkyBlue,comm);
}
ENUM_ORDER_TYPE_FILLING GetFillingMode()
{
uint filling = (uint)SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);
if((filling & SYMBOL_FILLING_FOK) != 0) return ORDER_FILLING_FOK;
if((filling & SYMBOL_FILLING_IOC) != 0) return ORDER_FILLING_IOC;
return ORDER_FILLING_RETURN;
}
void DrawPattern(datetime &t[], double &p[], color clr, string name)
{
for(int i=0; i<4; i++) {
string ln = "H_"+name+(string)i;
ObjectDelete(0,ln);
ObjectCreate(0,ln,OBJ_TREND,0,t[i+1],p[i+1],t[i],p[i]);
ObjectSetInteger(0,ln,OBJPROP_COLOR,clr);
ObjectSetInteger(0,ln,OBJPROP_RAY_RIGHT,false);
}
}
bool HasAnyOrderOrPosition()
{
for(int i=PositionsTotal()-1; i>=0; i--)
if(PositionSelectByTicket(PositionGetTicket

) && PositionGetInteger(POSITION_MAGIC)==InpMagic) return true;
for(int i=OrdersTotal()-1; i>=0; i--)
if(OrderSelect(OrderGetTicket

) && OrderGetInteger(ORDER_MAGIC)==InpMagic) return true;
return false;
}