//+------------------------------------------------------------------+ //| cm_ Profi Alert and Close + Delete Pending.mq5 | //| Copyright 2019, "cmillion@narod.ru" | //| http://cmillion.ru | //+------------------------------------------------------------------+ #property copyright "Copyright 2019, cmillion@narod.ru" #property link "http://cmillion.ru" #property version "1.00" #property strict #property description "Закрывает все ордера при заданном профите или убытке" #property description "Кнопками выбираются режимы алерта и торговли" //+------------------------------------------------------------------+ input double ProfitClose = 10; //закрывать все ордера при получении профита input double LossClose = -1000; //закрывать все ордера при получении убытка input bool AllSymbol = false;//учитывать все инструменты или только тот, на котором стоит советник input bool AlertON = false;//сигнал при достижении профита или убытка input bool TradeON = false;//разрешить советнику закрывать ордера при достижении профита или убытка input int slippage = 5; // проскальзывание //------------------------------------------------------------------- MqlTick tick; // текущая котировка MqlTradeRequest request; // параметры торгового запроса MqlTradeResult result; // результат торгового запроса MqlTradeCheckResult check; datetime TimeSignsl=0; //+------------------------------------------------------------------+ int OnInit() { string val=AccountInfoString(ACCOUNT_CURRENCY); RectLabelCreate(0,"rl BalanceW",0,195,20,190,50,clrLightGray); DrawLABEL("rl Balance", "Balance", 190,30,clrBlack,ANCHOR_LEFT); DrawLABEL("rl Equity", "Equity", 190,45,clrBlack,ANCHOR_LEFT); DrawLABEL("rl FreeMargin", "FreeMargin", 190,60,clrBlack,ANCHOR_LEFT); DrawLABEL("rl val Balance" ,val,10,30,clrBlack); DrawLABEL("rl val Equity" ,val,10,45,clrBlack); DrawLABEL("rl val FreeMargin" ,val,10,60,clrBlack); RectLabelCreate(0,"rl Close Profit" ,0,195,69,190,50); EditCreate(0,"rl Profit" ,0,190,75,60,40,DoubleToString(0,2),"Arial",8,ALIGN_CENTER,true); ButtonCreate(0,"kn close All" ,0,128,75,56,40,"Close all"); EditCreate(0,"rl ProfitClose" ,0,70,75,60,20,DoubleToString(ProfitClose,2) ,"Arial",8,ALIGN_CENTER,false); EditCreate(0,"rl LossClose" ,0,70,95,60,20,DoubleToString(LossClose,2),"Arial",8,ALIGN_CENTER,false); RectLabelCreate(0,"rl kn" ,0,195,118,190,25); ButtonCreate(0,"kn AllSymbol" ,0,190,120,60,20,"All Symbol","Arial",8,clrBlack,clrLightGray,clrNONE,AllSymbol); ButtonCreate(0,"kn AlertON" ,0,128,120,56,20,"Alert","Arial",8,clrBlack,clrLightGray,clrNONE,AlertON); ButtonCreate(0,"kn TradeON" ,0,70,120,60,20,"Trade","Arial",8,clrBlack,clrLightGray,clrNONE,TradeON); OnTick(); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ void OnTick() { double OOP,Profit=0,ProfitB=0,ProfitS=0; int i,b=0,s=0; long tip; //---- for(i=0; i=PC && PC!=0) { if (ObjectGetInteger(0,"kn AlertON",OBJPROP_STATE) && TimeSignsl!=iTime(NULL,0,0)) {Alert("Достигнут уровень профита = "+DoubleToString(Profit,2));TimeSignsl=iTime(NULL,0,0);} if (ObjectGetInteger(0,"kn TradeON",OBJPROP_STATE)) CloseAll(-1); return; } double LC=StringToDouble(ObjectGetString(0,"rl LossClose",OBJPROP_TEXT)); if (Profit<=LC && LC!=0) { if (ObjectGetInteger(0,"kn AlertON",OBJPROP_STATE) && TimeSignsl!=iTime(NULL,0,0)) {Alert("Достигнут уровень максимального убытка "+DoubleToString(Profit,2));TimeSignsl=iTime(NULL,0,0);} if (ObjectGetInteger(0,"kn TradeON",OBJPROP_STATE)) CloseAll(-1); } } //+------------------------------------------------------------------+ bool CloseAll(int tip) { int total=PositionsTotal(); for(int i=total-1; i>=0; i--) { ulong position_ticket=PositionGetTicket(i); string position_symbol=PositionGetSymbol(i); if (position_symbol!=_Symbol && !ObjectGetInteger(0,"kn AllSymbol",OBJPROP_STATE)) continue; int digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); ulong magic=PositionGetInteger(POSITION_MAGIC); double volume=PositionGetDouble(POSITION_VOLUME); ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); PrintFormat("#%I64u %s %s %.2f %s [%I64d]", position_ticket, position_symbol, EnumToString(type), volume, DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN),digits), magic); ZeroMemory(request); ZeroMemory(result); request.action =TRADE_ACTION_DEAL; request.position =position_ticket; request.symbol =position_symbol; request.volume =volume; request.deviation=5; request.magic =PositionGetInteger(POSITION_MAGIC); request.type_filling=ORDER_FILLING_IOC; if(type==POSITION_TYPE_BUY) { request.price=SymbolInfoDouble(position_symbol,SYMBOL_BID); request.type =ORDER_TYPE_SELL; } else { request.price=SymbolInfoDouble(position_symbol,SYMBOL_ASK); request.type =ORDER_TYPE_BUY; } PrintFormat("Close #%I64d %s %s",position_ticket,position_symbol,EnumToString(type)); if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order); } total=OrdersTotal(); for(int i=total-1; i>=0; i--) { ulong order_ticket=OrderGetTicket(i); if (OrderGetString(ORDER_SYMBOL)!=_Symbol && !ObjectGetInteger(0,"kn AllSymbol",OBJPROP_STATE)) continue; ZeroMemory(request); ZeroMemory(result); request.action=TRADE_ACTION_REMOVE; request.order = order_ticket; if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order); } return(true); } //-------------------------------------------------------------------- void DrawLABEL(string name, string Name, int X, int Y, color clr,ENUM_ANCHOR_POINT align=ANCHOR_RIGHT) { if (ObjectFind(0,name)==-1) { ObjectCreate(0,name, OBJ_LABEL, 0, 0, 0); ObjectSetInteger(0,name,OBJPROP_CORNER, CORNER_RIGHT_UPPER); ObjectSetInteger(0,name,OBJPROP_XDISTANCE, X); ObjectSetInteger(0,name,OBJPROP_YDISTANCE, Y); ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false); ObjectSetInteger(0,name,OBJPROP_SELECTED,false); ObjectSetInteger(0,name,OBJPROP_HIDDEN,true); ObjectSetInteger(0,name,OBJPROP_ANCHOR,align); ObjectSetInteger(0,name,OBJPROP_COLOR,clr); ObjectSetString(0,name,OBJPROP_FONT,"Arial"); ObjectSetInteger(0,name,OBJPROP_FONTSIZE,8); ObjectSetDouble(0,name,OBJPROP_ANGLE,0); } ObjectSetString(0,name,OBJPROP_TEXT,Name); } //-------------------------------------------------------------------- void OnDeinit(const int reason) { //if (!IsTesting()) { ObjectsDeleteAll(0,"IsTradeAllowed"); ObjectsDeleteAll(0,"Profit"); ObjectsDeleteAll(0,"kn"); ObjectsDeleteAll(0,"rl"); ObjectsDeleteAll(0,"Balance"); ObjectsDeleteAll(0,"Equity"); ObjectsDeleteAll(0,"FreeMargin"); } Comment(""); } //+------------------------------------------------------------------+ bool ButtonCreate(const long chart_ID=0, // ID графика const string name="Button", // имя кнопки const int sub_window=0, // номер подокна const long x=0, // координата по оси X const long y=0, // координата по оси Y const int width=50, // ширина кнопки const int height=18, // высота кнопки const string text="Button", // текст const string font="Arial", // шрифт const int font_size=8, // размер шрифта const color clr=clrBlack, // цвет текста const color clrfon=clrLightGray, // цвет фона const color border_clr=clrNONE, // цвет границы const bool state=false, const ENUM_BASE_CORNER CORNER=CORNER_RIGHT_UPPER) { if (ObjectFind(chart_ID,name)==-1) { ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0); ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width); ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height); ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,CORNER); ObjectSetString(chart_ID,name,OBJPROP_FONT,font); ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size); ObjectSetInteger(chart_ID,name,OBJPROP_BACK,0); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,0); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,0); ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,1); ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,1); ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state); } ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr); ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,clrfon); ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); ObjectSetString(chart_ID,name,OBJPROP_TEXT,text); ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x); ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y); return(true); } //-------------------------------------------------------------------- bool RectLabelCreate(const long chart_ID=0, // ID графика const string name="RectLabel", // имя метки const int sub_window=0, // номер подокна const long x=0, // координата по оси X const long y=0, // координата по оси y const int width=50, // ширина const int height=18, // высота const color back_clr=clrWhite, // цвет фона const color clr=clrBlack, // цвет плоской границы (Flat) const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль плоской границы const int line_width=1, // толщина плоской границы const bool back=false, // на заднем плане const bool selection=false, // выделить для перемещений const bool hidden=true, // скрыт в списке объектов const long z_order=0) // приоритет на нажатие мышью { ResetLastError(); if (ObjectFind(chart_ID,name)==-1) { ObjectCreate(chart_ID,name,OBJ_RECTANGLE_LABEL,sub_window,0,0); ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_TYPE,BORDER_FLAT); ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,CORNER_RIGHT_UPPER); ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width); ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); //ObjectSetInteger(chart_ID,name,OBJPROP_ALIGN,ALIGN_RIGHT); } ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr); ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width); ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height); ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x); ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y); return(true); } //-------------------------------------------------------------------- string Error(int code) { switch(code) { case 0: return("Нет ошибок"); case 1: return("Нет ошибки, но результат неизвестен"); case 2: return("Общая ошибка"); case 3: return("Неправильные параметры"); case 4: return("Торговый сервер занят"); case 5: return("Старая версия клиентского терминала"); case 6: return("Нет связи с торговым сервером"); case 7: return("Недостаточно прав"); case 8: return("Слишком частые запросы"); case 9: return("Недопустимая операция нарушающая функционирование сервера"); case 64: return("Счет заблокирован"); case 65: return("Неправильный номер счета"); case 128: return("Истек срок ожидания совершения сделки"); case 129: return("Неправильная цена"); case 130: return("Неправильные стопы"); case 131: return("Неправильный объем"); case 132: return("Рынок закрыт"); case 133: return("Торговля запрещена"); case 134: return("Недостаточно денег для совершения операции"); case 135: return("Цена изменилась"); case 136: return("Нет цен"); case 137: return("Брокер занят"); case 138: return("Новые цены"); case 139: return("Ордер заблокирован и уже обрабатывается"); case 140: return("Разрешена только покупка"); case 141: return("Слишком много запросов"); case 145: return("Модификация запрещена, так как ордер слишком близок к рынку"); case 146: return("Подсистема торговли занята"); case 147: return("Использование даты истечения ордера запрещено брокером"); case 148: return("Количество открытых и отложенных ордеров достигло предела, установленного брокером."); default: return("Ошибка неизвестна"); } } //-------------------------------------------------------------------- bool EditCreate(const long chart_ID=0, // ID графика const string name="Edit", // имя объекта const int sub_window=0, // номер подокна const int x=0, // координата по оси X const int y=0, // координата по оси Y const int width=50, // ширина const int height=18, // высота const string text="Text", // текст const string font="Arial", // шрифт const int font_size=8, // размер шрифта const ENUM_ALIGN_MODE align=ALIGN_RIGHT, // способ выравнивания const bool read_only=true, // возможность редактировать const ENUM_BASE_CORNER corner=CORNER_RIGHT_UPPER, // угол графика для привязки const color clr=clrBlack, // цвет текста const color back_clr=clrWhite, // цвет фона const color border_clr=clrNONE, // цвет границы const bool back=false, // на заднем плане const bool selection=false, // выделить для перемещений const bool hidden=true, // скрыт в списке объектов const long z_order=0) // приоритет на нажатие мышью { ResetLastError(); if(!ObjectCreate(chart_ID,name,OBJ_EDIT,sub_window,0,0)) { Print(__FUNCTION__, ": не удалось создать объект ",name,"! Код ошибки = ",GetLastError()); return(false); } ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x); ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y); ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width); ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height); ObjectSetString(chart_ID,name,OBJPROP_TEXT,text); ObjectSetString(chart_ID,name,OBJPROP_FONT,font); ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size); ObjectSetInteger(chart_ID,name,OBJPROP_ALIGN,align); ObjectSetInteger(chart_ID,name,OBJPROP_READONLY,read_only); ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner); ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr); ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr); ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); return(true); } //+------------------------------------------------------------------+ string Text(bool P,string a,string b) { if (P) return(a); else return(b); } //------------------------------------------------------------------ color Color(bool P,color a,color b) { if (P) return(a); else return(b); } //------------------------------------------------------------------