#property copyright "Dron 15 (Андрей)" #property link "https://www.mql5.com" #property version "1.00" #property strict extern double Lots = 0.01; extern int TakeProfit = 50; extern int Step = 30; extern int RsiPeriod = 7; extern int Magic = 12345; extern int Slippage = 5; extern double K_Martin = 2; extern int MaxOrders = 20; extern string coment = "Ловец"; int ticket, otype; double price, TP, lastlot,rsi1, rsi2; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { if(Digits == 3 || Digits == 5) { TakeProfit *= 10; Step *= 10; Slippage *= 10; } return(0); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { if (CountTredes() == 0) { rsi1= iRSI(Symbol(),0,RsiPeriod,PRICE_CLOSE,1); //--- вычисляем период входа по первой свече rsi2= iRSI(Symbol(),0,RsiPeriod,PRICE_CLOSE,2); //--- вычисляем период входа по второй свече //--- проверяем есть ли открытые ордера цена в данный момент имеет значение 0 ,1 свеча выше цены значит покупки //--- 2 свеча ниже цены значит продажи if (CountTredes() == 0 && rsi1 > rsi2)//--- если нет открытых ордеров и rsi1 > rsi2 то мы входим в покупку { //- // Покупка ticket = OrderSend (Symbol(),OP_BUY, Lots, Ask, Slippage,0,0,"",Magic,0,Blue);// покупка if ( OrderSelect( ticket, SELECT_BY_TICKET ,MODE_TRADES)) // выбираем ордер из списка ордеров { TP = NormalizeDouble(Ask + TakeProfit * Point,Digits); // нормализуем тейк профит OrderModify(ticket,OrderOpenPrice(),0,TP,0,Blue);// } } else if (CountTredes() == 0 && rsi1 < rsi2 ) { // Продажа ticket = OrderSend (Symbol(),OP_SELL, Lots, Bid, Slippage,0,0,"",Magic,0,Red);// покупка if ( OrderSelect( ticket, SELECT_BY_TICKET ,MODE_TRADES)) // выбираем ордер из списка ордеров { TP = NormalizeDouble(Bid - TakeProfit * Point,Digits); // нормализуем тейк профит OrderModify(ticket,OrderOpenPrice(),0,TP,0,Red); } if(CountTredes() > 0 &&( CountTredes() < MaxOrders)) { int order_type = FindLastOrderType();// функция доливки открытого ордера // if (order_type == OP_BUY) { price = FindLastPraice(OP_BUY);//находим последнюю цену ордеров на покупку if(Ask <= price - Step * Point) { lastlot = FindLastLots(OP_BUY);//находим обьем последнего ордера if(lastlot <= 0)return; lastlot = NormalizeDouble(lastlot * K_Martin ,2); ticket = OrderSend(Symbol(),OP_BUY,lastlot,Ask,Slippage,0,0,NULL,Magic,0,Blue); if (ticket > 0) ModifiOrders(OP_BUY);//функция модификации тейк профитов } } int order_type = FindLastOrderType(); if (order_type == OP_SELL) { price = FindLastPrice(OP_SELL); if(Bid >= price + Step * Point) { lastlot = FindLastLots(OP_SELL); if (lastlot <= 0) return; lastlot = NormalizeDouble(lastlot * K_Martin, 2); ticket = OrderSend(Symbol(), OP_SELL, lastlot, Bid, Slippage, 0, 0, NULL, Magic,0, Red); } if(ticket > 0) ModifyOrders(OP_SELL); } } } } //+------------------------------------------------------------------+ // проверяем кол-во ордеров в рынке //+------------------------------------------------------------------+ int CountTredes ()// количества ордеров в рынке в данный момент { int count = 0; for(int i=OrdersTotal()-1; i>=0; i--) { if( OrderSelect(i, SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic ) count++; } } Comment(" ордеров открыто " + count ); return(count); } //+------------------------------------------------------------------+ // функция доливки открытого ордера //+------------------------------------------------------------------+ int FindLastOrderType() { for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) return(OrderType()); } } return(-1); } //+------------------------------------------------------------------+ // находим последнюю цену ордеров //+------------------------------------------------------------------+ double FindLastPraice(int otype) { double oldopenprice; int oldticket; ticket = 0; for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { oldticket = OrderTicket(); if(oldticket > ticket) { oldopenprice = OrderOpenPrice(); ticket = oldticket; } } } } return(oldopenprice); } //+------------------------------------------------------------------+ // находим обьем последнего ордера //+------------------------------------------------------------------+ double FindLastLots (int otype) { double oldlots; int oldticket; ticket = 0; for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { oldticket = OrderTicket(); if(oldticket > ticket) // если тикет последнего ордера больше тикета перврого ордера { oldlots = OrderLots(); // то получаем обьем этого ордера ticket = oldticket; } } } } return(oldlots); } //+------------------------------------------------------------------+ // функция модификации тейк профитов //+------------------------------------------------------------------+ void ModifiOrders(int otype) { double avgprice = 0, order_lots = 0; price = 0; for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) { price += OrderOpenPrice() * OrderLots(); order_lots += OrderLots(); } } } avgprice = NormalizeDouble(price/ order_lots, Digits); if(otype == OP_BUY) TP = NormalizeDouble(avgprice + TakeProfit,Digits ); if(otype == OP_SELL) TP = NormalizeDouble(avgprice - TakeProfit,Digits ); for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype) if(OrderModify(OrderTicket(), OrderOpenPrice(),0,TP,0,Yellow)) Print("OrderModify Error ", GetLastError()); else Print("OrderModify Ok "); } } } //+------------------------------------------------------------------+