extern double Lots = 0.01; extern int TakeProfit = 10; extern int TrailingStart = 10; extern int TrailingStep = 5; extern int TrailingStop = 15; 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; double price, SL,TP, lastlot,rsi1, rsi2; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { if(Digits == 3 || Digits == 5) { TakeProfit *= 10; TrailingStart *= 10; TrailingStop *= 10; TrailingStep *= 10; Step *= 10; Slippage *= 10; } return(0); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { 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); // нормализуем тейк профит if(OrderModify(ticket,OrderOpenPrice(),0,TP,0,Blue)==true)// Print(" OrderModify Ok!"); else Print(" OrderModify Error!"); } } else if(CountTredes()==0 && rsi10 && (CountTredes()0 ) ModifyOrders(OP_BUY); } } } int order_type=FindLastOrderType(); if(order_type==OP_SELL) { price=FindLastPrice(OP_SELL); lastlot= NormalizeDouble(FindLastLots(OP_SELL) * K_Martin,2); if(Bid>=price+Step*Point) { ticket=OrderSend(Symbol(),OP_SELL,lastlot,Bid,Slippage,0,0,NULL,Magic,0,Red); if(ticket>0) for(int i = OrdersTotal()-1; i>=0; i--) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) { ModifyOrders(OP_SELL); if(OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0, 0, Yellow)) Print(" OrderModify Ok!"); else Print(" OrderModify Error!"); } } } } } //+------------------------------------------------------------------+ // проверяем кол-во ордеров в рынке //+------------------------------------------------------------------+ 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++; return(count); } //+------------------------------------------------------------------+ // функция доливки открытого ордера //+------------------------------------------------------------------+ int FindLastOrderType() { datetime time=0; int type=-1; for(int i=OrdersTotal()-1; i>=0; i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) if(OrderOpenTime()>time) { time=OrderOpenTime(); type=OrderType(); } return(type); } //+------------------------------------------------------------------+ // находим последнюю цену ордеров //+------------------------------------------------------------------+ double FindLastPrice(int otype) { double oldopenprice=0; for(int i=OrdersTotal()-1; i>=0; i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==otype && OrderType()==OP_BUY) if(OrderOpenPrice()oldopenprice || oldopenprice==0) oldopenprice=OrderOpenPrice(); } return(oldopenprice); } //+------------------------------------------------------------------+ // находим обьем последнего ордера //+------------------------------------------------------------------+ double FindLastLots(int otype) { datetime time=0; double lots=0.0; for(int i=OrdersTotal()-1; i>=0; i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==otype) if(OrderOpenTime()>time) { time=OrderOpenTime(); lots=OrderLots(); } return(lots); } //+------------------------------------------------------------------+ // функция модификации тейк профитов //+------------------------------------------------------------------+ void ModifyOrders(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(!avgprice ) return; for(int i = OrdersTotal()-1; i>=0; i--) { if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue; if(!(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)) continue; if(OrderType() == OP_BUY) { if(OrderOpenPrice() < Bid - TrailingStop * Point || OrderStopLoss () == 0 ) { if(OrderStopLoss() < Bid - (TrailingStop + TrailingStep)* Point) { SL = Bid - TrailingStop * Point; if(OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0, 0, Yellow)) Print(" OrderModify Ok!"); else Print(" OrderModify Error!"); } } } } for(int i = OrdersTotal()-1; i>=0; i--) { if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue; if(!(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)) continue; if(OrderType() != otype) continue; if(OrderType() == OP_SELL) { if(OrderOpenPrice()> Ask + TrailingStop * Point || OrderStopLoss () == 0 ) { if(OrderStopLoss() > Ask + (TrailingStop - TrailingStep)* Point) { SL = Ask + TrailingStop * Point; { if(OrderModify(OrderTicket(), OrderOpenPrice(), SL, 0, 0, Yellow)) Print(" OrderModify Ok!"); else Print(" OrderModify Error!"); } } } } RefreshRates(); } }