//+------------------------------------------------------------------+ //| Copyright © 2014, Vladimir Hlystov | //| Закрывает все ордера при определенном профите | //+------------------------------------------------------------------+ #property copyright "Copyright © 2014, http://cmillion.narod.ru" #property link "cmillion@narod.ru" #property version "1.0" #property description "Советник выставляет на расстоянии от крайних ордеров стоп ордера указанного объема, после их срабатывания и достижения суммарного профита всех ордеров данной валютной паре, советник все закрывает позиции по этой паре" #property strict //------------------------------------------------------------------- extern double PercentProfitClose = 0.1; //закрывать все ордера при получении профита в проценте от депозита extern double Lot = 5; //лот страхующего стоп ордера extern int delta = 25; //расстояние до стоп ордера от крайней позиции //-------------------------------------------------------------------- int init() { if (IsTesting()) { int err=OrderSend(Symbol(),OP_SELL,Lot/2,NormalizeDouble(Bid,Digits),30,0,0,NULL,0,0,Red); } return(0); } //------------------------------------------------------------------- int deinit() { return(0); } //------------------------------------------------------------------- int start() { double Profit=0,LB=0,LS=0,OL=0,MaxPrice=0,MinPrice=0; int b=0,s=0,bs=0,ss=0,OT; for (int i=OrdersTotal()-1; i>=0; i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if (OrderSymbol() == Symbol()) { OT = OrderType(); OL = OrderLots(); double OOP = OrderOpenPrice(); if (MaxPriceOOP || MinPrice==0) MinPrice=OOP; if (OT==OP_BUY) { b++;LB+= OL; Profit+=OrderProfit(); } if (OT==OP_SELL) { s++;LS+= OL; Profit+=OrderProfit(); } if (OT==OP_BUYSTOP) bs++; if (OT==OP_SELLSTOP) ss++; } } } //--- if (Profit>=AccountBalance()/100*PercentProfitClose) { Alert("Достигнут уровень профита = "+DoubleToStr(Profit,2)); CloseAll(); } //--- int err; if (bs==0) { err=OrderSend(Symbol(),OP_BUYSTOP, Lot,NormalizeDouble(MaxPrice+delta*Point,Digits),30,0,0,NULL,0,0,Blue); } if (ss==0) { err=OrderSend(Symbol(),OP_SELLSTOP,Lot,NormalizeDouble(MinPrice-delta*Point,Digits),30,0,0,NULL,0,0,Red); } return(0); } //------------------------------------------------------------------ bool CloseAll() { bool error=true; int j,err,nn,OT; while(true) { for (j = OrdersTotal()-1; j >= 0; j--) { if (OrderSelect(j, SELECT_BY_POS)) { if (OrderSymbol() == Symbol()) { OT = OrderType(); if (OT>1) { error=OrderDelete(OrderTicket()); } if (OT==OP_BUY) { error=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,Blue); if (error) Alert(Symbol()," Закрыт ордер N ",OrderTicket()," прибыль ",OrderProfit(), " ",TimeToStr(TimeCurrent(),TIME_SECONDS)); } if (OT==OP_SELL) { error=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,Red); if (error) Alert(Symbol()," Закрыт ордер N ",OrderTicket()," прибыль ",OrderProfit(), " ",TimeToStr(TimeCurrent(),TIME_SECONDS)); } if (!error) { err = GetLastError(); if (err<2) continue; if (err==129) { Comment("Неправильная цена ",TimeToStr(TimeCurrent(),TIME_MINUTES)); Sleep(5000); RefreshRates(); continue; } if (err==146) { if (IsTradeContextBusy()) Sleep(2000); continue; } Comment("Ошибка ",err," закрытия ордера N ",OrderTicket()," ",TimeToStr(TimeCurrent(),TIME_MINUTES)); } } } } int k=0; for (j = 0; j < OrdersTotal(); j++) { if (OrderSelect(j, SELECT_BY_POS)) { if (OrderSymbol() == Symbol()) { OT = OrderType(); if (OT==OP_BUY || OT==OP_SELL) k++; } } } if (k==0) break; nn++; if (nn>10) {Alert(Symbol()," Не удалось закрыть все сделки, осталось еще ",k);return(0);} Sleep(1000); RefreshRates(); } return(1); } //--------------------------------------------------------------------