extern double Lots =0.1; extern int Profit=300; extern int Stopl=50; extern int Magic=987789; extern int Slippage=3; extern double mult=1.5; double prhigh, prlow,sl,tp,llot,SLprice; int ticket; //-------------------------------------------------------------------+ extern string TMA = " Параметры работы индикатора "; extern string TimeFrame = "current time frame"; extern int HalfLength = 56; extern int Price = PRICE_CLOSE; extern double ATRMultiplier = 3.0; extern int ATRPeriod = 100; extern bool Interpolate = true; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { if (Digits==3||Digits==5) { Profit *=10; Stopl *=10; Slippage *=10; } return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { prhigh=iCustom(NULL,0,"TMA_Fair",TimeFrame,HalfLength,Price,ATRMultiplier,ATRPeriod,Interpolate,1,0); prlow=iCustom(NULL,0,"TMA_Fair",TimeFrame,HalfLength,Price,ATRMultiplier,ATRPeriod,Interpolate,2,0); if(CountSell()==0&&Bid>=prhigh) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red); if (ticket>0) { sl=NormalizeDouble(Bid+Stopl*Point,Digits); tp=NormalizeDouble(Bid-Profit*Point,Digits); if(OrderSelect(ticket,SELECT_BY_TICKET)) if(!OrderModify(ticket,OrderOpenPrice(),sl,tp,0)) Print("Ошибка модификации ордера на продажу"); } else Print("Ошибка открытия ордера на продажу"); } if(CountBuy()==0&&Ask<=prlow) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue); if (ticket>0) { tp=NormalizeDouble(Ask+Profit*Point,Digits); sl=NormalizeDouble(Ask-Stopl*Point,Digits); if(OrderSelect(ticket,SELECT_BY_TICKET)) if(!OrderModify(ticket,OrderOpenPrice(),sl,tp,0)) Print("Ошибка модификации ордера на покупку"); } else Print("Ошибка открытия ордера на покупку"); } else llot=fllots(); llot=NormalizeDouble(mult*llot,2); int i=OrdersHistoryTotal()-1; if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true) if(CountBuy()==0||CountSell()==0&&Bid>=prhigh) { if ((OrderType() == OP_BUY && OrderStopLoss() - OrderClosePrice() >= -_Point / 10) || (OrderType() == OP_SELL && OrderClosePrice() - OrderStopLoss() >= -_Point / 10)) { ticket=OrderSend(Symbol(),OP_SELL,llot,Bid,Slippage,0,0,"",Magic,0,Red); if (ticket>0) { sl=NormalizeDouble(Bid+Stopl*Point,Digits); tp=NormalizeDouble(Bid-Profit*Point,Digits); if(OrderSelect(ticket,SELECT_BY_TICKET)) if(!OrderModify(ticket,OrderOpenPrice(),sl,tp,0)) Print("Ошибка модификации ордера на продажу"); } else Print("Ошибка открытия ордера на продажу"); } } if(CountBuy()==0||CountSell()==0&&Ask<=prlow) { if ((OrderType() == OP_BUY && OrderStopLoss() - OrderClosePrice() >= -_Point / 10) || (OrderType() == OP_SELL && OrderClosePrice() - OrderStopLoss() >= -_Point / 10)) { ticket=OrderSend(Symbol(),OP_BUY,llot,Ask,Slippage,0,0,"",Magic,0,Blue); if (ticket>0) { tp=NormalizeDouble(Ask+Profit*Point,Digits); sl=NormalizeDouble(Ask-Stopl*Point,Digits); if(OrderSelect(ticket,SELECT_BY_TICKET)) if(!OrderModify(ticket,OrderOpenPrice(),sl,tp,0)) Print("Ошибка модификации ордера на покупку"); } else Print("Ошибка открытия ордера на покупку"); } } } //+------------------------------------------------------------------+ int CountBuy() { int count = 0; for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY) count++; } } return(count); } //+------------------------------------------------------------------+ int CountSell() { int count = 0; for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL) count++; } } return(count); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ double fllots() { int o_type; double oldlots; int oldticket; ticket=0; for(int i= OrdersHistoryTotal()-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) // && OrderType()==o_type) { oldticket=OrderTicket(); if(oldticket>ticket) { oldlots=OrderLots(); ticket=oldticket; } } } } return(oldlots); } //+------------------------------------------------------------------+