النتائج 1 إلى 11 من 11
الموضوع: ارجوا تعديل الاكسبيرت من mt4 الى mt5
- 28-07-2025, 12:18 PM #1
ارجوا تعديل الاكسبيرت من mt4 الى mt5
مرحبا
ارجوا تعديل الاكسبيرت من mt4 الى mt5 وجزاكم الله كل خيرmulti.mq4
- 30-07-2025, 12:05 PM #2
Up UP UP UP
- 30-07-2025, 06:05 PM #3
- 30-07-2025, 06:36 PM #4
- 31-07-2025, 01:51 PM #5
للرفع مرة اخرى
- 31-07-2025, 02:54 PM #6
- 07-08-2025, 11:40 AM #7
تم تعديل بعض الاكواد ولكن للأن لم يكتمل بعد
تم تعديل بعض الاكواد ولكن للأن لم يكتمل بعد
كود PHP:#property copyright "Sol.com"
#property link "http://www.Sol.com"
//extern = input
//TRUE = true
//FALSE = false
// init = OnInit
//Point = _Point
// Bid = (::SymbolInfoDouble(_Symbol, ::SYMBOL_BID))
// Ask = (::SymbolInfoDouble(_Symbol, ::SYMBOL_ASK))
//////////////////////////not inside TimeToStr = TimeToString
// DoubleToStr = DoubleToString
//////////////////////////not inside CurTime = TimeCurrent
//////////////////////////not inside HistoryTotal = OrdersHistoryTotal
//////////////////////////not inside LocalTime TimeLocal
// OP_BUY = ORDER_TYPE_BUY
// OP_SELL = ORDER_TYPE_SELL
// OP_BUYLIMIT = ORDER_TYPE_BUY_LIMIT
// OP_SELLLIMIT = ORDER_TYPE_SELL_LIMIT
// OP_BUYSTOP = ORDER_TYPE_BUY_STOP
// OP_SELLSTOP = ORDER_TYPE_SELL_STOP
//Digits = _Digits
/////?????? MarketInfo() = read SymbolInfoInteger/Double/String
// ?? DayOfWeek() = TimeCurrent(tm);
// StrToTime = StringToTime
// OrderTicket = OrderGetTicket
input bool TradeBuy = true;
input bool TradeSell = true;
input bool ResetSLAfterOppExe = false;
bool gi_88 = false;
input int Step1 = 150;
input int TP1 = 150;
int gi_100 = 0;
input double Lots1 = 0.05;
input int Step2 = 150;
input int TP2 = 150;
int gi_120 = 0;
input double Lots2 = 0.05;
input int Step3 = 150;
input int TP3 = 150;
int gi_140 = 0;
input double Lots3 = 0.09;
input int Step4 = 150;
input int TP4 = 150;
int gi_160 = 0;
input double Lots4 = 0.13;
input int Step5 = 150;
input int TP5 = 150;
int gi_180 = 0;
input double Lots5 = 0.19;
input int Step6 = 150;
input int TP6 = 150;
int gi_200 = 0;
input double Lots6 = 0.25;
input int Step7 = 150;
input int TP7 = 150;
int gi_220 = 0;
input double Lots7 = 0.33;
input int Step8 = 150;
input int TP8 = 150;
int gi_240 = 0;
input double Lots8 = 0.40;
input int Step9 = 150;
input int TP9 = 150;
int gi_260 = 0;
input double Lots9 = 2.56;
input int Step10 = 150;
input int TP10 = 150;
int gi_280 = 0;
input double Lots10 = 5.12;
int g_slippage_292 = 3;
int gi_296 = 2;
input int StartHour = 0;
input int EndHour = 24;
input int Magic = 9999;
int g_magic_312 = 5978278;
input bool UseMACD = false;
input int BrokerMode = 1;
input bool MM_advisor = false;
input int FridayCloseTime = 16;
input int OpenOppositeStep = 6;
input bool UseTrailingOpposite = true;
input int TrailStart = 40;
input int TrailStep = 15;
int gi_348 = 30;
input double LotsFactorOpposite = 0;
input int MaxSpread = 120;
//int gi_364 = D'31.12.2000 22:00';
//int gi_368 = D'30.05.2010 22:00';
//string gs_372 = "Version expired,contact Sol.com for updated version";
bool gi_380 = false;
int gi_384;
int gi_unused_388;
int gi_392 = 5;
bool g_global_var_396 = false;
bool g_global_var_400 = false;
int OnInit() {
if (GlobalVariableCheck(Symbol() + "_InOpenOppositeModeSell")) g_global_var_396 = GlobalVariableGet(Symbol() + "_InOpenOppositeModeSell");
if (GlobalVariableCheck(Symbol() + "_InOpenOppositeModeBuy")) g_global_var_400 = GlobalVariableGet(Symbol() + "_InOpenOppositeModeBuy");
return (0);
}
int start() {
int li_0;
int li_4;
int l_ticket_8;
double l_price_12;
double l_price_20;
double l_price_28;
double l_lots_36;
double ld_44;
double ld_52;
bool l_bool_60;
double ld_248;
bool l_ticket_256;
double l_price_260;
bool li_272;
// if (Check() == 0) return (0);
// if (TimeCurrent() > StringToTime("2009.03.30")) {Alert("Time Expired!, Please Contact Sol.com!"); return (0);}
ObjectCreate("CC", OBJ_LABEL, 0, 0, 0);
ObjectSet("CC", OBJPROP_CORNER, 3);
ObjectSet("CC", OBJPROP_XDISTANCE, 5);
ObjectSet("CC", OBJPROP_YDISTANCE, 5);
ObjectSet("CC", OBJPROP_BACK, true);
ObjectSetText("CC", "Copyright © 2009, www.Sol.com", 7, "Arial", Silver);
ObjectCreate("HB", OBJ_LABEL, 0, 0, 0);
ObjectSet("HB", OBJPROP_CORNER, 3);
ObjectSet("HB", OBJPROP_XDISTANCE, 5);
ObjectSet("HB", OBJPROP_YDISTANCE, 15);
ObjectSet("HB", OBJPROP_BACK, true);
ObjectSetText("HB", "FxProPlus™ V2", 9, "Tahoma Bold", Tomato);
if (!SpreadIsValid()) {
Print("Spread > MaxSpread");
return (0);
}
gi_384 = MarketInfo(Symbol(), MODE_STOPLEVEL);
gi_unused_388 = MarketInfo(Symbol(), MODE_SPREAD);
if (gi_348 < gi_384) {
Print("TPOpposite < stoplevel");
return (0);
}
if (TrailStep < gi_384) {
Print("TrailStep < stoplevel");
return (0);
}
if (!g_global_var_396 && MyOrder(ORDER_TYPE_BUY, g_magic_312) == 1) {
g_global_var_396 = true;
GlobalVariableSet(Symbol() + "_InOpenOppositeModeSell", g_global_var_396);
}
if (!g_global_var_400 && MyOrder(ORDER_TYPE_SELL, g_magic_312) == 1) {
g_global_var_400 = true;
GlobalVariableSet(Symbol() + "_InOpenOppositeModeBuy", g_global_var_400);
}
if (g_global_var_396 && MyOrder(ORDER_TYPE_BUY, g_magic_312) < 1) {
while (MyOrder(ORDER_TYPE_SELL, Magic) > 0) DeleteAll(Magic, 1);
g_global_var_396 = false;
GlobalVariableSet(Symbol() + "_InOpenOppositeModeSell", g_global_var_396);
}
if (g_global_var_400 && MyOrder(ORDER_TYPE_SELL, g_magic_312) < 1) {
while (MyOrder(ORDER_TYPE_BUY, Magic) > 0) DeleteAll(Magic, 0);
g_global_var_400 = false;
GlobalVariableSet(Symbol() + "_InOpenOppositeModeBuy", g_global_var_400);
}
if (gi_380) return (0);
int l_ticket_64 = 0;
int l_ticket_68 = 0;
int l_ticket_72 = 0;
int l_ticket_76 = 0;
double l_ord_lots_80 = 0;
double l_ord_lots_88 = 0;
double l_ord_open_price_96 = 0;
double l_ord_open_price_104 = 0;
double l_ord_takeprofit_112 = 0;
double l_ord_takeprofit_120 = 0;
double l_ord_lots_128 = 0;
double l_ord_lots_136 = 0;
double l_ord_lots_144 = 0;
double l_ord_lots_152 = 0;
string ls_160 = "";
string ls_168 = "";
string ls_176 = "";
string ls_184 = "";
string ls_192 = "";
string ls_200 = "";
string ls_208 = "";
string ls_216 = "";
string ls_224 = "";
if (MM_advisor == true) li_4 = 100;
else li_4 = 1;
double ld_232 = 1.0;
for (int li_240 = 1; li_240 < OpenOppositeStep; li_240++) ld_232 = 2.0 * ld_232;
ld_232 = FinalLots(ld_232);
if (iMACD(NULL, 0, 14, 26, 9, PRICE_CLOSE, 0, 0) > iMACD(NULL, 0, 14, 26, 9, PRICE_CLOSE, 0, 1)) li_0 = 2;
if (iMACD(NULL, 0, 14, 26, 9, PRICE_CLOSE, 0, 0) < iMACD(NULL, 0, 14, 26, 9, PRICE_CLOSE, 0, 1)) li_0 = 1;
for (int l_pos_244 = 0; l_pos_244 < OrdersTotal(); l_pos_244++) {
OrderSelect(l_pos_244, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() || BrokerMode == 3 && OrderMagicNumber() == Magic) {
if (OrderType() == ORDER_TYPE_BUY && l_ticket_64 < OrderTicket()) {
l_ord_lots_80 = OrderLots();
l_ord_open_price_96 = OrderOpenPrice();
l_ticket_64 = OrderTicket();
l_ord_takeprofit_120 = OrderTakeProfit();
}
if (OrderType() == ORDER_TYPE_BUY)
if (OrderLots() < l_ord_lots_144 || l_ord_lots_144 == 0.0) l_ord_lots_144 = OrderLots();
if (OrderType() == ORDER_TYPE_SELL && l_ticket_68 < OrderTicket()) {
l_ord_lots_88 = OrderLots();
l_ord_open_price_104 = OrderOpenPrice();
l_ticket_68 = OrderTicket();
l_ord_takeprofit_112 = OrderTakeProfit();
}
if (OrderType() == ORDER_TYPE_SELL)
if (OrderLots() < l_ord_lots_152 || l_ord_lots_152 == 0.0) l_ord_lots_152 = OrderLots();
if (OrderType() == ORDER_TYPE_BUY_LIMIT) {
l_ticket_72 = OrderTicket();
l_ord_lots_128 = OrderLots();
}
if (OrderType() == ORDER_TYPE_SELL_LIMIT) {
l_ticket_76 = OrderTicket();
l_ord_lots_136 = OrderLots();
}
}
}
if (l_ticket_64 == 0 && l_ticket_72 != 0 && !g_global_var_400) {
OrderDelete(l_ticket_72);
if (MyOrder(ORDER_TYPE_SELL_STOP, g_magic_312) > 0) DeleteOpposite(g_magic_312, ORDER_TYPE_SELL_STOP);
}
if (l_ticket_64 == 0 && l_ticket_72 == 0 && TradeBuy) {
if (!g_global_var_400 && MyOrder(ORDER_TYPE_SELL_STOP, g_magic_312) > 0) DeleteOpposite(g_magic_312, ORDER_TYPE_SELL_STOP);
if (TimeCurrent() >= gi_364 && TimeCurrent() <= gi_368) {
l_price_20 = (::SymbolInfoDouble(_Symbol, ::SYMBOL_ASK)) - gi_100 * _Point;
if (gi_100 <= 0) l_price_20 = 0;
l_price_28 = (::SymbolInfoDouble(_Symbol, ::SYMBOL_ASK)) + TP1 * _Point;
if ((StartHour < EndHour && TimeHour(TimeCurrent()) >= StartHour && TimeHour(TimeCurrent()) < EndHour) || (StartHour > EndHour && TimeHour(TimeCurrent()) >= StartHour ||
TimeHour(TimeCurrent()) < EndHour)) {
if (DayOfWeek() != gi_392 || Hour() < FridayCloseTime) {
if ((li_0 == 2 && l_ticket_68 == 0) || UseMACD == false) {
if (!g_global_var_400 && MyOrder(ORDER_TYPE_SELL_STOP, g_magic_312) < 1) {
if (AccountFreeMarginCheck(Symbol(), ORDER_TYPE_BUY, Lots1 * li_4) >= 0.0) {
if (BrokerMode != 2 && BrokerMode != 3) OrderSend(Symbol(), ORDER_TYPE_BUY, Lots1, (::SymbolInfoDouble(_Symbol, ::SYMBOL_ASK)), g_slippage_292, l_price_20, l_price_28, "4 1Magic = " + Magic, Magic, 0, CLR_NONE);
else {
l_ticket_8 = OrderSend(Symbol(), ORDER_TYPE_BUY, Lots1, (::SymbolInfoDouble(_Symbol, ::SYMBOL_ASK)), g_slippage_292, 0, 0, "4 2Magic = " + Magic, Magic, 0, CLR_NONE);
l_bool_60 = OrderModify(l_ticket_8, OrderOpenPrice(), l_price_20, l_price_28, 0, CLR_NONE);
if (l_bool_60 == false) Print("Error modifying BUY order : ", GetLastError());
}
} else {
if (AccountFreeMarginCheck(Symbol(), ORDER_TYPE_BUY, Lots1) >= 0.0) ls_224 = "we recommend you to decrease your start lot or increase deposit";
else ls_176 = "BUY, " + DoubleToString(Lots1, 2) + " lots. ";
}
}
}
}
}
} else ls_168 = gs_372;
}
if (l_ticket_68 == 0 && l_ticket_76 != 0 && !g_global_var_396) {
OrderDelete(l_ticket_76);
if (MyOrder(ORDER_TYPE_BUY_STOP, g_magic_312) > 0) DeleteOpposite(g_magic_312, ORDER_TYPE_BUY_STOP);
}
if (l_ticket_68 == 0 && l_ticket_76 == 0 && TradeSell) {
if (!g_global_var_396 && MyOrder(ORDER_TYPE_BUY_STOP, g_magic_312) > 0) DeleteOpposite(g_magic_312, ORDER_TYPE_BUY_STOP);
if (TimeCurrent() >= gi_364 && TimeCurrent() <= gi_368) {
l_price_20 = (::SymbolInfoDouble(_Symbol, ::SYMBOL_BID)) + gi_100 * _Point;
if (gi_100 <= 0) l_price_20 = 0;
l_price_28 = (::SymbolInfoDouble(_Symbol, ::SYMBOL_BID)) - TP1 * _Point;
if ((StartHour < EndHour && TimeHour(TimeCurrent()) >= StartHour && TimeHour(TimeCurrent()) < EndHour) || (StartHour > EndHour && TimeHour(TimeCurrent()) >= StartHour ||
TimeHour(TimeCurrent()) < EndHour)) {
if (DayOfWeek() != gi_392 || Hour() < FridayCloseTime) {
if ((li_0 == 1 && l_ticket_64 == 0) || UseMACD == false) {
if (!g_global_var_396 && MyOrder(ORDER_TYPE_BUY_STOP, g_magic_312) < 1) {
if (AccountFreeMarginCheck(Symbol(), ORDER_TYPE_SELL, Lots1 * li_4) >= 0.0) {
if (BrokerMode != 2 && BrokerMode != 3) OrderSend(Symbol(), ORDER_TYPE_SELL, Lots1, (::SymbolInfoDouble(_Symbol, ::SYMBOL_BID)), g_slippage_292, l_price_20, l_price_28, "3 1Magic = " + Magic, Magic, 0, CLR_NONE);
else {
l_ticket_8 = OrderSend(Symbol(), ORDER_TYPE_SELL, Lots1, (::SymbolInfoDouble(_Symbol, ::SYMBOL_BID)), g_slippage_292, 0, 0, "3 2Magic = " + Magic, Magic, 0, CLR_NONE);
l_bool_60 = OrderModify(l_ticket_8, OrderOpenPrice(), l_price_20, l_price_28, 0, CLR_NONE);
if (l_bool_60 == false) Print("Error modifying SELL order : ", GetLastError());
}
} else {
if (AccountFreeMarginCheck(Symbol(), ORDER_TYPE_SELL, Lots1) >= 0.0) ls_224 = "we recommend you to decrease your start lot or increase deposit";
else ls_184 = "SELL, " + DoubleToString(Lots1, 2) + " lots. ";
}
}
}
}
}
} else ls_168 = gs_372;
}
if (l_ticket_64 != 0 && l_ticket_72 != 0) {
if (AccountFreeMarginCheck(Symbol(), ORDER_TYPE_BUY, l_ord_lots_128) < 0.0) {
ls_208 = "BUYLIMIT, " + DoubleToString(l_ord_lots_128, 2) + " lots. ";
OrderDelete(l_ticket_72);
}
}
if (l_ticket_64 != 0 && l_ticket_72 == 0) {
if (AccountFreeMarginCheck(Symbol(), ORDER_TYPE_BUY, NextLots(l_ord_lots_80)) >= 0.0) {
ld_52 = FinalStepByLots(l_ord_lots_80);
ld_44 = FinalTPByLots(NextLots(l_ord_lots_80));
ld_248 = FinalSLByLots(NextLots(l_ord_lots_80));
l_price_12 = l_ord_open_price_96 - ld_52 * _Point;
l_price_20 = l_price_12 - ld_248 * _Point;
if (ld_248 <= 0.0) l_price_20 = 0;
l_price_28 = l_price_12 + ld_44 * _Point;
l_lots_36 = NormalizeDouble(NextLots(l_ord_lots_80), gi_296);
if (NextLots(l_ord_lots_80) < ld_232 && !g_global_var_400 && MyOrder(ORDER_TYPE_SELL_STOP, g_magic_312) < 1) OrderSend(Symbol(), ORDER_TYPE_BUY_LIMIT, l_lots_36, l_price_12, g_slippage_292, l_price_20, l_price_28, "2 Magic = " + Magic, Magic, 0, CLR_NONE);
else {
if (NextLots(l_ord_lots_80) >= ld_232 && !g_global_var_400 && MyOrder(ORDER_TYPE_SELL_STOP, g_magic_312) < 1) {
Print("trying open sell stop");
if (l_price_12 > (::SymbolInfoDouble(_Symbol, ::SYMBOL_BID)) - gi_384 * _Point) l_price_12 = (::SymbolInfoDouble(_Symbol, ::SYMBOL_BID)) - gi_384 * _Point;
l_ticket_256 = false;
l_price_260 = l_price_12 - MarketInfo(Symbol(), MODE_SPREAD) * _Point;
if (!UseTrailingOpposite) {
l_ticket_256 = OrderSend(Symbol(), ORDER_TYPE_SELL_STOP, l_lots_36 * LotsFactorOpposite, l_price_260, g_slippage_292, l_price_28 + MarketInfo(Symbol(), MODE_SPREAD) * _Point, l_price_260 - gi_348 * _Point, "2 Magic = " +
g_magic_312, g_magic_312, 0, CLR_NONE);
} else {
l_ticket_256 = OrderSend(Symbol(), ORDER_TYPE_SELL_STOP, l_lots_36 * LotsFactorOpposite, l_price_260, g_slippage_292, l_price_28 + MarketInfo(Symbol(), MODE_SPREAD) * _Point, 0.0, "2 Magic = " +
g_magic_312, g_magic_312, 0, CLR_NONE);
}
if (l_ticket_256) OrderSend(Symbol(), ORDER_TYPE_BUY_LIMIT, l_lots_36, l_price_12, g_slippage_292, l_price_20, l_price_28, "2 Magic = " + Magic, Magic, 0, CLR_NONE);
}
}
} else ls_192 = "BUYLIMIT, " + DoubleToString(NextLots(l_ord_lots_80), 2) + " lots. ";
}
if (l_ticket_68 != 0 && l_ticket_76 != 0) {
if (AccountFreeMarginCheck(Symbol(), ORDER_TYPE_SELL, l_ord_lots_136) < 0.0) {
ls_216 = "SELLLIMIT, " + DoubleToString(l_ord_lots_136, 2) + " lots. ";
OrderDelete(l_ticket_76);
}
}
if (l_ticket_68 != 0 && l_ticket_76 == 0) {
if (AccountFreeMarginCheck(Symbol(), ORDER_TYPE_SELL, NextLots(l_ord_lots_88)) >= 0.0) {
ld_52 = FinalStepByLots(l_ord_lots_88);
ld_44 = FinalTPByLots(NextLots(l_ord_lots_88));
ld_248 = FinalSLByLots(NextLots(l_ord_lots_88));
l_price_12 = l_ord_open_price_104 + ld_52 * _Point;
l_price_20 = l_price_12 + ld_248 * _Point;
if (ld_248 <= 0.0) l_price_20 = 0;
l_price_28 = l_price_12 - ld_44 * _Point;
l_lots_36 = NormalizeDouble(NextLots(l_ord_lots_88), gi_296);
if (NextLots(l_ord_lots_88) < ld_232 && !g_global_var_396 && MyOrder(ORDER_TYPE_BUY_STOP, g_magic_312) < 1) OrderSend(Symbol(), ORDER_TYPE_SELL_LIMIT, l_lots_36, l_price_12, g_slippage_292, l_price_20, l_price_28, "1 Magic = " + Magic, Magic, 0, CLR_NONE);
else {
if (NextLots(l_ord_lots_88) >= ld_232 && !g_global_var_396 && MyOrder(ORDER_TYPE_BUY_STOP, g_magic_312) < 1) {
Print("trying open buy stop");
if (l_price_12 < (::SymbolInfoDouble(_Symbol, ::SYMBOL_ASK)) + gi_384 * _Point) l_price_12 = (::SymbolInfoDouble(_Symbol, ::SYMBOL_ASK)) + gi_384 * _Point;
l_ticket_256 = false;
l_price_260 = l_price_12 + MarketInfo(Symbol(), MODE_SPREAD) * _Point;
if (!UseTrailingOpposite) {
l_ticket_256 = OrderSend(Symbol(), ORDER_TYPE_BUY_STOP, l_lots_36 * LotsFactorOpposite, l_price_260, g_slippage_292, l_price_28 - MarketInfo(Symbol(), MODE_SPREAD) * _Point, l_price_260 +
gi_348 * _Point, "1 Magic = " + g_magic_312, g_magic_312, 0, CLR_NONE);
} else {
l_ticket_256 = OrderSend(Symbol(), ORDER_TYPE_BUY_STOP, l_lots_36 * LotsFactorOpposite, l_price_260, g_slippage_292, l_price_28 - MarketInfo(Symbol(), MODE_SPREAD) * _Point, 0.0, "1 Magic = " +
g_magic_312, g_magic_312, 0, CLR_NONE);
}
if (l_ticket_256) OrderSend(Symbol(), ORDER_TYPE_SELL_LIMIT, l_lots_36, l_price_12, g_slippage_292, l_price_20, l_price_28, "1 Magic = " + Magic, Magic, 0, CLR_NONE);
}
}
} else ls_200 = "SELLLIMIT, " + DoubleToString(NextLots(l_ord_lots_88), 2) + " lots. ";
}
for (l_pos_244 = 0; l_pos_244 < OrdersTotal(); l_pos_244++) {
OrderSelect(l_pos_244, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() || BrokerMode == 3 && OrderType() == ORDER_TYPE_BUY && l_ticket_64 != 0 && OrderMagicNumber() == Magic) {
if (l_ticket_64 > OrderTicket()) l_price_28 = l_ord_takeprofit_120;
else l_price_28 = OrderTakeProfit();
if (NormalizeDouble(l_price_28 - OrderTakeProfit(), _Digits) != 0.0) OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), l_price_28, 0, CLR_NONE);
}
if (OrderSymbol() == Symbol() || BrokerMode == 3 && OrderType() == ORDER_TYPE_SELL && l_ticket_68 != 0 && OrderMagicNumber() == Magic) {
if (l_ticket_68 > OrderTicket()) l_price_28 = l_ord_takeprofit_112;
else l_price_28 = OrderTakeProfit();
if (NormalizeDouble(l_price_28 - OrderTakeProfit(), _Digits) != 0.0) OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), l_price_28, 0, CLR_NONE);
}
}
if (ls_176 != "" || ls_184 != "" || ls_192 != "" || ls_200 != "" || ls_208 != "" || ls_216 != "") ls_160 = "Not enough margin for opening orders: ";
Comment(ls_168,
"\n", ls_160, ls_176, ls_184, ls_192, ls_200, ls_208, ls_216,
"\n", ls_224);
if (g_global_var_396 && MyOrder(ORDER_TYPE_BUY, g_magic_312) > 0 && MyOrder(ORDER_TYPE_SELL, Magic) > 0) {
for (int l_pos_268 = 0; l_pos_268 < OrdersTotal(); l_pos_268++) {
OrderSelect(l_pos_268, SELECT_BY_POS);
if ((OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_312 && OrderType() == ORDER_TYPE_BUY)) {
OrderSelect(l_pos_268, SELECT_BY_POS);
SetSLWhenOppositeExe(Magic, ORDER_TYPE_SELL, OrderOpenPrice());
break;
}
}
for (l_pos_268 = 0; l_pos_268 < OrdersTotal(); l_pos_268++) {
OrderSelect(l_pos_268, SELECT_BY_POS);
if ((OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == ORDER_TYPE_SELL)) {
OrderSelect(l_pos_268, SELECT_BY_POS);
SetTPWhenOppositeExe(g_magic_312, ORDER_TYPE_BUY, OrderTakeProfit());
break;
}
}
}
if (g_global_var_400 && MyOrder(ORDER_TYPE_SELL, g_magic_312) > 0 && MyOrder(ORDER_TYPE_BUY, Magic) > 0) {
for (l_pos_268 = 0; l_pos_268 < OrdersTotal(); l_pos_268++) {
OrderSelect(l_pos_268, SELECT_BY_POS);
if ((OrderSymbol() == Symbol() && OrderMagicNumber() == g_magic_312 && OrderType() == ORDER_TYPE_SELL)) {
OrderSelect(l_pos_268, SELECT_BY_POS);
SetSLWhenOppositeExe(Magic, ORDER_TYPE_BUY, OrderOpenPrice());
break;
}
}
for (l_pos_268 = 0; l_pos_268 < OrdersTotal(); l_pos_268++) {
OrderSelect(l_pos_268, SELECT_BY_POS);
if ((OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == ORDER_TYPE_BUY)) {
OrderSelect(l_pos_268, SELECT_BY_POS);
SetTPWhenOppositeExe(g_magic_312, ORDER_TYPE_SELL, OrderTakeProfit());
break;
}
}
}
if (UseTrailingOpposite) {
if (g_global_var_396 && MyOrder(ORDER_TYPE_BUY, g_magic_312) > 0) {
li_272 = TrailOrder(g_magic_312, ORDER_TYPE_BUY);
if (li_272) DeleteAll(Magic, 1);
}
if (g_global_var_400 && MyOrder(ORDER_TYPE_SELL, g_magic_312) > 0) {
li_272 = TrailOrder(g_magic_312, ORDER_TYPE_SELL);
if (li_272) DeleteAll(Magic, 0);
}
}
return (0);
}
int FinalStepByLots(double ad_0) {
if (ad_0 > 0.0 && ad_0 < Lots2) return (Step1);
else {
if (ad_0 > Lots1 && ad_0 < Lots3) return (Step2);
else {
if (ad_0 > Lots2 && ad_0 < Lots4) return (Step3);
else {
if (ad_0 > Lots3 && ad_0 < Lots5) return (Step4);
else {
if (ad_0 > Lots4 && ad_0 < Lots6) return (Step5);
else {
if (ad_0 > Lots5 && ad_0 < Lots7) return (Step6);
else {
if (ad_0 > Lots6 && ad_0 < Lots8) return (Step7);
else {
if (ad_0 > Lots7 && ad_0 < Lots9) return (Step8);
else {
if (ad_0 > Lots8 && ad_0 < Lots10) return (Step9);
else
if (ad_0 > Lots9) return (Step10);
}
}
}
}
}
}
}
}
return (Step10);
}
int FinalTPByLots(double ad_0) {
if (ad_0 > 0.0 && ad_0 < Lots2) return (TP1);
else {
if (ad_0 > Lots1 && ad_0 < Lots3) return (TP2);
else {
if (ad_0 > Lots2 && ad_0 < Lots4) return (TP3);
else {
if (ad_0 > Lots3 && ad_0 < Lots5) return (TP4);
else {
if (ad_0 > Lots4 && ad_0 < Lots6) return (TP5);
else {
if (ad_0 > Lots5 && ad_0 < Lots7) return (TP6);
else {
if (ad_0 > Lots6 && ad_0 < Lots8) return (TP7);
else {
if (ad_0 > Lots7 && ad_0 < Lots9) return (TP8);
else {
if (ad_0 > Lots8 && ad_0 < Lots10) return (TP9);
else
if (ad_0 > Lots9) return (TP10);
}
}
}
}
}
}
}
}
return (TP10);
}
int FinalSLByLots(double ad_0) {
if (ad_0 > 0.0 && ad_0 < Lots2) return (gi_100);
else {
if (ad_0 > Lots1 && ad_0 < Lots3) return (gi_120);
else {
if (ad_0 > Lots2 && ad_0 < Lots4) return (gi_140);
else {
if (ad_0 > Lots3 && ad_0 < Lots5) return (gi_160);
else {
if (ad_0 > Lots4 && ad_0 < Lots6) return (gi_180);
else {
if (ad_0 > Lots5 && ad_0 < Lots7) return (gi_200);
else {
if (ad_0 > Lots6 && ad_0 < Lots8) return (gi_220);
else {
if (ad_0 > Lots7 && ad_0 < Lots9) return (gi_240);
else {
if (ad_0 > Lots8 && ad_0 < Lots10) return (gi_260);
else
if (ad_0 > Lots9) return (gi_280);
}
}
}
}
}
}
}
}
return (gi_280);
}
double FinalLots(double ad_0) {
switch (ad_0) {
case 1.0:
return (Lots1);
case 2.0:
return (Lots2);
case 4.0:
return (Lots3);
case 8.0:
return (Lots4);
case 16.0:
return (Lots5);
case 32.0:
return (Lots6);
case 64.0:
return (Lots7);
case 128.0:
return (Lots8);
case 256.0:
return (Lots9);
case 512.0:
return (Lots10);
}
return (TP10);
}
double NextLots(double ad_0) {
if (NormalizeDouble(ad_0 - Lots1, gi_296) == 0.0) return (Lots2);
else {
if (NormalizeDouble(ad_0 - Lots2, gi_296) == 0.0) return (Lots3);
else {
if (NormalizeDouble(ad_0 - Lots3, gi_296) == 0.0) return (Lots4);
else {
if (NormalizeDouble(ad_0 - Lots4, gi_296) == 0.0) return (Lots5);
else {
if (NormalizeDouble(ad_0 - Lots5, gi_296) == 0.0) return (Lots6);
else {
if (NormalizeDouble(ad_0 - Lots6, gi_296) == 0.0) return (Lots7);
else {
if (NormalizeDouble(ad_0 - Lots7, gi_296) == 0.0) return (Lots8);
else {
if (NormalizeDouble(ad_0 - Lots8, gi_296) == 0.0) return (Lots9);
else
if (NormalizeDouble(ad_0 - Lots9, gi_296) == 0.0) return (Lots10);
}
}
}
}
}
}
}
return (Lots10);
}
int MyOrder(int a_cmd_0, int a_magic_4) {
int l_pos_8 = 0;
int l_count_12 = 0;
while (l_pos_8 < OrdersTotal()) {
if (OrderSelect(l_pos_8, SELECT_BY_POS, MODE_TRADES))
if (OrderSymbol() == Symbol() && OrderMagicNumber() == a_magic_4 && OrderType() == a_cmd_0) l_count_12++;
l_pos_8++;
}
return (l_count_12);
}
void DeleteAll(int a_magic_0, int ai_4) {
int l_count_12;
bool li_16;
for (int l_pos_8 = 0; l_pos_8 < OrdersTotal(); l_pos_8++) {
OrderSelect(l_pos_8, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == a_magic_0) {
if (IsTradeContextBusy()) {
Print("Trade context is busy! The expert cannot close Pending Order!");
return;
}
RefreshRates();
l_count_12 = 0;
li_16 = false;
while (l_count_12 < 10 && !li_16) {
if (ai_4 == 0 && OrderType() == ORDER_TYPE_BUY) li_16 = OrderClose(OrderTicket(), OrderLots(), (::SymbolInfoDouble(_Symbol, ::SYMBOL_BID)), g_slippage_292);
else {
if (ai_4 == 1 && OrderType() == ORDER_TYPE_SELL) li_16 = OrderClose(OrderTicket(), OrderLots(), (::SymbolInfoDouble(_Symbol, ::SYMBOL_ASK)), g_slippage_292);
else
if ((ai_4 == 0 && OrderType() == ORDER_TYPE_BUY_LIMIT) || (ai_4 == 1 && OrderType() == ORDER_TYPE_SELL_LIMIT)) li_16 = OrderDelete(OrderTicket(), CLR_NONE);
}
RefreshRates();
if (l_count_12 == 10) {
Print("10 attempts to close Orders have failed");
break;
}
l_count_12++;
}
}
}
}
void DeleteOpposite(int a_magic_0, int a_cmd_4) {
for (int l_pos_8 = 0; l_pos_8 < OrdersTotal(); l_pos_8++) {
OrderSelect(l_pos_8, SELECT_BY_POS);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == a_magic_0 && OrderType() == a_cmd_4) OrderDelete(OrderTicket());
}
}
/*
int Check()
{if (IsDemo() == true) return (1);
if (IsTesting() == true) return (1);
Alert("Demo accounts only- Contact Sol.com to purchase");
return (0);}
*/
/* bool IsDemo(){
ENUM_ACCOUNT_TRADE_MODE tradeMode=(ENUM_ACCOUNT_TRADE_MODE)AccountInfoInteger(ACCOUNT_TRADE_MODE);
if(tradeMode == ACCOUNT_TRADE_MODE_DEMO) return(true);
// tradeMode is ACCOUNT_TRADE_MODE_CONTEST or ACCOUNT_TRADE_MODE_REAL
return(false);
}*/
int TrailOrder(int a_magic_0, int a_cmd_4) {
double l_price_12;
if (TrailStep > 0) {
for (int l_pos_8 = 0; l_pos_8 < OrdersTotal(); l_pos_8++) {
if (OrderSelect(l_pos_8, SELECT_BY_POS, MODE_TRADES) && OrderMagicNumber() == a_magic_0 && OrderSymbol() == Symbol()) {
if (OrderType() == ORDER_TYPE_BUY && OrderType() == a_cmd_4) {
RefreshRates();
l_price_12 = NormalizeDouble((::SymbolInfoDouble(_Symbol, ::SYMBOL_BID)) - _Point * TrailStep, _Digits);
if (!(l_price_12 > OrderStopLoss() && (::SymbolInfoDouble(_Symbol, ::SYMBOL_BID)) - _Point * TrailStart > OrderOpenPrice())) continue;
if (!(OrderModify(OrderTicket(), OrderOpenPrice(), l_price_12, OrderTakeProfit(), -1))) continue;
return (1);
}
if (OrderType() == ORDER_TYPE_SELL && OrderType() == a_cmd_4) {
RefreshRates();
l_price_12 = NormalizeDouble((::SymbolInfoDouble(_Symbol, ::SYMBOL_ASK)) + _Point * TrailStep, _Digits);
if (l_price_12 < OrderStopLoss() && (::SymbolInfoDouble(_Symbol, ::SYMBOL_ASK)) + _Point * TrailStart < OrderOpenPrice())
if (OrderModify(OrderTicket(), OrderOpenPrice(), l_price_12, OrderTakeProfit(), -1)) return (1);
}
}
}
}
return (0);
}
void SetSLWhenOppositeExe(int a_magic_0, int a_cmd_4, double ad_8) {
double l_price_20;
double l_ord_takeprofit_28;
if (TrailStep > 0) {
for (int l_pos_16 = 0; l_pos_16 < OrdersTotal(); l_pos_16++) {
OrderSelect(l_pos_16, SELECT_BY_POS);
if ((OrderSymbol() == Symbol() && OrderMagicNumber() == a_magic_0 && OrderType() == a_cmd_4)) {
if (a_cmd_4 == ORDER_TYPE_BUY) {
l_price_20 = ad_8 - TrailStart * _Point - MarketInfo(Symbol(), MODE_SPREAD) * _Point;
l_ord_takeprofit_28 = OrderTakeProfit();
if (ResetSLAfterOppExe) l_price_20 = 0.0;
if (gi_88) l_ord_takeprofit_28 = 0.0;
if (NormalizeDouble(l_price_20 - OrderStopLoss(), _Digits) != 0.0) OrderModify(OrderTicket(), OrderOpenPrice(), l_price_20, l_ord_takeprofit_28, 0);
} else {
if (a_cmd_4 == ORDER_TYPE_SELL) {
l_price_20 = ad_8 + TrailStart * _Point + MarketInfo(Symbol(), MODE_SPREAD) * _Point;
l_ord_takeprofit_28 = OrderTakeProfit();
if (ResetSLAfterOppExe) l_price_20 = 0.0;
if (gi_88) l_ord_takeprofit_28 = 0.0;
if (NormalizeDouble(l_price_20 - OrderStopLoss(), _Digits) != 0.0) OrderModify(OrderTicket(), OrderOpenPrice(), l_price_20, l_ord_takeprofit_28, 0);
}
}
}
}
}
}
void SetTPWhenOppositeExe(int a_magic_0, int a_cmd_4, double ad_8) {
double l_price_20;
for (int l_pos_16 = 0; l_pos_16 < OrdersTotal(); l_pos_16++) {
OrderSelect(l_pos_16, SELECT_BY_POS);
if ((OrderSymbol() == Symbol() && OrderMagicNumber() == a_magic_0 && OrderType() == a_cmd_4)) {
if (a_cmd_4 == ORDER_TYPE_BUY) {
l_price_20 = ad_8 - MarketInfo(Symbol(), MODE_SPREAD) * _Point;
if (NormalizeDouble(l_price_20 - OrderStopLoss(), _Digits) != 0.0) OrderModify(OrderTicket(), OrderOpenPrice(), l_price_20, OrderTakeProfit(), 0);
} else {
if (a_cmd_4 == ORDER_TYPE_SELL) {
l_price_20 = ad_8 + MarketInfo(Symbol(), MODE_SPREAD) * _Point;
if (NormalizeDouble(l_price_20 - OrderStopLoss(), _Digits) != 0.0) OrderModify(OrderTicket(), OrderOpenPrice(), l_price_20, OrderTakeProfit(), 0);
}
}
}
}
}
bool SpreadIsValid() {
if (MarketInfo(Symbol(), MODE_SPREAD) > MaxSpread) return (false);
return (true);
}
- 15-08-2025, 02:21 PM #8
الحمد لله تم تعديل الاكسبيرت عن طريق شات جي تي بي ولكن يوجد خطأ واحد فقط فهل من مساعد
كود PHP:#property copyright "Copyright © 2009, Trader12."
#property link "Trader12"
#include <Trade\Trade.mqh>
CTrade trade;
input string Info = "If Your Broker Allwed Hedge";
input string Info_1 = "You Cant Choose BUY & SELL In one Chart";
input string Info_2 = "You Must Open Two Chart If Use BUY & SELL In One Time";
input string Info_3 = "You Must Change Magic Number If Use BUY & SELL & Pair";
input bool Tradebuy = true;
input bool Tradesell = true;
input double AmountmoneyLose = 10;
input int magic = 9999;
int gi_80 = 5000; // stays normal variable, not input
input int slipp = 3;
input int Dalta = 5;
input string Set_MA_1 = "Moving Average 1";
input int Period1 = 13;
input int MA_SHIFT1 = 0;
input int MA_METHOD1= 1;
input string Set_MA_2 = "Moving Average 2";
input int Period2 = 21;
input int MA_SHIFT2 = 0;
input int MA_METHOD2= 1;
input string Set_Double = "You Can Choose Lot & Step & Target Profit For 40 Double";
input double Lot1 = 0.01;
input int step1 = 200;
input int TP1 = 200;
input double Lot2 = 0.01;
input int step2 = 200;
input int TP2 = 200;
input double Lot3 = 0.02;
input int step3 = 200;
input int TP3 = 200;
input double Lot4 = 0.04;
input int step4 = 200;
input int TP4 = 200;
input double Lot5 = 0.08;
input int step5 = 200;
input int TP5 = 200;
input double Lot6 = 0.16;
input int step6 = 200;
input int TP6 = 200;
input double Lot7 = 0.30;
input int step7 = 200;
input int TP7 = 200;
input double Lot8 = 0.60;
input int step8 = 200;
input int TP8 = 200;
input double Lot9 = 0.68;
input int step9 = 200;
input int TP9 = 200;
input double Lot10 = 0.76;
input int step10 = 20;
input int TP10 = 30;
input double Lot11 = 0.84;
input int step11 = 20;
input int TP11 = 35;
input double Lot12 = 0.92;
input int step12 = 20;
input int TP12 = 40;
input double Lot13 = 1.00;
input int step13 = 20;
input int TP13 = 45;
input double Lot14 = 1.08;
input int step14 = 20;
input int TP14 = 50;
input double Lot15 = 1.14;
input int step15 = 20;
input int TP15 = 55;
input double Lot16 = 1.22;
input int step16 = 20;
input int TP16 = 60;
input double Lot17 = 1.30;
input int step17 = 20;
input int TP17 = 65;
input double Lot18 = 1.38;
input int step18 = 20;
input int TP18 = 70;
input double Lot19 = 1.46;
input int step19 = 20;
input int TP19 = 75;
input double Lot20 = 1.54;
input int step20 = 20;
input int TP20 = 80;
input double Lot21 = 6.8;
input int step21 = 500;
input int TP21 = 40;
input double Lot22 = 6.8;
input int step22 = 30;
input int TP22 = 40;
input double Lot23 = 6.8;
input int step23 = 30;
input int TP23 = 40;
input double Lot24 = 6.8;
input int step24 = 30;
input int TP24 = 40;
input double Lot25 = 6.8;
input int step25 = 30;
input int TP25 = 40;
input double Lot26 = 6.8;
input int step26 = 30;
input int TP26 = 40;
input double Lot27 = 6.8;
input int step27 = 30;
input int TP27 = 40;
input double Lot28 = 6.8;
input int step28 = 30;
input int TP28 = 40;
input double Lot29 = 6.8;
input int step29 = 30;
input int TP29 = 40;
input double Lot30 = 6.8;
input int step30 = 30;
input int TP30 = 40;
input double Lot31 = 6.8;
input int step31 = 30;
input int TP31 = 40;
input double Lot32 = 6.8;
input int step32 = 30;
input int TP32 = 40;
input double Lot33 = 6.8;
input int step33 = 30;
input int TP33 = 40;
input double Lot34 = 6.8;
input int step34 = 30;
input int TP34 = 40;
input double Lot35 = 6.8;
input int step35 = 30;
input int TP35 = 40;
input double Lot36 = 6.8;
input int step36 = 30;
input int TP36 = 40;
input double Lot37 = 6.8;
input int step37 = 30;
input int TP37 = 40;
input double Lot38 = 6.8;
input int step38 = 30;
input int TP38 = 40;
input double Lot39 = 6.8;
input int step39 = 30;
input int TP39 = 40;
input double Lot40 = 6.8;
input int step40 = 30;
input int TP40 = 40;
double g_price_812;
double g_price_828;
double g_price_836;
double g_price_844;
double g_price_852;
int g_ticket_860 = 0;
int g_ticket_864 = 0;
int gi_unused_868 = 0;
int gi_unused_872 = 0;
int g_ticket_876 = 0;
int g_ticket_880 = 0;
double g_ord_takeprofit_884 = 0.0;
double g_ord_takeprofit_892 = 0.0;
double g_ord_lots_900 = 0.0;
double g_ord_lots_908 = 0.0;
double g_ord_lots_916 = 0.0;
double g_ord_open_price_924 = 0.0;
double g_ord_open_price_932 = 0.0;
double gd_940 = 0.0;
double gd_948 = 0.0;
double gd_unused_956 = 0.0;
int gi_972 = 16711680;
int gi_1036 = 10;
void objectCreate(
string name,
int x,
int y,
string text = "-",
int fontsize = 40,
string fontname = "Arial",
color col = clrWhite,
int corner = CORNER_LEFT_UPPER
)
{
long chart_id = ChartID();
int window = 0; // main window in EA
// For indicators, you can keep:
// int window = WindowOnDropped();
// Delete old object if exists (avoid "already exists" errors)
if(ObjectFind(chart_id, name) >= 0)
ObjectDelete(chart_id, name);
// Create label
if(!ObjectCreate(chart_id, name, OBJ_LABEL, window, 0, 0))
{
Print("❌ Failed to create label: ", name);
return;
}
// Set label properties
ObjectSetInteger(chart_id, name, OBJPROP_CORNER, corner);
ObjectSetInteger(chart_id, name, OBJPROP_XDISTANCE, x);
ObjectSetInteger(chart_id, name, OBJPROP_YDISTANCE, y);
ObjectSetInteger(chart_id, name, OBJPROP_COLOR, col);
ObjectSetInteger(chart_id, name, OBJPROP_FONTSIZE, fontsize);
ObjectSetString(chart_id, name, OBJPROP_FONT, fontname);
ObjectSetString(chart_id, name, OBJPROP_TEXT, text);
}
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
gd_unused_956 = Lot1;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ObjectDelete(ChartID(), "Info");
ObjectDelete(ChartID(), "Info1");
ObjectDelete(ChartID(), "Mode");
ObjectDelete(ChartID(), "Risk");
Comment("");
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// Account information
Comment(
"\n SolMoon",
"\n H$H ",
"\n------------------------------------------------",
"\n BROKER INFORMATION:",
"\n Broker Company: ", AccountInfoString(ACCOUNT_COMPANY),
"\n------------------------------------------------",
"\n ACCOUNT INFORMATION:",
"\n Account Type: ", AccountInfoString(ACCOUNT_SERVER),
"\n Account Name: ", AccountInfoString(ACCOUNT_NAME),
"\n Account Number: ", (long)AccountInfoInteger(ACCOUNT_LOGIN),
"\n Account Leverage: ", (string)AccountInfoInteger(ACCOUNT_LEVERAGE),
"\n Account Balance: ", DoubleToString(AccountInfoDouble(ACCOUNT_BALANCE), 2),
"\n Account Currency: ", AccountInfoString(ACCOUNT_CURRENCY),
"\n Account Equity: ", DoubleToString(AccountInfoDouble(ACCOUNT_EQUITY), 2),
"\n------------------------------------------------",
"\n ORDERS INFORMATION:",
"\n Working & Pending Order: ", (string)OrdersTotal(),
"\n Orders History Total: ", (string)HistoryDealsTotal(),
"\n------------------------------------------------",
"\n MARGIN INFORMATION:",
"\n Free Margin: ", DoubleToString(AccountInfoDouble(ACCOUNT_FREEMARGIN), 2),
"\n Used Margin: ", DoubleToString(AccountInfoDouble(ACCOUNT_MARGIN), 2),
"\n------------------------------------------------",
"\n PAIRS: ", _Symbol,
"\n SPREAD: ", (string)(SymbolInfoInteger(_Symbol, SYMBOL_SPREAD)), " points",
"\n Min Lot: ", DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN), 2),
"\n Max Lot: ", DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX), 2),
"\n------------------------------------------------",
"\n Actual Server Time: ", TimeToString(TimeCurrent(), TIME_DATE | TIME_SECONDS),
"\n------------------------------------------------"
);
// Get Moving Averages (example using built-in iMA)
// Calculate Moving Averages
double MA1 = iMA(_Symbol, PERIOD_CURRENT, Period1, MA_SHIFT1, MA_METHOD1, PRICE_CLOSE, 0);
double MA2 = iMA(_Symbol, PERIOD_CURRENT, Period2, MA_SHIFT2, MA_METHOD2, PRICE_CLOSE, 0);
// Adjusted values with Dalta
double ld_16 = MA2 + Dalta * _Point;
double ld_24 = MA1 + Dalta * _Point;
// Count open positions for this magic number
int li_32 = OrdersTotals(magic); // <-- This needs to be adapted for MT5
double ld_36 = Profit(magic); // <-- You already have MT5 version
// Close BUY positions if condition met
if (MA1 < MA2 && ld_36 > AmountmoneyLose && li_32 != 0)
{
closebuy(magic); // MT5 version already written
DeletePendingOrdersbuy(magic); // MT5 version already written
return;
}
// Close SELL positions if condition met
if (MA1 > MA2 && ld_36 > AmountmoneyLose && li_32 != 0)
{
closesell(magic); // MT5 version already written
DeletePendingOrderssell(magic); // MT5 version already written
return;
}
// No trade if MA conditions not met
if (MA1 < ld_16 && li_32 == 0 && Tradebuy) return;
if (MA2 < ld_24 && li_32 == 0 && Tradesell) return;
// Prevent both buy and sell from running on same chart
if (Tradesell && Tradebuy)
{
Alert("Tradebuy=true and Tradesell=true - Cannot execute both directions on same chart");
return;
}
////
void ExecuteOrders()
{
Ticket();
double l_lots_44 = getlot();
int li_52 = TP();
int li_56 = Step();
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
if (g_ticket_860 == 0)
{
if (g_ticket_876 != 0) trade.OrderDelete(g_ticket_876);
g_price_828 = ask - gi_80 * _Point;
if (gi_80 <= 0) g_price_828 = 0;
g_price_844 = ask + li_52 * _Point;
if (Tradebuy)
trade.Buy(Lot1, _Symbol, ask, g_price_828, g_price_844, "magic = " + IntegerToString(magic));
}
if (g_ticket_864 == 0)
{
if (g_ticket_880 != 0) trade.OrderDelete(g_ticket_880);
g_price_836 = bid + gi_80 * _Point;
if (gi_80 <= 0) g_price_836 = 0;
g_price_852 = bid - li_52 * _Point;
if (Tradesell)
trade.Sell(Lot1, _Symbol, bid, g_price_836, g_price_852, "magic = " + IntegerToString(magic));
}
if (g_ticket_860 != 0 && g_ticket_876 == 0)
{
g_price_812 = g_ord_open_price_924 - li_56 * _Point;
g_price_828 = g_price_812 - gi_80 * _Point;
if (gi_80 <= 0) g_price_828 = 0;
g_price_844 = g_price_812 + li_52 * _Point;
trade.BuyLimit(l_lots_44, g_price_812, _Symbol, g_price_828, g_price_844, ORDER_TIME_GTC, 0, "magic = " + IntegerToString(magic));
}
if (g_ticket_864 != 0 && g_ticket_880 == 0)
{
g_price_812 = g_ord_open_price_932 + li_56 * _Point;
g_price_836 = g_price_812 + gi_80 * _Point;
if (gi_80 <= 0) gi_80 = 0;
g_price_852 = g_price_812 - li_52 * _Point;
trade.SellLimit(l_lots_44, g_price_812, _Symbol, g_price_836, g_price_852, ORDER_TIME_GTC, 0, "magic = " + IntegerToString(magic));
}
TrailingStopTp(g_ord_open_price_924, g_ord_takeprofit_884, g_ord_open_price_932, g_ord_takeprofit_892, g_ticket_860, g_ticket_864);
if (!MQLInfoInteger(MQL_TESTER))
{
objectCreate("Info", 240, 10, "-", gi_1036, "Arial", gi_972);
objectCreate("Info1", 240, 10, "-", gi_1036, "Arial", gi_972);
objectCreate("Mode", 840, 30, "-", gi_1036, "Arial", gi_972);
objectCreate("Risk", 50, 70, "-", gi_1036, "Arial", gi_972);
long chart_id = ChartID();
if (MA1 > MA2)
ObjectSetString(chart_id, "Info", OBJPROP_TEXT, "The Two MA Indicator Confirm The Buy Mode");
else if (MA2 < MA1)
ObjectSetString(chart_id, "Info1", OBJPROP_TEXT, "The Two MA Indicator Confirm The Sell Mode");
if (Tradesell)
ObjectSetString(chart_id, "Mode", OBJPROP_TEXT, "Sell Mode ");
else if (Tradebuy)
ObjectSetString(chart_id, "Mode", OBJPROP_TEXT, "Buy Mode");
if ((MA1 > MA2 && g_ticket_864 != 0) || (g_ticket_860 != 0 && MA1 < MA2))
ObjectSetString(chart_id, "Risk", OBJPROP_TEXT, "Risk!!!! waiting for Closeorders Mode");
}
}
////////////////
//////////////
int OrdersTotals(int a_magic_0)
{
int count = 0;
int total = PositionsTotal();
for(int i = 0; i < total; i++)
{
if(PositionSelectByIndex(i))
{
long magic;
string sym;
long type;
PositionGetInteger(POSITION_MAGIC, magic);
PositionGetString(POSITION_SYMBOL, sym);
PositionGetInteger(POSITION_TYPE, type);
if(magic == a_magic_0 && sym == _Symbol &&
(type == POSITION_TYPE_BUY || type == POSITION_TYPE_SELL))
{
count++;
}
}
}
return count;
}
////////
// Example arrays (fill with your Lot1..Lot40 values)
double LotsArray[40] = { Lot1, Lot2, Lot3, /* ... */ Lot40 };
double TPArray[40] = { TP1, TP2, TP3, /* ... */ TP40 };
double StepArray[40] = { step1, step2, step3, /* ... */ step40 };
double getlot()
{
int idx = OrdersTotals(magic);
if(idx >= 0 && idx < 40)
return LotsArray[idx];
return LotsArray[0]; // default fallback
}
double TP()
{
int idx = OrdersTotals(magic);
if(idx >= 0 && idx < 40)
return TPArray[idx];
return TPArray[0];
}
double Step()
{
int idx = OrdersTotals(magic);
if(idx >= 0 && idx < 40)
return StepArray[idx];
return StepArray[0];
}
////////
///
int DeletePendingOrdersSell(int a_magic_0)
{
int total = OrdersTotal();
for(int i = total - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS))
{
long magic;
string sym;
long type;
ulong ticket;
OrderGetInteger(ORDER_MAGIC, magic);
OrderGetString(ORDER_SYMBOL, sym);
OrderGetInteger(ORDER_TYPE, type);
ticket = OrderGetInteger(ORDER_TICKET);
if(magic == a_magic_0 && sym == _Symbol && type == ORDER_TYPE_SELL_LIMIT)
{
if(!OrderDelete(ticket))
Print("Failed to delete order ", ticket, " Error: ", GetLastError());
}
}
}
return 0;
}
///
///
int DeletePendingOrdersBuy(int a_magic_0)
{
int total = OrdersTotal();
for(int i = total - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS))
{
long magic;
string sym;
long type;
ulong ticket;
OrderGetInteger(ORDER_MAGIC, magic);
OrderGetString(ORDER_SYMBOL, sym);
OrderGetInteger(ORDER_TYPE, type);
ticket = OrderGetInteger(ORDER_TICKET);
if(magic == a_magic_0 && sym == _Symbol && type == ORDER_TYPE_BUY_LIMIT)
{
if(!OrderDelete(ticket))
Print("Failed to delete order ", ticket, " Error: ", GetLastError());
}
}
}
return 0;
}
/////
void CloseBuy(int a_magic_0)
{
int total = PositionsTotal();
for(int i = total - 1; i >= 0; i--)
{
string sym;
long magic;
long type;
// Select the position
if(PositionSelectByIndex(i))
{
PositionGetString(POSITION_SYMBOL, sym);
PositionGetInteger(POSITION_MAGIC, magic);
PositionGetInteger(POSITION_TYPE, type);
// Check symbol, magic number, and position type (buy)
if(sym == _Symbol && magic == a_magic_0 && type == POSITION_TYPE_BUY)
{
double volume = PositionGetDouble(POSITION_VOLUME);
// Close the position
if(!trade.PositionClose(sym))
Print("Failed to close BUY position on ", sym,
" Error: ", GetLastError());
}
}
}
}
///
void CloseSell(int a_magic_0)
{
int total = PositionsTotal();
for(int i = total - 1; i >= 0; i--)
{
string sym;
long magic;
long type;
// Select position
if(PositionSelectByIndex(i))
{
PositionGetString(POSITION_SYMBOL, sym);
PositionGetInteger(POSITION_MAGIC, magic);
PositionGetInteger(POSITION_TYPE, type);
// Check symbol, magic number, and SELL type
if(sym == _Symbol && magic == a_magic_0 && type == POSITION_TYPE_SELL)
{
// Close position
if(!trade.PositionClose(sym))
Print("Failed to close SELL position on ", sym,
" Error: ", GetLastError());
}
}
}
}
///
double Profit(int a_magic_0)
{
double total_profit = 0;
int total_positions = PositionsTotal();
for(int i = 0; i < total_positions; i++)
{
string sym;
long magic;
long type;
double profit;
if(PositionSelectByIndex(i))
{
PositionGetString(POSITION_SYMBOL, sym);
PositionGetInteger(POSITION_MAGIC, magic);
PositionGetInteger(POSITION_TYPE, type);
PositionGetDouble(POSITION_PROFIT, profit);
// Ensure magic number and symbol match
if(sym == _Symbol && magic == a_magic_0 &&
(type == POSITION_TYPE_BUY || type == POSITION_TYPE_SELL))
{
total_profit += profit;
}
}
}
return total_profit;
}
/////
double TrailingStopTp(double ad_0, double ad_8, double ad_16, double ad_24, int ai_32, int ai_36)
{
double l_ord_takeprofit_40;
double l_price_48;
double l_ord_takeprofit_56;
double l_price_64;
for(int i = 0; i < PositionsTotal(); i++)
{
string sym;
long magic_number, type;
double open_price, stop_loss, take_profit;
if(PositionSelectByIndex(i))
{
PositionGetString(POSITION_SYMBOL, sym);
PositionGetInteger(POSITION_MAGIC, magic_number);
PositionGetInteger(POSITION_TYPE, type);
PositionGetDouble(POSITION_PRICE_OPEN, open_price);
PositionGetDouble(POSITION_SL, stop_loss);
PositionGetDouble(POSITION_TP, take_profit);
// BUY trailing logic
if(sym == _Symbol && type == POSITION_TYPE_BUY && ai_32 != 0 && magic_number == magic)
{
l_price_48 = ad_0 - gi_80 * _Point;
if(gi_80 <= 0) gi_80 = 0;
if(ai_32 != (int)PositionGetInteger(POSITION_TICKET))
l_ord_takeprofit_40 = ad_8;
else
l_ord_takeprofit_40 = take_profit;
if(l_ord_takeprofit_40 != take_profit || l_price_48 != stop_loss)
trade.PositionModify(sym, l_price_48, l_ord_takeprofit_40);
}
// SELL trailing logic
if(sym == _Symbol && type == POSITION_TYPE_SELL && ai_36 != 0 && magic_number == magic)
{
l_price_64 = ad_16 + gi_80 * _Point;
if(gi_80 <= 0) l_price_64 = 0;
if(ai_36 != (int)PositionGetInteger(POSITION_TICKET))
l_ord_takeprofit_56 = ad_24;
else
l_ord_takeprofit_56 = take_profit;
if(l_ord_takeprofit_56 != take_profit || l_price_64 != stop_loss)
trade.PositionModify(sym, l_price_64, l_ord_takeprofit_56);
}
}
}
return 0.0;
}
////
void Ticket()
{
g_ticket_860 = 0;
g_ticket_864 = 0;
gi_unused_868 = 0;
gi_unused_872 = 0;
g_ticket_876 = 0;
g_ticket_880 = 0;
g_ord_takeprofit_884 = 0;
g_ord_takeprofit_892 = 0;
g_ord_lots_900 = 0;
g_ord_lots_908 = 0;
g_ord_lots_916 = 0;
g_ord_open_price_924 = 0;
g_ord_open_price_932 = 0;
gd_940 = 0;
gd_948 = 0;
// === Open positions loop ===
for(int i = 0; i < PositionsTotal(); i++)
{
if(PositionSelectByIndex(i))
{
string sym;
long magic_number, type;
double lots, open_price, tp;
PositionGetString(POSITION_SYMBOL, sym);
PositionGetInteger(POSITION_MAGIC, magic_number);
PositionGetInteger(POSITION_TYPE, type);
PositionGetDouble(POSITION_VOLUME, lots);
PositionGetDouble(POSITION_PRICE_OPEN, open_price);
PositionGetDouble(POSITION_TP, tp);
ulong ticket = (ulong)PositionGetInteger(POSITION_TICKET);
if(sym == _Symbol && magic_number == magic)
{
// BUY
if(type == POSITION_TYPE_BUY && g_ticket_860 < (int)ticket)
{
g_ord_lots_900 = lots;
g_ord_open_price_924 = open_price;
g_ticket_860 = (int)ticket;
g_ord_takeprofit_884 = tp;
if(lots == Lot1) gd_940 = open_price - gi_80 * _Point;
}
// SELL
if(type == POSITION_TYPE_SELL && g_ticket_864 < (int)ticket)
{
g_ord_lots_908 = lots;
g_ord_open_price_932 = open_price;
g_ticket_864 = (int)ticket;
g_ord_takeprofit_892 = tp;
if(lots == Lot1) gd_948 = open_price + gi_80 * _Point;
}
}
}
}
// === Pending orders loop ===
for(int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_INDEX))
{
string sym;
long magic_number, type;
double lots;
OrderGetString(ORDER_SYMBOL, sym);
OrderGetInteger(ORDER_MAGIC, magic_number);
OrderGetInteger(ORDER_TYPE, type);
OrderGetDouble(ORDER_VOLUME_CURRENT, lots);
ulong ticket = (ulong)OrderGetInteger(ORDER_TICKET);
if(sym == _Symbol && magic_number == magic)
{
if(type == ORDER_TYPE_BUY_LIMIT)
{
g_ticket_876 = (int)ticket;
g_ord_lots_916 = lots;
}
if(type == ORDER_TYPE_SELL_LIMIT)
{
g_ticket_880 = (int)ticket;
g_ord_lots_916 = lots;
}
}
}
}
}
- 31-08-2025, 12:26 AM #9
السلام عليكم
بالتوفيق
- 03-09-2025, 12:57 PM #10
كود:#property copyright "Copyright © 2009, Trader12." #property link "Trader12" #include <Trade\Trade.mqh> CTrade trade; input string Info = "If Your Broker Allwed Hedge"; input string Info_1 = "You Cant Choose BUY & SELL In one Chart"; input string Info_2 = "You Must Open Two Chart If Use BUY & SELL In One Time"; input string Info_3 = "You Must Change Magic Number If Use BUY & SELL & Pair"; input bool Tradebuy = true; input bool Tradesell = true; input double AmountmoneyLose = 10; input int MagicNumber = 9999; int gi_80 = 5000; // stays normal variable, not input input int slipp = 3; input int Dalta = 5; input string Set_MA_1 = "Moving Average 1"; input int Period1 = 13; input int MA_SHIFT1 = 0; input int MA_METHOD1= 1; input string Set_MA_2 = "Moving Average 2"; input int Period2 = 21; input int MA_SHIFT2 = 0; input int MA_METHOD2= 1; input string Set_Double = "You Can Choose Lot & Step & Target Profit For 40 Double"; input double Lot1 = 0.01; input int step1 = 200; input int TP1 = 200; input double Lot2 = 0.01; input int step2 = 200; input int TP2 = 200; input double Lot3 = 0.02; input int step3 = 200; input int TP3 = 200; input double Lot4 = 0.04; input int step4 = 200; input int TP4 = 200; input double Lot5 = 0.08; input int step5 = 200; input int TP5 = 200; input double Lot6 = 0.16; input int step6 = 200; input int TP6 = 200; input double Lot7 = 0.30; input int step7 = 200; input int TP7 = 200; input double Lot8 = 0.60; input int step8 = 200; input int TP8 = 200; input double Lot9 = 0.68; input int step9 = 200; input int TP9 = 200; input double Lot10 = 0.76; input int step10 = 20; input int TP10 = 30; input double Lot11 = 0.84; input int step11 = 20; input int TP11 = 35; input double Lot12 = 0.92; input int step12 = 20; input int TP12 = 40; input double Lot13 = 1.00; input int step13 = 20; input int TP13 = 45; input double Lot14 = 1.08; input int step14 = 20; input int TP14 = 50; input double Lot15 = 1.14; input int step15 = 20; input int TP15 = 55; input double Lot16 = 1.22; input int step16 = 20; input int TP16 = 60; input double Lot17 = 1.30; input int step17 = 20; input int TP17 = 65; input double Lot18 = 1.38; input int step18 = 20; input int TP18 = 70; input double Lot19 = 1.46; input int step19 = 20; input int TP19 = 75; input double Lot20 = 1.54; input int step20 = 20; input int TP20 = 80; input double Lot21 = 6.8; input int step21 = 500; input int TP21 = 40; input double Lot22 = 6.8; input int step22 = 30; input int TP22 = 40; input double Lot23 = 6.8; input int step23 = 30; input int TP23 = 40; input double Lot24 = 6.8; input int step24 = 30; input int TP24 = 40; input double Lot25 = 6.8; input int step25 = 30; input int TP25 = 40; input double Lot26 = 6.8; input int step26 = 30; input int TP26 = 40; input double Lot27 = 6.8; input int step27 = 30; input int TP27 = 40; input double Lot28 = 6.8; input int step28 = 30; input int TP28 = 40; input double Lot29 = 6.8; input int step29 = 30; input int TP29 = 40; input double Lot30 = 6.8; input int step30 = 30; input int TP30 = 40; input double Lot31 = 6.8; input int step31 = 30; input int TP31 = 40; input double Lot32 = 6.8; input int step32 = 30; input int TP32 = 40; input double Lot33 = 6.8; input int step33 = 30; input int TP33 = 40; input double Lot34 = 6.8; input int step34 = 30; input int TP34 = 40; input double Lot35 = 6.8; input int step35 = 30; input int TP35 = 40; input double Lot36 = 6.8; input int step36 = 30; input int TP36 = 40; input double Lot37 = 6.8; input int step37 = 30; input int TP37 = 40; input double Lot38 = 6.8; input int step38 = 30; input int TP38 = 40; input double Lot39 = 6.8; input int step39 = 30; input int TP39 = 40; input double Lot40 = 6.8; input int step40 = 30; input int TP40 = 40; double g_price_812; double g_price_828; double g_price_836; double g_price_844; double g_price_852; ulong g_ticket_860 = 0; ulong g_ticket_864 = 0; int gi_unused_868 = 0; int gi_unused_872 = 0; ulong g_ticket_876 = 0; ulong g_ticket_880 = 0; double g_ord_takeprofit_884 = 0.0; double g_ord_takeprofit_892 = 0.0; double g_ord_lots_900 = 0.0; double g_ord_lots_908 = 0.0; double g_ord_lots_916 = 0.0; double g_ord_open_price_924 = 0.0; double g_ord_open_price_932 = 0.0; double gd_940 = 0.0; double gd_948 = 0.0; double gd_unused_956 = 0.0; int gi_972 = 16711680; int gi_1036 = 10; double LotsArray[40] = { Lot1, Lot2, Lot3, Lot4, Lot5, Lot6, Lot7, Lot8, Lot9, Lot10, Lot11, Lot12, Lot13, Lot14, Lot15, Lot16, Lot17, Lot18, Lot19, Lot20, Lot21, Lot22, Lot23, Lot24, Lot25, Lot26, Lot27, Lot28, Lot29, Lot30, Lot31, Lot32, Lot33, Lot34, Lot35, Lot36, Lot37, Lot38, Lot39, Lot40 }; int TPArray[40] = { TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10, TP11, TP12, TP13, TP14, TP15, TP16, TP17, TP18, TP19, TP20, TP21, TP22, TP23, TP24, TP25, TP26, TP27, TP28, TP29, TP30, TP31, TP32, TP33, TP34, TP35, TP36, TP37, TP38, TP39, TP40 }; int StepArray[40] = { step1, step2, step3, step4, step5, step6, step7, step8, step9, step10, step11, step12, step13, step14, step15, step16, step17, step18, step19, step20, step21, step22, step23, step24, step25, step26, step27, step28, step29, step30, step31, step32, step33, step34, step35, step36, step37, step38, step39, step40 }; int ma1_handle = INVALID_HANDLE; int ma2_handle = INVALID_HANDLE; void objectCreate( string name, int x, int y, string text = "-", int fontsize = 40, string fontname = "Arial", color col = clrWhite, int corner = CORNER_LEFT_UPPER ) { long chart_id = ChartID(); int window = 0; // main window in EA // Delete old object if exists (avoid "already exists" errors) if(ObjectFind(chart_id, name) >= 0) ObjectDelete(chart_id, name); // Create label if(!ObjectCreate(chart_id, name, OBJ_LABEL, window, 0, 0)) { Print("❌ Failed to create label: ", name); return; } // Set label properties ObjectSetInteger(chart_id, name, OBJPROP_CORNER, corner); ObjectSetInteger(chart_id, name, OBJPROP_XDISTANCE, x); ObjectSetInteger(chart_id, name, OBJPROP_YDISTANCE, y); ObjectSetInteger(chart_id, name, OBJPROP_COLOR, col); ObjectSetInteger(chart_id, name, OBJPROP_FONTSIZE, fontsize); ObjectSetString(chart_id, name, OBJPROP_FONT, fontname); ObjectSetString(chart_id, name, OBJPROP_TEXT, text); } //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { trade.SetExpertMagicNumber(MagicNumber); ulong dev = (ulong)slipp; trade.SetDeviationInPoints(dev); gd_unused_956 = Lot1; ma1_handle = iMA(_Symbol, PERIOD_CURRENT, Period1, MA_SHIFT1, (ENUM_MA_METHOD)MA_METHOD1, PRICE_CLOSE); if(ma1_handle == INVALID_HANDLE) { Print("Failed to create MA1 handle"); return(INIT_FAILED); } ma2_handle = iMA(_Symbol, PERIOD_CURRENT, Period2, MA_SHIFT2, (ENUM_MA_METHOD)MA_METHOD2, PRICE_CLOSE); if(ma2_handle == INVALID_HANDLE) { Print("Failed to create MA2 handle"); return(INIT_FAILED); } return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { ObjectDelete(ChartID(), "Info"); ObjectDelete(ChartID(), "Info1"); ObjectDelete(ChartID(), "Mode"); ObjectDelete(ChartID(), "Risk"); Comment(""); if(ma1_handle != INVALID_HANDLE) IndicatorRelease(ma1_handle); if(ma2_handle != INVALID_HANDLE) IndicatorRelease(ma2_handle); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // Account information Comment( "\n SolMoon", "\n H$H ", "\n------------------------------------------------", "\n BROKER INFORMATION:", "\n Broker Company: ", AccountInfoString(ACCOUNT_COMPANY), "\n------------------------------------------------", "\n ACCOUNT INFORMATION:", "\n Account Type: ", AccountInfoString(ACCOUNT_SERVER), "\n Account Name: ", AccountInfoString(ACCOUNT_NAME), "\n Account Number: ", (long)AccountInfoInteger(ACCOUNT_LOGIN), "\n Account Leverage: ", (string)AccountInfoInteger(ACCOUNT_LEVERAGE), "\n Account Balance: ", DoubleToString(AccountInfoDouble(ACCOUNT_BALANCE), 2), "\n Account Currency: ", AccountInfoString(ACCOUNT_CURRENCY), "\n Account Equity: ", DoubleToString(AccountInfoDouble(ACCOUNT_EQUITY), 2), "\n------------------------------------------------", "\n ORDERS INFORMATION:", "\n Working & Pending Order: ", (string)OrdersTotal(), "\n Orders History Total: ", (string)HistoryDealsTotal(), "\n------------------------------------------------", "\n MARGIN INFORMATION:", "\n Free Margin: ", DoubleToString(AccountInfoDouble(ACCOUNT_MARGIN_FREE), 2), "\n Used Margin: ", DoubleToString(AccountInfoDouble(ACCOUNT_MARGIN), 2), "\n------------------------------------------------", "\n PAIRS: ", _Symbol, "\n SPREAD: ", (string)(SymbolInfoInteger(_Symbol, SYMBOL_SPREAD)), " points", "\n Min Lot: ", DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN), 2), "\n Max Lot: ", DoubleToString(SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX), 2), "\n------------------------------------------------", "\n Actual Server Time: ", TimeToString(TimeCurrent(), TIME_DATE | TIME_SECONDS), "\n------------------------------------------------" ); // Calculate Moving Averages double ma1_buffer[1], ma2_buffer[1]; if(CopyBuffer(ma1_handle, 0, 0, 1, ma1_buffer) != 1) { Print("Failed to copy MA1 buffer"); return; } if(CopyBuffer(ma2_handle, 0, 0, 1, ma2_buffer) != 1) { Print("Failed to copy MA2 buffer"); return; } double MA1 = ma1_buffer[0]; double MA2 = ma2_buffer[0]; // Adjusted values with Dalta double ld_16 = MA2 + Dalta * _Point; double ld_24 = MA1 + Dalta * _Point; // Count open positions for this magic number int li_32 = OrdersTotals(MagicNumber); double ld_36 = Profit(MagicNumber); // Close BUY positions if condition met if (MA1 < MA2 && ld_36 > AmountmoneyLose && li_32 != 0) { CloseBuy(MagicNumber); DeletePendingOrdersBuy(MagicNumber); return; } // Close SELL positions if condition met if (MA1 > MA2 && ld_36 > AmountmoneyLose && li_32 != 0) { CloseSell(MagicNumber); DeletePendingOrdersSell(MagicNumber); return; } // No trade if MA conditions not met if (MA1 < ld_16 && li_32 == 0 && Tradebuy) return; if (MA2 < ld_24 && li_32 == 0 && Tradesell) return; // Prevent both buy and sell from running on same chart if (Tradesell && Tradebuy) { Alert("Tradebuy=true and Tradesell=true - Cannot execute both directions on same chart"); return; } ExecuteOrders(MA1, MA2); } void ExecuteOrders(double MA1, double MA2) { Ticket(); double l_lots_44 = getlot(); int li_52 = TP(); int li_56 = Step(); double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); if (g_ticket_860 == 0) { if (g_ticket_876 != 0) trade.OrderDelete(g_ticket_876); g_price_828 = ask - gi_80 * _Point; if (gi_80 <= 0) g_price_828 = 0; g_price_844 = ask + li_52 * _Point; if (Tradebuy) trade.Buy(Lot1, _Symbol, ask, g_price_828, g_price_844, "MagicNumber = " + IntegerToString(MagicNumber)); } if (g_ticket_864 == 0) { if (g_ticket_880 != 0) trade.OrderDelete(g_ticket_880); g_price_836 = bid + gi_80 * _Point; if (gi_80 <= 0) g_price_836 = 0; g_price_852 = bid - li_52 * _Point; if (Tradesell) trade.Sell(Lot1, _Symbol, bid, g_price_836, g_price_852, "MagicNumber = " + IntegerToString(MagicNumber)); } if (g_ticket_860 != 0 && g_ticket_876 == 0) { g_price_812 = g_ord_open_price_924 - li_56 * _Point; g_price_828 = g_price_812 - gi_80 * _Point; if (gi_80 <= 0) g_price_828 = 0; g_price_844 = g_price_812 + li_52 * _Point; trade.BuyLimit(l_lots_44, g_price_812, _Symbol, g_price_828, g_price_844, ORDER_TIME_GTC, 0, "MagicNumber = " + IntegerToString(MagicNumber)); } if (g_ticket_864 != 0 && g_ticket_880 == 0) { g_price_812 = g_ord_open_price_932 + li_56 * _Point; g_price_836 = g_price_812 + gi_80 * _Point; if (gi_80 <= 0) g_price_836 = 0; g_price_852 = g_price_812 - li_52 * _Point; trade.SellLimit(l_lots_44, g_price_812, _Symbol, g_price_836, g_price_852, ORDER_TIME_GTC, 0, "MagicNumber = " + IntegerToString(MagicNumber)); } TrailingStopTp(g_ord_open_price_924, g_ord_takeprofit_884, g_ord_open_price_932, g_ord_takeprofit_892, g_ticket_860, g_ticket_864); if (!MQLInfoInteger(MQL_TESTER)) { objectCreate("Info", 240, 10, "-", gi_1036, "Arial", gi_972); objectCreate("Info1", 240, 10, "-", gi_1036, "Arial", gi_972); objectCreate("Mode", 840, 30, "-", gi_1036, "Arial", gi_972); objectCreate("Risk", 50, 70, "-", gi_1036, "Arial", gi_972); long chart_id = ChartID(); if (MA1 > MA2) ObjectSetString(chart_id, "Info", OBJPROP_TEXT, "The Two MA Indicator Confirm The Buy Mode"); else if (MA2 < MA1) ObjectSetString(chart_id, "Info1", OBJPROP_TEXT, "The Two MA Indicator Confirm The Sell Mode"); if (Tradesell) ObjectSetString(chart_id, "Mode", OBJPROP_TEXT, "Sell Mode "); else if (Tradebuy) ObjectSetString(chart_id, "Mode", OBJPROP_TEXT, "Buy Mode"); if ((MA1 > MA2 && g_ticket_864 != 0) || (g_ticket_860 != 0 && MA1 < MA2)) ObjectSetString(chart_id, "Risk", OBJPROP_TEXT, "Risk!!!! waiting for Closeorders Mode"); } } int OrdersTotals(int a_magic_0) { int count = 0; int total = PositionsTotal(); for(int i = 0; i < total; i++) { ulong ticket = PositionGetTicket(i); if(ticket != ULONG_MAX) { if(PositionSelectByTicket(ticket)) { long magic = PositionGetInteger(POSITION_MAGIC); string sym = PositionGetString(POSITION_SYMBOL); long type = PositionGetInteger(POSITION_TYPE); if(magic == a_magic_0 && sym == _Symbol && (type == POSITION_TYPE_BUY || type == POSITION_TYPE_SELL)) { count++; } } } } return count; } double getlot() { int idx = OrdersTotals(MagicNumber); if(idx >= 0 && idx < 40) return LotsArray[idx]; return LotsArray[0]; // default fallback } int TP() { int idx = OrdersTotals(MagicNumber); if(idx >= 0 && idx < 40) return TPArray[idx]; return TPArray[0]; } int Step() { int idx = OrdersTotals(MagicNumber); if(idx >= 0 && idx < 40) return StepArray[idx]; return StepArray[0]; } int DeletePendingOrdersSell(int a_magic_0) { int total = OrdersTotal(); for(int i = 0; i < total; i++) { ulong ticket = OrderGetTicket(i); if(OrderSelect(ticket)) { long magic = OrderGetInteger(ORDER_MAGIC); string sym = OrderGetString(ORDER_SYMBOL); long type = OrderGetInteger(ORDER_TYPE); if(magic == a_magic_0 && sym == _Symbol && type == ORDER_TYPE_SELL_LIMIT) { if(!trade.OrderDelete(ticket)) Print("Failed to delete order ", ticket, " Error: ", GetLastError()); } } } return 0; } int DeletePendingOrdersBuy(int a_magic_0) { int total = OrdersTotal(); for(int i = 0; i < total; i++) { ulong ticket = OrderGetTicket(i); if(OrderSelect(ticket)) { long magic = OrderGetInteger(ORDER_MAGIC); string sym = OrderGetString(ORDER_SYMBOL); long type = OrderGetInteger(ORDER_TYPE); if(magic == a_magic_0 && sym == _Symbol && type == ORDER_TYPE_BUY_LIMIT) { if(!trade.OrderDelete(ticket)) Print("Failed to delete order ", ticket, " Error: ", GetLastError()); } } } return 0; } void CloseBuy(int a_magic_0) { int total = PositionsTotal(); for(int i = total - 1; i >= 0; i--) { ulong ticket = PositionGetTicket(i); if(ticket != ULONG_MAX) { if(PositionSelectByTicket(ticket)) { string sym = PositionGetString(POSITION_SYMBOL); long magic = PositionGetInteger(POSITION_MAGIC); long type = PositionGetInteger(POSITION_TYPE); if(sym == _Symbol && magic == a_magic_0 && type == POSITION_TYPE_BUY) { if(!trade.PositionClose(ticket)) Print("Failed to close BUY position ", ticket, " Error: ", GetLastError()); } } } } } void CloseSell(int a_magic_0) { int total = PositionsTotal(); for(int i = total - 1; i >= 0; i--) { ulong ticket = PositionGetTicket(i); if(ticket != ULONG_MAX) { if(PositionSelectByTicket(ticket)) { string sym = PositionGetString(POSITION_SYMBOL); long magic = PositionGetInteger(POSITION_MAGIC); long type = PositionGetInteger(POSITION_TYPE); if(sym == _Symbol && magic == a_magic_0 && type == POSITION_TYPE_SELL) { if(!trade.PositionClose(ticket)) Print("Failed to close SELL position ", ticket, " Error: ", GetLastError()); } } } } } double Profit(int a_magic_0) { double total_profit = 0; int total_positions = PositionsTotal(); for(int i = 0; i < total_positions; i++) { ulong ticket = PositionGetTicket(i); if(ticket != ULONG_MAX) { if(PositionSelectByTicket(ticket)) { string sym = PositionGetString(POSITION_SYMBOL); long magic = PositionGetInteger(POSITION_MAGIC); long type = PositionGetInteger(POSITION_TYPE); double profit = PositionGetDouble(POSITION_PROFIT); if(sym == _Symbol && magic == a_magic_0 && (type == POSITION_TYPE_BUY || type == POSITION_TYPE_SELL)) { total_profit += profit; } } } } return total_profit; } double TrailingStopTp(double ad_0, double ad_8, double ad_16, double ad_24, ulong ai_32, ulong ai_36) { double l_ord_takeprofit_40; double l_price_48; double l_ord_takeprofit_56; double l_price_64; for(int i = 0; i < PositionsTotal(); i++) { ulong ticket = PositionGetTicket(i); if(ticket != ULONG_MAX) { if(PositionSelectByTicket(ticket)) { string sym = PositionGetString(POSITION_SYMBOL); long magic_number = PositionGetInteger(POSITION_MAGIC); long type = PositionGetInteger(POSITION_TYPE); double open_price = PositionGetDouble(POSITION_PRICE_OPEN); double stop_loss = PositionGetDouble(POSITION_SL); double take_profit = PositionGetDouble(POSITION_TP); // BUY trailing logic if(sym == _Symbol && type == POSITION_TYPE_BUY && ai_32 != 0 && magic_number == MagicNumber) { l_price_48 = ad_0 - gi_80 * _Point; if(gi_80 <= 0) l_price_48 = 0; if(ai_32 != ticket) l_ord_takeprofit_40 = ad_8; else l_ord_takeprofit_40 = take_profit; if(l_ord_takeprofit_40 != take_profit || l_price_48 != stop_loss) trade.PositionModify(ticket, l_price_48, l_ord_takeprofit_40); } // SELL trailing logic if(sym == _Symbol && type == POSITION_TYPE_SELL && ai_36 != 0 && magic_number == MagicNumber) { l_price_64 = ad_16 + gi_80 * _Point; if(gi_80 <= 0) l_price_64 = 0; if(ai_36 != ticket) l_ord_takeprofit_56 = ad_24; else l_ord_takeprofit_56 = take_profit; if(l_ord_takeprofit_56 != take_profit || l_price_64 != stop_loss) trade.PositionModify(ticket, l_price_64, l_ord_takeprofit_56); } } } } return 0.0; } void Ticket() { g_ticket_860 = 0; g_ticket_864 = 0; gi_unused_868 = 0; gi_unused_872 = 0; g_ticket_876 = 0; g_ticket_880 = 0; g_ord_takeprofit_884 = 0; g_ord_takeprofit_892 = 0; g_ord_lots_900 = 0; g_ord_lots_908 = 0; g_ord_lots_916 = 0; g_ord_open_price_924 = 0; g_ord_open_price_932 = 0; gd_940 = 0; gd_948 = 0; // === Open positions loop === for(int i = 0; i < PositionsTotal(); i++) { ulong ticket = PositionGetTicket(i); if(ticket != ULONG_MAX) { if(PositionSelectByTicket(ticket)) { string sym = PositionGetString(POSITION_SYMBOL); long magic_number = PositionGetInteger(POSITION_MAGIC); long type = PositionGetInteger(POSITION_TYPE); double lots = PositionGetDouble(POSITION_VOLUME); double open_price = PositionGetDouble(POSITION_PRICE_OPEN); double tp = PositionGetDouble(POSITION_TP); if(sym == _Symbol && magic_number == MagicNumber) { // BUY if(type == POSITION_TYPE_BUY && g_ticket_860 < ticket) { g_ord_lots_900 = lots; g_ord_open_price_924 = open_price; g_ticket_860 = ticket; g_ord_takeprofit_884 = tp; if(lots == Lot1) gd_940 = open_price - gi_80 * _Point; } // SELL if(type == POSITION_TYPE_SELL && g_ticket_864 < ticket) { g_ord_lots_908 = lots; g_ord_open_price_932 = open_price; g_ticket_864 = ticket; g_ord_takeprofit_892 = tp; if(lots == Lot1) gd_948 = open_price + gi_80 * _Point; } } } } } // === Pending orders loop === for(int i = 0; i < OrdersTotal(); i++) { ulong ticket = OrderGetTicket(i); if(OrderSelect(ticket)) { string sym = OrderGetString(ORDER_SYMBOL); long magic_number = OrderGetInteger(ORDER_MAGIC); long type = OrderGetInteger(ORDER_TYPE); double lots = OrderGetDouble(ORDER_VOLUME_CURRENT); if(sym == _Symbol && magic_number == MagicNumber) { if(type == ORDER_TYPE_BUY_LIMIT) { g_ticket_876 = ticket; g_ord_lots_916 = lots; } if(type == ORDER_TYPE_SELL_LIMIT) { g_ticket_880 = ticket; g_ord_lots_916 = lots; } } } } }
- 11-10-2025, 12:21 PM #11
جاري العمل على الحل
آخر تعديل بواسطة abo3nod ، 11-10-2025 الساعة 12:37 PM
الأكثر زيارة
رد مع اقتباس