//+------------------------------------------------------------------+ //| //| | //+------------------------------------------------------------------+ #property strict input double StartLotSize = 0.1; // Размер лота для открытия первого ордера input int MaxOrders = 10; // Максимальное количество открытия усредняющих ордеров input int DistancePips = 50; // Расстояние в pips-ах до открытия следующего, усредняющего ордера input int TakeProfitPips = 500; // Размер достижения тейк-профита в pips-ах input double MaxDrawdown = 80; // Закрыть все сделки при достижении просадки 80% input bool InitialTradeBuy = true; // Начальное направление торговли: Только в buy input bool InitialTradeSell = false; // Начальное направление торговли: Только в sell // Параметры панели input int panelX = 10; input int panelY = 10; input color panelBackgroundColor = clrBlack; // Почти черный цвет панели input color panelTextColor = clrBlack; // Черный цвет текста input color buttonTextColor = clrBlack; bool tradingEnabled = false; bool TradeBuy; bool TradeSell; int OnInit() { // Установить начальные значения направлений торговли TradeBuy = InitialTradeBuy; TradeSell = InitialTradeSell; // Создание панели CreatePanel(); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { // Удаление панели DeletePanel(); } void OnTick() { if (!tradingEnabled) return; // Проверка текущей просадки double equity = AccountEquity(); double balance = AccountBalance(); double drawdown = (balance - equity) / balance * 100; if (drawdown >= MaxDrawdown) { CloseAllOrders(); return; } // Логика торговли if (OrdersTotal() == 0) { if (TradeBuy) { OpenOrder(OP_BUY, StartLotSize); } if (TradeSell) { OpenOrder(OP_SELL, StartLotSize); } } else { ManageOrders(); } } void OpenOrder(int type, double lotSize) { double price = (type == OP_BUY) ? Ask : Bid; int ticket = OrderSend(Symbol(), type, lotSize, price, 3, 0, 0, "Martingale", 0, 0, clrGreen); if (ticket < 0) { Print("Error opening order: ", GetLastError()); } } void ManageOrders() { for (int j = OrdersTotal() - 1; j >= 0; j--) { if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) { double distance = DistancePips * Point; if (OrderType() == OP_BUY && Bid - OrderOpenPrice() >= distance) { OpenOrder(OP_BUY, OrderLots() * 2); } if (OrderType() == OP_SELL && OrderOpenPrice() - Ask >= distance) { OpenOrder(OP_SELL, OrderLots() * 2); } } } // Проверка достижения тейк-профита double totalProfit = 0; for (int k = OrdersTotal() - 1; k >= 0; k--) { if (OrderSelect(k, SELECT_BY_POS, MODE_TRADES)) { totalProfit += OrderProfit(); } } if (totalProfit >= TakeProfitPips * Point) { CloseAllOrders(); } } void CloseAllOrders() { for (int j = OrdersTotal() - 1; j >= 0; j--) { if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) { if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 3, clrRed)) { Print("Error closing order: ", GetLastError()); } } } } // Создание панели void CreatePanel() { // Создание панели ObjectCreate(0, "Panel", OBJ_RECTANGLE_LABEL, 0, 0, 0); ObjectSetInteger(0, "Panel", OBJPROP_XDISTANCE, panelX); ObjectSetInteger(0, "Panel", OBJPROP_YDISTANCE, panelY); ObjectSetInteger(0, "Panel", OBJPROP_CORNER, CORNER_LEFT_UPPER); ObjectSetInteger(0, "Panel", OBJPROP_COLOR, panelBackgroundColor); ObjectSetInteger(0, "Panel", OBJPROP_XSIZE, 220); // Расширение ширины панели ObjectSetInteger(0, "Panel", OBJPROP_YSIZE, 400); // Увеличение высоты панели // Добавление текста на панель string labels[] = {"Начальный лот", "Макс. ордеров", "Расстояние (пипсы)", "Тейк-профит (пипсы)", "Макс. просадка (%)"}; int y = panelY + 20; for (int i = 0; i < ArraySize(labels); i++) { string labelName = "Label" + IntegerToString(i); ObjectCreate(0, labelName, OBJ_LABEL, 0, 0, 0); ObjectSetInteger(0, labelName, OBJPROP_XDISTANCE, panelX + 10); ObjectSetInteger(0, labelName, OBJPROP_YDISTANCE, y); ObjectSetInteger(0, labelName, OBJPROP_COLOR, clrBlack); // Черный цвет текста ObjectSetString(0, labelName, OBJPROP_TEXT, labels[i]); y += 20; } // Добавление полей ввода y = panelY + 20; // сброс y для полей ввода string inputs[] = {"StartLotSize", "MaxOrders", "DistancePips", "TakeProfitPips", "MaxDrawdown"}; for (int j = 0; j < ArraySize(inputs); j++) { string inputName = "Input" + IntegerToString(j); ObjectCreate(0, inputName, OBJ_EDIT, 0, 0, 0); ObjectSetInteger(0, inputName, OBJPROP_XDISTANCE, panelX + 120); // Сдвиг полей ввода левее ObjectSetInteger(0, inputName, OBJPROP_YDISTANCE, y); ObjectSetInteger(0, inputName, OBJPROP_COLOR, clrBlack); // Черный цвет текста ObjectSetString(0, inputName, OBJPROP_TEXT, DoubleToString(j == 0 ? StartLotSize : (j == 1 ? MaxOrders : (j == 2 ? DistancePips : (j == 3 ? TakeProfitPips : MaxDrawdown))), 2)); y += 20; } // Добавление кнопок управления y += 20; // Отступ перед кнопками string buttons[] = {"Начать торговлю", "Остановить торговлю", "Закрыть все позиции", "Торговать BUY", "Торговать SELL"}; for (int k = 0; k < ArraySize(buttons); k++) { string buttonName = "Button" + IntegerToString(k); ObjectCreate(0, buttonName, OBJ_BUTTON, 0, 0, 0); ObjectSetInteger(0, buttonName, OBJPROP_XDISTANCE, panelX + 10); ObjectSetInteger(0, buttonName, OBJPROP_YDISTANCE, y); ObjectSetInteger(0, buttonName, OBJPROP_COLOR, clrBlack); // Черный цвет текста кнопок ObjectSetInteger(0, buttonName, OBJPROP_XSIZE, 200); // Увеличение ширины кнопок ObjectSetString(0, buttonName, OBJPROP_TEXT, buttons[k]); y += 30; } } // Удаление панели void DeletePanel() { ObjectDelete(0, "Panel"); for (int i = 0; i < 5; i++) { ObjectDelete(0, "Label" + IntegerToString(i)); ObjectDelete(0, "Input" + IntegerToString(i)); } for (int j = 0; j < 5; j++) { ObjectDelete(0, "Button" + IntegerToString(j)); } } // Обработчик событий кнопок void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { if (id == CHARTEVENT_OBJECT_CLICK) { if (sparam == "Button0") // Начать торговлю { tradingEnabled = true; } else if (sparam == "Button1") // Остановить торговлю { tradingEnabled = false; } else if (sparam == "Button2") // Закрыть все позиции { CloseAllOrders(); } else if (sparam == "Button3") // Торговать BUY { TradeBuy = true; TradeSell = false; } else if (sparam == "Button4") // Торговать SELL { TradeBuy = false; TradeSell = true; } } }