//+------------------------------------------------------------------+
#property copyright "Vladimir Khlistov"
#property link "http://cmillion.narod.ru"
#property show_inputs
#include <WinUser32.mqh>
//+------------------------------------------------------------------+
extern int Magic = 0; //закрывать только сделки с магиком 0-открытые вручную
extern bool MagicAll = true;//если true - закрывать все
extern int Profit = 0; //закрывать только сделки с профитом больше Profit
extern int TipOrder = 0; //(0) - все ордера (1) - Buy (-1) - Sell
extern bool SymbolAll = false;//если true - все валютные пары false - только текущие
extern bool DeleteOrders= true;//если true - удалять и отложенные false - только рыночные
extern int attempts = 10; //кол-во попыток закрытия
int slippage = 5;
int nn;
//+------------------------------------------------------------------+
int start()
{
Comment("Запуск скрипта CloseAllOrders ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
if (Digits==5 || Digits==3) slippage=30;
bool error=true;
int Ошибка,DIGITS,OT,Ticket;
string txt;
double ASK,BID,POINT;
if (!MagicAll) txt=StringConcatenate(txt,"Cкрипт закрытия ордеров с Magic=",Magic);
else txt=StringConcatenate(txt,"Cкрипт закрытия всех ордеров");
Comment("");
int ret=MessageBox("Закрыть все ордера (Да) Закрыть только профитные (Нет)",
txt, MB_YESNOCANCEL|MB_TOPMOST);
if (ret==IDCANCEL) return;
while(true)
{
for (int j = OrdersTotal()-1; j >= 0; j--)
{
if (OrderSelect(j, SELECT_BY_POS))
{
if ((OrderSymbol() == Symbol()||SymbolAll) && (OrderMagicNumber() == Magic || MagicAll))
{
DIGITS = MarketInfo(OrderSymbol(),MODE_DIGITS);
ASK = NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),DIGITS);
BID = NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),DIGITS);
POINT = MarketInfo(OrderSymbol(),MODE_POINT);
OT = OrderType();
Ticket=OrderTicket();
if (OT==OP_BUY && (TipOrder == 1||TipOrder ==0))
{
if (ret==IDNO && Profit > (BID-OrderOpenPrice())/POINT) continue;
error=OrderClose(Ticket,OrderLots(),BID,slippage,Red);
if (error) Alert("Закрыт ордер N ",Ticket," прибыль ",OrderProfit(),
" ",TimeToStr(TimeCurrent(),TIME_SECONDS));
}
if (OT==OP_SELL && (TipOrder ==-1||TipOrder ==0))
{
if (ret==IDNO && Profit > (OrderOpenPrice()-ASK)/POINT) continue;
error=OrderClose(Ticket,OrderLots(),ASK,slippage,Red);
if (error) Alert("Закрыт ордер N ",Ticket," прибыль ",OrderProfit(),
" ",TimeToStr(TimeCurrent(),TIME_SECONDS));
}
if (OT>1 && DeleteOrders)
if (OrderDelete(Ticket))
Comment("Ордер ",Ticket," успешно удален ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
else
Comment("Ордер ",Ticket," ошибка удаления ",GetLastError());
if (!error)
{
Ошибка = GetLastError();
if (Ошибка<2) continue;
if (Ошибка==129)
{ Comment("Неправильная цена ",TimeToStr(TimeCurrent(),TIME_SECONDS));
Sleep(5000);
RefreshRates();
continue;
}
if (Ошибка==146)
{
int ret1=MessageBox("Подсистема торговли занята"," ",
MB_RETRYCANCEL|MB_TOPMOST|MB_ICONWARNING);
if (ret1==IDCANCEL) return;
j++;
if (IsTradeContextBusy()) Sleep(2000);
continue;
}
Comment("Ошибка ",Ошибка," закрытия ордера N ",Ticket," ",TimeToStr(TimeCurrent(),TIME_SECONDS));
}
}
}
}
int n=0;
for (j = 0; j < OrdersTotal(); j++)
{
if (OrderSelect(j, SELECT_BY_POS))
{
if ((OrderSymbol() == Symbol()||SymbolAll) && (OrderMagicNumber() == Magic || MagicAll))
{
DIGITS = MarketInfo(OrderSymbol(),MODE_DIGITS);
ASK = NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),DIGITS);
BID = NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),DIGITS);
POINT = MarketInfo(OrderSymbol(),MODE_POINT);
if (OrderType()==OP_BUY && (TipOrder == 1||TipOrder ==0))
{
if (ret==IDNO && Profit > (BID-OrderOpenPrice())/POINT) continue;
n++;
}
if (OrderType()==OP_SELL && (TipOrder ==-1||TipOrder ==0))
{
if (ret==IDNO && Profit > (OrderOpenPrice()-ASK)/POINT) continue;
n++;
}
if (OT>1 && DeleteOrders) n++;
}
}
}
if (n==0) break;
nn++;
if (nn>attempts) {Comment("Не удалось закрыть все сделки, осталось еще ",n);break;}
Sleep(1000);
RefreshRates();
}
return(0);
}
//+------------------------------------------------------------------+
GAWroch