extern double Lot = 0.1; extern int SL = 40; extern int Step = 10; extern int Slippage = 3; extern int Magic = 143; //--- indicator parameters extern int MaPeriod=13; extern int MaShift=1; int ticket; int otype; double sl, price, MA; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { if (Digits == 3 || Digits == 5) { Step *= 10; Slippage *= 10; } return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { MA = iMA(Symbol(), 0, MaPeriod, MaShift, MODE_SMA, PRICE_CLOSE, 1); if (CountTrades() == 0 && Open[0]>Close[2]&&Open[0]>MA) { //покупка ticket=OrderSend(Symbol(), OP_BUY, Lot, Ask, Slippage, 0, 0, "T", Magic, 0, Blue); if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) { //считаем стоплосс sl = NormalizeDouble(Bid - SL*Point, Digits); OrderModify(ticket, OrderOpenPrice(), sl, 0, 0); } } else if (CountTrades() == 0 && Open[0] 0) //определяем тип последнего ордера { otype = FindLastOrderType(); if (otype == OP_BUY) { // находим цену последнего ордера price = FindLastBuyPrice(); //к цене последнего ордера прибавляю текущую цену,перевожу в пункты и сравниваю с шагом, если >= то открываем ордер if ((price + Ask)/Point >= Step) { OrderSend(Symbol(), OP_BUY, Lot, Ask, Slippage, sl, 0, "T", Magic, 0, Blue); } } else if (otype == OP_SELL) { price = FindLastSellPrice(); if ((Bid+price)/Point >= Step) { OrderSend(Symbol(), OP_SELL, Lot, Bid, Slippage, sl, 0, "T", Magic, 0, Red); } } } //+------------------------------------------------------------------+ double FindLastBuyPrice() { int oticket, ticketnumber = 0; double oprice; for (int i = OrdersTotal() - 1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY) { oticket = OrderTicket(); if (oticket > ticketnumber) { ticketnumber = oticket; oprice = OrderOpenPrice(); } } } } return(oprice); } //+------------------------------------------------------------------+ double FindLastSellPrice() { int oticket, ticketnumber = 0; double oprice; for (int i = OrdersTotal() - 1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL) { oticket = OrderTicket(); if (oticket > ticketnumber) { ticketnumber = oticket; oprice = OrderOpenPrice(); } } } } return(oprice); } //+------------------------------------------------------------------+ int FindLastOrderType() { int oticket, ticketnumber = 0, OType; for (int i = OrdersTotal() - 1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { oticket = OrderTicket(); if (oticket > ticketnumber) { ticketnumber = oticket; OType = OrderType(); } } } } return(OType); } //+------------------------------------------------------------------+ int CountTrades() { int count = 0; for (int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==Symbol()&&OrderMagicNumber()==Magic) //проверяем есть ли открытые ордера { if (OrderType() == OP_BUY || OrderType() == OP_SELL) count++; } } } return(count); } //+------------------------------------------------------------------+