//+------------------------------------------------------------------+ //| VR---Limit losses.mq4 | //| "Copyright 2014, www.trading-go.ru Project." | //| "http://www.trading-go.ru" | //+------------------------------------------------------------------+ #property copyright "Copyright 2014, www.trading-go.ru Project." #property link "http://www.trading-go.ru" #property version "1.00" #property strict //Дневной лимит в валюте депозита input double DayLimit=100; // Меджик номер ордеров при -1 советник контролирует все ордера и ручные и советников, при 0 только ручные. input int Magic=-1; // Поскальзывание при закрытии ордеров input int Slippage=20; bool trade_flag=false; // Флаг разрешения торговли string text=""; // текстовая переменная //+------------------------------------------------------------------+ void OnTick() { double DayProfit=0; // переменная для подсчета общего профита int counter=0; // счетчик ордеров datetime op=0,time=TimeCurrent(); // дополнительные переменные и переменная с временем сервера RefreshRates(); // Обновим данные (для времени сервера) for(int i=OrdersHistoryTotal()-1; i>=0; i--) // Обратимся к ситории ордеров if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) // выбрали ордер рассмотрим его if(OrderMagicNumber()==Magic || Magic==-1) // если это наш меджик { op=OrderOpenTime(); // запомним время его открытия if(TimeDayOfYear(op)==TimeDayOfYear(time) && TimeYear(op)==TimeYear(time)) // проверим дату открытия ордера если это сегодня а так же проверим год DayProfit+=OrderProfit()+OrderCommission()+OrderSwap(); // суммируем прибыль } for(int i=OrdersTotal()-1; i>=0; i--) // обратимся к текущему списку открытых ордеров if(OrderSelect(i,SELECT_BY_POS)) // выбрали ордер рассмотрим его if(OrderMagicNumber()==Magic || Magic==-1) // если это наш меджик { counter++; // посчитаем ордера DayProfit+=OrderProfit()+OrderCommission()+OrderSwap(); // суммируем прибыль } if((DayProfit+DayLimit)<=0){ trade_flag=true; text=" STOP";} else text=" allowed"; // если сумма лимита надень и прибыли за день меньше или равна 0 значит наш лимит израсходован // переведем флаг в запретное состояние и запишем текст в переменную if(trade_flag==true&&counter>0)close_all(); // если флаг в запретном состоянии и ордера есть закрыть все ордера if(DayProfit==0){trade_flag=false; text=" allowed";} // если начался новый день значит профит будет равен 0 перевести флаг в рабочее состояние // и запишем текст в переменную Comment( "\n","DayLimit ",DoubleToStr(DayLimit,2), // Выводит на экран установленный лимит "\n","DayProfit ",DoubleToStr(DayProfit,2), // Выводит на экран текущий профит за день "\n","Dostupno",DoubleToStr(DayProfit+DayLimit,2), // Выводит на экран остаток от лимита "\n","Trade ",text // Выводит на экран сообщение о разрешении торговать или нет ); } //+------------------------------------------------------------------+ // Функция закрытия всех ордеров void close_all() { double price=0; // Создадим переменную для цены for(int i=OrdersTotal()-1; i>=0; i--) // обратимся к списку открытых ордеров if(OrderSelect(i,SELECT_BY_POS)) // разбираем каждый ордер if(OrderMagicNumber()==Magic || Magic==-1) // если условия меджика наши { if(OrderType()==0)price=MarketInfo(OrderSymbol(),MODE_BID); // если попался бай ордер запомним цену для закрытия if(OrderType()==1)price=MarketInfo(OrderSymbol(),MODE_ASK); // если попался сел ордер запомним цену для закрытия if(!IsTradeContextBusy()) // проверим поток if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(price,(int)MarketInfo(OrderSymbol(),MODE_DIGITS)),Slippage,clrGreen)==false) // закроем ордер если не удалось Print(StringConcatenate(__FUNCTION__," OrderClose ",GetLastError())); // выведем сообщение } } //+------------------------------------------------------------------+