//+------------------------------------------------------------------+ //| NikitaScalper.mq4 | //| Copyright 2024, Your Name | //| https://www.yourwebsite.com | //+------------------------------------------------------------------+ #property strict extern double LotSize = 0.1; // Размер лота extern int TakeProfit = 200; // Тейк профит в пунктах extern int PendingDistance = 200; // Расстояние для отложенных ордеров в пунктах int buyLimitTicket = -1; int sellLimitTicket = -1; //+------------------------------------------------------------------+ //| Основная функция робота | //+------------------------------------------------------------------+ int start() { bool buyExists = false; bool sellExists = false; // Проходим по всем открытым ордерам for (int j = 0; j < OrdersTotal(); j++) { if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol()) { if (OrderType() == OP_BUY) buyExists = true; if (OrderType() == OP_SELL) sellExists = true; } } } // Открываем Buy позицию, если её нет if (!buyExists) { int buyOrder = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, 0, Ask + TakeProfit * Point, "Buy order", 0, 0, Green); if (buyOrder >= 0) { // Открываем Buy Limit double buyLimitPrice = Ask - PendingDistance * Point; buyLimitTicket = OrderSend(Symbol(), OP_BUYLIMIT, LotSize, buyLimitPrice, 3, 0, buyLimitPrice + TakeProfit * Point, "Buy Limit", 0, 0, Blue); if (buyLimitTicket < 0) Print("Ошибка открытия Buy Limit ордера: ", GetLastError()); } else Print("Ошибка открытия Buy ордера: ", GetLastError()); } // Открываем Sell позицию, если её нет if (!sellExists) { int sellOrder = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, 0, Bid - TakeProfit * Point, "Sell order", 0, 0, Red); if (sellOrder >= 0) { // Открываем Sell Limit double sellLimitPrice = Bid + PendingDistance * Point; sellLimitTicket = OrderSend(Symbol(), OP_SELLLIMIT, LotSize, sellLimitPrice, 3, 0, sellLimitPrice - TakeProfit * Point, "Sell Limit", 0, 0, Orange); if (sellLimitTicket < 0) Print("Ошибка открытия Sell Limit ордера: ", GetLastError()); } else Print("Ошибка открытия Sell ордера: ", GetLastError()); } // Проверка исполнения лимитных ордеров for (int k = OrdersTotal() - 1; k >= 0; k--) { if (OrderSelect(k, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol()) { // Если сработал Buy Limit и открыл позицию if (OrderType() == OP_BUY && buyLimitTicket >= 0 && OrderTicket() == buyLimitTicket) { buyLimitTicket = -1; // Сброс тикета лимитного ордера // Открываем новый Buy Limit ниже на 200 пипсов double newBuyLimitPrice = OrderOpenPrice() - PendingDistance * Point; buyLimitTicket = OrderSend(Symbol(), OP_BUYLIMIT, LotSize, newBuyLimitPrice, 3, 0, newBuyLimitPrice + TakeProfit * Point, "New Buy Limit", 0, 0, Blue); if (buyLimitTicket < 0) Print("Ошибка открытия нового Buy Limit ордера: ", GetLastError()); } // Если сработал Sell Limit и открыл позицию if (OrderType() == OP_SELL && sellLimitTicket >= 0 && OrderTicket() == sellLimitTicket) { sellLimitTicket = -1; // Сброс тикета лимитного ордера // Открываем новый Sell Limit выше на 200 пипсов double newSellLimitPrice = OrderOpenPrice() + PendingDistance * Point; sellLimitTicket = OrderSend(Symbol(), OP_SELLLIMIT, LotSize, newSellLimitPrice, 3, 0, newSellLimitPrice - TakeProfit * Point, "New Sell Limit", 0, 0, Orange); if (sellLimitTicket < 0) Print("Ошибка открытия нового Sell Limit ордера: ", GetLastError()); } // Если закрылась Buy позиция по тейк профиту if (OrderType() == OP_BUY && OrderClosePrice() >= OrderTakeProfit()) { // Удаляем связанный Buy Limit ордер if (buyLimitTicket >= 0 && OrderSelect(buyLimitTicket, SELECT_BY_TICKET)) { if (!OrderDelete(buyLimitTicket)) Print("Ошибка удаления Buy Limit ордера: ", GetLastError()); buyLimitTicket = -1; // Сброс тикета } // Открываем новую Buy позицию и новый Buy Limit int reopenBuy = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, 0, Ask + TakeProfit * Point, "Reopen Buy", 0, 0, Green); if (reopenBuy >= 0) { double reopenBuyLimitPrice = Ask - PendingDistance * Point; buyLimitTicket = OrderSend(Symbol(), OP_BUYLIMIT, LotSize, reopenBuyLimitPrice, 3, 0, reopenBuyLimitPrice + TakeProfit * Point, "Reopen Buy Limit", 0, 0, Blue); if (buyLimitTicket < 0) Print("Ошибка повторного открытия Buy Limit ордера: ", GetLastError()); } else Print("Ошибка повторного открытия Buy ордера: ", GetLastError()); } // Если закрылась Sell позиция по тейк профиту if (OrderType() == OP_SELL && OrderClosePrice() <= OrderTakeProfit()) { // Удаляем связанный Sell Limit ордер if (sellLimitTicket >= 0 && OrderSelect(sellLimitTicket, SELECT_BY_TICKET)) { if (!OrderDelete(sellLimitTicket)) Print("Ошибка удаления Sell Limit ордера: ", GetLastError()); sellLimitTicket = -1; } // Открываем новую Sell позицию и новый Sell Limit int reopenSell = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, 0, Bid - TakeProfit * Point, "Reopen Sell", 0, 0, Red); if (reopenSell >= 0) { double reopenSellLimitPrice = Bid + PendingDistance * Point; sellLimitTicket = OrderSend(Symbol(), OP_SELLLIMIT, LotSize, reopenSellLimitPrice, 3, 0, reopenSellLimitPrice - TakeProfit * Point, "Reopen Sell Limit", 0, 0, Orange); if (sellLimitTicket < 0) Print("Ошибка повторного открытия Sell Limit ордера: ", GetLastError()); } else Print("Ошибка повторного открытия Sell ордера: ", GetLastError()); } } } } return 0; } //+------------------------------------------------------------------+