Time: 2016-04-24 | Download file:yuraz_closeprc_v3.mq5
//+------------------------------------------------------------------+ //| YURAZ_CLOSEPRC_V1.mq5 | //| Copyright 2009, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ // // Выставляем % профита // закрываются ВСЕ открытые позиции при достижении определенного нами % от депозита // интересно то что если поставить 1% в день , 24 торговых дня дают 24% в месяц // // 1 на графике создаем кнопку закрыть все сделки - ручной режим // 2 на графике создаем поле ввода , в которое вносим % // // // Идея данного советника в том что он работает в режиме событий // #property copyright "2009, YURAZ" #property link "http://www.masterforex-v.org" #property version "1.00" input string gpsPrcClose="10"; // 10% профита по умолчанию //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // MT5 // class CYurazTrade { public: int AllCloseMonitor; double PrcClose; void CYurazTrade() { AllCloseMonitor=0; // тут для монитора событий информация LastCloseCode=0; LastCodePS=0; PrcClose=100000000000; } // конструктор void CloseAll(); private: int LastCloseCode; int LastCodePS; string sCodeError(int code); void ClosePosition(string sSymbol,int ip); }; // // по коду вернем строку ошибки // string CYurazTrade::sCodeError(int retcode) { string sRetCode; switch(retcode) { case TRADE_RETCODE_REQUOTE: sRetCode=(string)retcode+" Реквота"; break;// 10004 case TRADE_RETCODE_REJECT: sRetCode=(string)retcode+" Запрос отвергнут"; break; case TRADE_RETCODE_CANCEL: sRetCode = (string)retcode+" Запрос отменен трейдером"; break; case TRADE_RETCODE_PLACED: sRetCode = (string)retcode+" Ордер размещен"; break; case TRADE_RETCODE_DONE: sRetCode=(string)retcode+" Заявка выполнена"; break; case TRADE_RETCODE_DONE_PARTIAL: sRetCode=(string)retcode+" Заявка выполнена частично"; break; case TRADE_RETCODE_ERROR: sRetCode=(string)retcode+" Ошибка обработки запроса"; break; case TRADE_RETCODE_TIMEOUT: sRetCode = (string)retcode+" Запрос отменен по истечению времени"; break; case TRADE_RETCODE_INVALID: sRetCode = (string)retcode+" Неправильный запрос"; break; case TRADE_RETCODE_INVALID_VOLUME: sRetCode=(string)retcode+" Неправильный объем в запросе"; break; case TRADE_RETCODE_INVALID_PRICE: sRetCode = (string)retcode+" Неправильная цена в запросе"; break; case TRADE_RETCODE_INVALID_STOPS: sRetCode = (string)retcode+" Неправильные стопы в запросе"; break; case TRADE_RETCODE_TRADE_DISABLED: sRetCode=(string)retcode+" Торговля запрещена"; break; case TRADE_RETCODE_MARKET_CLOSED: sRetCode =(string)retcode+" Рынок закрыт"; break; case TRADE_RETCODE_NO_MONEY: sRetCode=(string)retcode+" Нет достаточных денежных средств для выполнения запроса"; break; case TRADE_RETCODE_PRICE_CHANGED: sRetCode=(string)retcode+" Цены изменились"; break; case TRADE_RETCODE_PRICE_OFF: sRetCode=(string)retcode+" Отсутствуют котировки для обработки запроса"; break; case TRADE_RETCODE_INVALID_EXPIRATION: sRetCode=(string)retcode+" Неверная дата истечения ордера в запросе"; break; case TRADE_RETCODE_ORDER_CHANGED: sRetCode=(string)retcode+" Состояние ордера изменилось"; break; case TRADE_RETCODE_TOO_MANY_REQUESTS: sRetCode=(string)retcode+" Слишком частые запросы"; break; default: sRetCode=(string)retcode+" неизвестная ошибка"; break; } return(sRetCode); } // // закрыть все что открыто // void CYurazTrade::CloseAll() { int pos=PositionsTotal(); // получим количество открытых позиций for(int ip=0;ip9) // пока не смог решить проблему с request request.volume=9; if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) { request.type=ORDER_TYPE_SELL; request.price=SymbolInfoDouble(sSymbol,SYMBOL_BID); } if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL) { request.type=ORDER_TYPE_BUY; request.price=SymbolInfoDouble(sSymbol,SYMBOL_ASK); } OrderSend(request,result); LastCloseCode=result.retcode; } // /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Монитор событий ( вызвается из таймера ) // class CYurazMonitor { public: void Monitor(); }; // // // void CYurazMonitor::Monitor(void) { yzTrade.PrcClose = StringToDouble(ObjectGetString(0,editID,OBJPROP_TEXT)); ObjectSetString(0,labelID1,OBJPROP_TEXT, DoubleToString( AccountInfoDouble(ACCOUNT_PROFIT),2) + " " +DoubleToString( AccountInfoDouble(ACCOUNT_BALANCE)/100,2) + " " +DoubleToString( yzTrade.PrcClose,4) ); if(yzTrade.AllCloseMonitor!=0) // монитор событий обнаружил, необходимо закрыть все позиции { yzTrade.CloseAll(); } if(AccountInfoDouble(ACCOUNT_PROFIT)>AccountInfoDouble(ACCOUNT_BALANCE)/100 *yzTrade.PrcClose) { yzTrade.AllCloseMonitor=2; // событие закрыть по профиту yzTrade.CloseAll(); } } // /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // // CYurazTrade yzTrade; // клас обработки торговых операций CYurazMonitor yzMonitor; // монитор событий // // string buttonID="Button"; //string labelID="Info"; string editID="Edit"; string labelID1="Info1"; int broadcastEventID=5000; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnInit() { yzTrade.AllCloseMonitor=0; //--- создадим кнопку, для передачи пользовательских событий ObjectCreate(0,buttonID,OBJ_BUTTON,0,100,100); ObjectSetInteger(0,buttonID,OBJPROP_COLOR,White); ObjectSetInteger(0,buttonID,OBJPROP_BGCOLOR,Gray); ObjectSetInteger(0,buttonID,OBJPROP_XDISTANCE,10); ObjectSetInteger(0,buttonID,OBJPROP_YDISTANCE,60); ObjectSetInteger(0,buttonID,OBJPROP_XSIZE,250); ObjectSetInteger(0,buttonID,OBJPROP_YSIZE,50); ObjectSetString(0,buttonID,OBJPROP_FONT,"Arial"); ObjectSetString(0,buttonID,OBJPROP_TEXT,"Закрыть все позиции одним кликом"); ObjectSetInteger(0,buttonID,OBJPROP_FONTSIZE,10); ObjectSetInteger(0,buttonID,OBJPROP_SELECTABLE,false); // иначе нажать на нее нельзя //--- создадим метку для вывода информации //ObjectCreate(0,labelID,OBJ_LABEL,0,100,100); //ObjectSetInteger(0,labelID,OBJPROP_COLOR,Red); //ObjectSetInteger(0,labelID,OBJPROP_XDISTANCE,10); //ObjectSetInteger(0,labelID,OBJPROP_YDISTANCE,100); //ObjectSetString(0,labelID,OBJPROP_FONT,"Trebuchet MS"); //ObjectSetString(0,labelID,OBJPROP_TEXT,"Нет информации"); //ObjectSetInteger(0,labelID,OBJPROP_FONTSIZE,20); //ObjectSetInteger(0,labelID,OBJPROP_SELECTABLE,0); ObjectCreate(0,labelID1,OBJ_LABEL,0,100,100); ObjectSetInteger(0,labelID1,OBJPROP_COLOR,Red); ObjectSetInteger(0,labelID1,OBJPROP_XDISTANCE,10); ObjectSetInteger(0,labelID1,OBJPROP_YDISTANCE,20); ObjectSetString(0,labelID1,OBJPROP_FONT,"Trebuchet MS"); ObjectSetString(0,labelID1,OBJPROP_TEXT,"Позиции закроются при достижении процента от депозита"); ObjectSetInteger(0,labelID1,OBJPROP_FONTSIZE,10); ObjectSetInteger(0,labelID1,OBJPROP_SELECTABLE,true); ObjectCreate(0,editID,OBJ_EDIT,0,100,100); ObjectSetInteger(0,editID,OBJPROP_XDISTANCE,370); ObjectSetInteger(0,editID,OBJPROP_YDISTANCE,20); ObjectSetInteger(0,editID,OBJPROP_COLOR,Red); ObjectSetInteger(0,editID,OBJPROP_XSIZE,50); ObjectSetInteger(0,editID,OBJPROP_YSIZE,50); ObjectSetString(0,editID,OBJPROP_TEXT,gpsPrcClose); // 3% ObjectSetInteger(0,editID,OBJPROP_FONTSIZE,20); ObjectSetInteger(0,editID,OBJPROP_SELECTABLE,false); // иначе нажать на нее нельзя yzTrade.PrcClose=StringToDouble(gpsPrcClose); // положим в торговый класс % прибыли при котором закроются все позиции // int customEventID; // номер пользовательского события для отправки // string message; // сообщение для отправки в событии // bool selected=ObjectGetInteger(0,buttonID,OBJPROP_STATE); // if(selected==true) // { // message="Кнопка нажата"; // customEventID=CHARTEVENT_CUSTOM+1; // } // else // кнопка не нажата // { // message="Кнопка отжата"; // customEventID=CHARTEVENT_CUSTOM+999; // } // // EventChartCustom(0,CHARTEVENT_CUSTOM+999-CHARTEVENT_CUSTOM,0,0,message); EventSetTimer(1); // каждую секунду вызываем OnTimer return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnDeinit() { ObjectDelete(0,buttonID); //ObjectDelete(0,labelID); ObjectDelete(0,editID); EventKillTimer(); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTick() { } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTimer() { yzMonitor.Monitor(); // запустим монитор событий } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //--- проверим событие на нажатие кнопки мышки if(id==CHARTEVENT_OBJECT_CLICK) { string clickedChartObject=sparam; //--- если нажатие на объекте с именем buttonID if(clickedChartObject==buttonID) { //--- состояние кнопки - нажата кнопка или нет bool selected=ObjectGetInteger(0,buttonID,OBJPROP_STATE); //--- выведем в лог отладочное сообщение // printf("Кнопка нажата =%f ",selected); int customEventID; // номер пользовательского события для отправки string message; // сообщение для отправки в событии //--- если кнопка нажата if(selected) { message="Кнопка нажата"; customEventID=CHARTEVENT_CUSTOM+1; } else // кнопка не нажата { message="Кнопка отжата"; customEventID=CHARTEVENT_CUSTOM+999; } //--- отправим пользовательское событие "своему"графику EventChartCustom(0,customEventID-CHARTEVENT_CUSTOM,0,0,message); //--- отправим сообщение всем открытым графикам BroadcastEvent(ChartID(),0,"Broadcast Message"); //--- отладочное сообщение // printf("Отправлено событие с ID =%d",customEventID); } ChartRedraw();// принудительно перерисуем все объекты на графике } //--- проверим событие на принадлежность к пользовательским событиям if(id>CHARTEVENT_CUSTOM) { if(id==broadcastEventID) { // printf(" Получили широковещательное сообщение от графика с id= %d",lparam); } else { //--- прочитаем текстовое сообщение в событии string info=sparam; // printf("Обрабатывается ПОЛЬЗОВАТЕЛЬСКОЕ событие с ID =%d",id); if(id==1001) { yzTrade.AllCloseMonitor=1; // известим монитор о необходимости вызвать закрытие всех позиций } //--- выведем сообщение в метке // ObjectSetString(0,labelID,OBJPROP_TEXT,sparam); ChartRedraw();// принудительно перерисуем все объекты на графике } } } //+------------------------------------------------------------------+ //| послать широковещательное сообщение всем открытм графикам | //+------------------------------------------------------------------+ void BroadcastEvent(long lparam,double dparam,string sparam) { int limit=100;// у нас наверняка не больше 100 открытых графиков int eventID=broadcastEventID-CHARTEVENT_CUSTOM; long currChart,prevChart=ChartFirst(); int i=0; while(i