//+------------------------------------------------------------------+ //| SMARTHEDGE basket.mq4 | //| Copyright 2019, [email protected] | //| http://www.cmillion.ru | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, [email protected]" #property link "http://www.cmillion.ru" string ver = "BASKET 1.2"; #property version "1.2" #property strict #property description "Советник управляющий счетом. Показывает какие пары инструментов сейчас торгуются на данном счете." #property description "Показывает прибыль полученную по каждой паре за определенное время. Помогает переключаться между множества открытых окон" #property description "Advisor managing individual. Shows which pairs of instruments are currently traded on this account." #ifdef __MQL5__ MqlTick tick; MqlTradeRequest request; MqlTradeResult result; MqlTradeCheckResult check; ENUM_ORDER_TYPE_FILLING FillingMode=ORDER_FILLING_RETURN; #endif //+------------------------------------------------------------------+ input color colorfon = clrIvory; input double WindSizeX = 1.2; input double WindSizeY = 1.0; input color colorGREEN = clrLime; input color colorRED = clrPink; input bool SendMailInfo= true; input int ReOpen = false; input double AutoClose = 0.0; int orders=0,AN,Y=0,X=0,dY=0,dX=0,n=0; bool LANGUAGE=false; double tOrders[100][5]; double History[100][9]; string NameAccount,Symbl[100]; double ProfitAll[9]; //+------------------------------------------------------------------+ void OnTimer(){ OnTick();} void OnTick() { //-----------------------------------------------------------------------// // // // // // контроль позиций // // // // // //-----------------------------------------------------------------------// ArrayInitialize(tOrders,0); double Profit=0,Profit_ALL=0; int OT=0,i,j; string Symb; #ifdef __MQL4__ //---------------------------- MT4 --------------------------------------------------- for (i=OrdersTotal()-1; i>=0; i--) { if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; Symb = OrderSymbol(); Profit=OrderProfit()+OrderSwap()+OrderCommission(); if (OrderType()==OP_BUY) OT=1; else OT=-1; #endif #ifdef __MQL5__ //--------------------------- MT5 --------------------------------------------------- for(i=PositionsTotal()-1; i>=0; i--) { Symb=PositionGetSymbol(i); Profit=PositionGetDouble(POSITION_PROFIT)+PositionGetDouble(POSITION_SWAP)+GetPositionCommission()*2; if (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY) OT=1; else OT=-1; #endif //------------------------------------------------------------------- Profit_ALL+=Profit; j=Insrt(Symb); if (n<j) n=j; tOrders[j][0]+=Profit;// [0] профит по всему инструменту if (OT>0) {tOrders[j][1]++;tOrders[j][3]+=Profit;}// [1] число buy if (OT<0) {tOrders[j][2]++;tOrders[j][4]+=Profit;}// [1] число sell } //----------------------------------------------------------------------------------// // // // Закрытие по суммарному профиту // // // //----------------------------------------------------------------------------------// if (AutoClose!=0 && Profit_ALL!=0 && Profit_ALL>=AutoClose) { if (SendMailInfo) SendMail(IntegerToString(AN)," basket close all"); CloseAll(); } //----------------------------------------------------------------------------------// // // // выводим таблицу профитов по инструментам // // // //----------------------------------------------------------------------------------// string name,SN; Y=25; int DY=19; for(j=0;j<=n;j++)//всего инструментов с открытыми позициями { SN=IntegerToString(j); name=StrCon("cm Insrt",SN);X=0; EditCreate(0,name,0,X,Y+DY*j,100,20,Symbl[j],"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrBlack,clrWhite);//имя инструмента X+=105; name=StrCon("cm Insrt",SN,"Profit"); EditCreate(0,name,0,X,Y+DY*j,70,20,DoubleToString(tOrders[j][0],2),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrBlack,tOrders[j][0]>0?colorGREEN:tOrders[j][0]<0?colorRED:clrWhite);//профит по инструменту X+=75; name=StrCon("cm OrdersB ",SN); EditCreate(0,name,0,X,Y+DY*j,30,20,DoubleToString(tOrders[j][1],0),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrBlack,clrWhite); X+=35; name=StrCon("cm Insrt",SN,"ProfitB"); EditCreate(0,name,0,X,Y+DY*j,70,20,DoubleToString(tOrders[j][3],2),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrBlack,tOrders[j][3]>0?colorGREEN:tOrders[j][3]<0?colorRED:clrWhite);//профит по инструменту X+=75; name=StrCon("cm OrdersS ",SN); EditCreate(0,name,0,X,Y+DY*j,30,20,DoubleToString(tOrders[j][2],0),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrBlack,clrWhite); X+=35; name=StrCon("cm Insrt",SN,"ProfitS"); EditCreate(0,name,0,X,Y+DY*j,70,20,DoubleToString(tOrders[j][4],2),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrBlack,tOrders[j][4]>0?colorGREEN:tOrders[j][4]<0?colorRED:clrWhite);//профит по инструменту for(i=0;i<9;i++)//суммы профитов по дням неделям мес { EditCreate(0,StrCon("cm HP"+IntegerToString(i)+IntegerToString(j)),0,X+75+75*i,Y+DY*j,70,20,DoubleToString(History[j][i],2),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrBlack, History[j][i]>0?colorGREEN:History[j][i]<0?colorRED:clrWhite); } } //----------------------------------------------------------------------------------// // // // Нижняя шапка ИТОГО // // // //----------------------------------------------------------------------------------// X=0; EditCreate(0,"cm ALL",0,X,Y+5+DY*j,100,20,"© https://cmillion.ru","Arial",8,ALIGN_CENTER,false,CORNER_LEFT_UPPER,clrGray,clrWhite);X+=105; EditCreate(0,"cm ProfitALL",0,X,Y+5+DY*j,70,20,DoubleToString(Profit_ALL,2),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrBlack,Profit_ALL>0?colorGREEN:Profit_ALL<0?colorRED:clrWhite); /*X+=110; EditCreate(0,"cm ProfitALLB",0,X,Y+5+DY*j,70,20,DoubleToString(ProfitALL,2),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrBlack,ProfitALL>0?colorGREEN:ProfitALL<0?colorRED:clrWhite); X+=110; EditCreate(0,"cm ProfitALLS",0,X,Y+5+DY*j,70,20,DoubleToString(ProfitALL,2),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrBlack,ProfitALL>0?colorGREEN:ProfitALL<0?colorRED:clrWhite); //EditCreate(0,"cm HistoryALL",0,X+130,Y+5+DY*j,70,20,DoubleToString(HistoryALL,2),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);*/ X+=295; for(i=0;i<9;i++)//суммы профитов по дням неделям мес { EditCreate(0,"cm ProfitAll"+IntegerToString(i),0,X+75*i,Y+5+DY*j,70,20,DoubleToString(ProfitAll[i],2),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrBlack,ProfitAll[i]>0?colorGREEN:ProfitAll[i]<0?colorRED:clrWhite); } if (orders!=OrdersTotal()) History(); orders=OrdersTotal(); } //+------------------------------------------------------------------+ int Insrt(string Sym) { int j=0; for(j=0;j<100;j++) { if (Sym==Symbl[j] || Symbl[j]==NULL) break; } if (j>99) j=99; Symbl[j]=Sym; return(j); } //+------------------------------------------------------------------+ 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_LOWER, // угол графика для привязки 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 (ObjectFind(chart_ID,name)!=-1) ObjectDelete(chart_ID,name); if(!ObjectCreate(chart_ID,name,OBJ_EDIT,sub_window,0,0)) { Print(__FUNCTION__, ": не удалось создать объект ",name,"! Код ошибки = ",GetLastError()); return(false); } ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,(int)(dX+x*WindSizeX)); ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,(int)(dY+y*WindSizeY)); ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,(int)(width*WindSizeX)); ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,(int)(height*WindSizeY)); 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); } //+------------------------------------------------------------------+ 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=10, // размер шрифта const color clr=clrRed, // цвет текста const color clrfon=clrBlack, // цвет фона const color border_clr=clrNONE, // цвет границы const bool state=false, const ENUM_BASE_CORNER CORNER=CORNER_RIGHT_LOWER) { if (ObjectFind(chart_ID,name)==-1) { ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0); ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,(int)(height*WindSizeY)); 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_XSIZE,(int)(width*WindSizeX)); 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,(int)(dX+x*WindSizeX)); ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,(int)(dY+y*WindSizeY)); 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=clrNONE, // цвет фона const color clr=clrNONE, // цвет плоской границы (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, const int CORNER=CORNER_LEFT_LOWER) // приоритет на нажатие мышью { 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); 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_BGCOLOR,back_clr); ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,(int)(width*WindSizeX)); ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,(int)(height*WindSizeY)); ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,(int)(dX+x*WindSizeX)); ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,(int)(dY+y*WindSizeY)); return(true); } //-------------------------------------------------------------------- bool LabelCreate(const long chart_ID=0, // ID графика const string name="Label", // имя метки const int sub_window=0, // номер подокна const int x=0, // координата по оси X const int y=0, // координата по оси Y const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // угол графика для привязки const string text="Label", // текст const string font="Arial", // шрифт const int font_size=10, // размер шрифта const color clr=clrBlack, // цвет const double angle=0.0, // наклон текста const ENUM_ANCHOR_POINT anchor=ANCHOR_RIGHT_UPPER,// способ привязки const bool back=false, // на заднем плане const bool selection=false, // выделить для перемещений const bool hidden=true, // скрыт в списке объектов const long z_order=0) // приоритет на нажатие мышью { ResetLastError(); if(ObjectFind(chart_ID,name)==-1) { if(!ObjectCreate(chart_ID,name,OBJ_LABEL,sub_window,0,0)) { return(false); } } ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,(int)(dX+x*WindSizeX)); ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,(int)(dY+y*WindSizeY)); ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner); ObjectSetString(chart_ID,name,OBJPROP_TEXT,text); ObjectSetString(chart_ID,name,OBJPROP_FONT,font); ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size); ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,angle); ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,anchor); ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,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); } //+------------------------------------------------------------------+ void OnDeinit(const int reason) { ObjectsDeleteAll(0); EventKillTimer(); } //------------------------------------------------------------------- bool Liz() { if(AccountInfoInteger(ACCOUNT_TRADE_MODE)!=ACCOUNT_TRADE_MODE_REAL) return(true); if (AN==0) return(true); if (StringFind(NameAccount,"Хлыстов Владимир Степанович")!=-1) return(true); if (StringFind(NameAccount,"Владимир Степанович Хлыстов")!=-1) return(true); return(false); } //+------------------------------------------------------------------+ void History() { double Profit=0; datetime OCT; ulong Ticket; int i,j; string Symb; ArrayInitialize(ProfitAll,0); ArrayInitialize(History,0); #ifdef __MQL4__ //---------------------------- MT4 --------------------------------------------------- for (i=OrdersHistoryTotal()-1; i>=0; i--) { if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue; if (OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue; Ticket = OrderTicket(); Symb = OrderSymbol(); Profit=OrderProfit()+OrderSwap()+OrderCommission(); OCT = OrderCloseTime(); Profit = OrderProfit()+OrderSwap()+OrderCommission(); #endif #ifdef __MQL5__ //--------------------------- MT5 --------------------------------------------------- ulong order_ticket; // тикет ордера,по которому была совершена сделка long deal_type ; // тип торговой операции long position_ID; // идентификатор позиции datetime from_date=0; // с самого начала datetime to_date=TimeCurrent();// по текущий момент HistorySelect(from_date,to_date); int deals=HistoryDealsTotal(); for(i=0;i<deals;i++) { Ticket= HistoryDealGetTicket(i); order_ticket= HistoryDealGetInteger(Ticket,DEAL_ORDER); deal_type= HistoryDealGetInteger(Ticket,DEAL_TYPE); Symb= HistoryDealGetString(Ticket,DEAL_SYMBOL); position_ID= HistoryDealGetInteger(Ticket,DEAL_POSITION_ID); if(deal_type!=DEAL_TYPE_BUY && deal_type!=DEAL_TYPE_SELL) continue; Profit=HistoryDealGetDouble(Ticket,DEAL_PROFIT)+HistoryDealGetDouble(Ticket,DEAL_COMMISSION)+HistoryDealGetDouble(Ticket,DEAL_SWAP); OCT=(datetime)HistoryDealGetInteger(Ticket,DEAL_TIME); #endif if (OCT==0) continue; if(Profit==0) continue; j=Insrt(Symb); if (n<j) n=j; if (OCT>=iTime(NULL,PERIOD_D1,0)) {History[j][0]+=Profit; ProfitAll[0]+=Profit;}//сегодня else { if (OCT>=iTime(NULL,PERIOD_D1,1)) {History[j][1]+=Profit; ProfitAll[1]+=Profit;}//вчера else { if (OCT>=iTime(NULL,PERIOD_D1,2)) {History[j][2]+=Profit; ProfitAll[2]+=Profit;}//позавчера else { if (OCT>=iTime(NULL,PERIOD_D1,3)) {History[j][3]+=Profit; ProfitAll[3]+=Profit;}// else { if (OCT>=iTime(NULL,PERIOD_D1,4)) {History[j][4]+=Profit; ProfitAll[4]+=Profit;}// else { if (OCT>=iTime(NULL,PERIOD_D1,5)) {History[j][5]+=Profit; ProfitAll[5]+=Profit;}// } } } } } if (OCT>=iTime(NULL,PERIOD_W1,0)) {History[j][6]+=Profit;ProfitAll[6]+=Profit;}//неделя if (OCT>=iTime(NULL,PERIOD_MN1,0)) {History[j][7]+=Profit;ProfitAll[7]+=Profit;}//месяц History[j][8]+=Profit;ProfitAll[8]+=Profit; // [1] накопленный профит по всему инструменту } } //+------------------------------------------------------------------+ #ifdef __MQL5__ double GetPositionCommission(void) { double Commission=::PositionGetDouble(POSITION_COMMISSION); // На случай, если POSITION_COMMISSION не работает if(Commission==0) { ulong Ticket=GetPositionDealIn(); if(Ticket>0) { const double LotsIn=::HistoryDealGetDouble(Ticket,DEAL_VOLUME); if(LotsIn>0) Commission=::HistoryDealGetDouble(Ticket,DEAL_COMMISSION)*::PositionGetDouble(POSITION_VOLUME)/LotsIn; } } return(Commission); } //-------------------------------------------------------------------- ulong GetPositionDealIn(const ulong HistoryTicket=0) { ulong Ticket=0; if((HistoryTicket==0) ? ::HistorySelectByPosition(::PositionGetInteger(POSITION_TICKET)) : ::HistorySelectByPosition(HistoryTicket)) { const int Total=::HistoryDealsTotal(); for(int i=0; i<Total; i++) { const ulong TicketDeal=::HistoryDealGetTicket(i); if(TicketDeal>0) if((ENUM_DEAL_ENTRY)::HistoryDealGetInteger(TicketDeal,DEAL_ENTRY)==DEAL_ENTRY_IN) { Ticket=TicketDeal; break; } } } return(Ticket); } //+------------------------------------------------------------------+ #endif string StrCon(string t1=NULL,string t2=NULL,string t3=NULL,string t4=NULL,string t5=NULL,string t6=NULL,string t7=NULL,string t8=NULL,string t9=NULL,string t10=NULL,string t11=NULL) { string str; #ifdef __MQL4__ str=StringConcatenate(#endif #ifdef __MQL5__ StringConcatenate(str,#endif t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11); return(str); } //+------------------------------------------------------------------+ string AC; int OnInit() { AN=(int)AccountInfoInteger(ACCOUNT_LOGIN); NameAccount=AccountInfoString(ACCOUNT_NAME); AC = " "+AccountInfoString(ACCOUNT_CURRENCY); History(); EventSetTimer(1); LANGUAGE=TerminalInfoString(TERMINAL_LANGUAGE)=="Russian"; ChartSetInteger(0,CHART_COLOR_FOREGROUND,colorfon);//Цвет осей, шкалы и строки OHLC ChartSetInteger(0,CHART_COLOR_BACKGROUND,colorfon); ChartSetInteger(0,CHART_FOREGROUND,false);//Ценовой график на переднем плане ChartSetInteger(0,CHART_SHOW_GRID,false); ChartSetInteger(0,CHART_BRING_TO_TOP,true); ChartSetInteger(0,CHART_SHOW_ASK_LINE,false); ChartSetInteger(0,CHART_SHOW_BID_LINE,false); ChartSetInteger(0,CHART_SHOW_OHLC,false);//Отображение в левом верхнем углу значений OHLC ChartSetInteger(0,CHART_SHOW_LAST_LINE,false); ChartSetInteger(0,CHART_SHOW_GRID,false); ChartSetInteger(0,CHART_SHOW_VOLUMES,false); ChartSetInteger(0,CHART_SHOW_OBJECT_DESCR,false); ChartSetInteger(0,CHART_CONTEXT_MENU,false);//Включение/отключение доступа к контекстному меню по нажатию правой клавиши мышки. ChartSetInteger(0,CHART_CROSSHAIR_TOOL,false);//перекрести ChartSetInteger(0,CHART_MOUSE_SCROLL,false);//Прокрутка графика левой кнопкой мышки по горизонтали. ChartSetInteger(0,CHART_SHOW_ONE_CLICK,false); #ifdef __MQL5__ ChartSetInteger(0,CHART_SHOW,false);//Признак отрисовки ценового графика FillingMode=ORDER_FILLING_RETURN;// Данный режим используется для рыночных int FILLING_MODE=(int)SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE); if ((SYMBOL_FILLING_IOC & FILLING_MODE)==SYMBOL_FILLING_IOC) FillingMode=ORDER_FILLING_IOC;// Все или частично if ((SYMBOL_FILLING_FOK & FILLING_MODE)==SYMBOL_FILLING_FOK) FillingMode=ORDER_FILLING_FOK;//может быть исполнен исключительно в указанном объеме #endif ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,colorfon); ChartSetInteger(0,CHART_COLOR_CHART_DOWN,colorfon); ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,colorfon); ChartSetInteger(0,CHART_COLOR_CHART_UP,colorfon); ChartSetInteger(0,CHART_COLOR_CHART_LINE,colorfon); ChartSetInteger(0,CHART_COLOR_STOP_LEVEL,colorfon); ChartSetInteger(0,CHART_COLOR_LAST,colorfon); ChartSetInteger(0,CHART_SHOW_TRADE_LEVELS,colorfon); ChartSetInteger(0,CHART_DRAG_TRADE_LEVELS,false); ChartSetInteger(0,CHART_SHOW_DATE_SCALE,false); ChartSetInteger(0,CHART_SHOW_PRICE_SCALE,false); ChartSetInteger(0,CHART_COLOR_VOLUME,colorfon); ChartSetInteger(0,CHART_HEIGHT_IN_PIXELS,100); X=0;Y=0; EditCreate(0,"cm _1",0,X,Y,100,20,ver,"ARIAL BLACK",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue); X+=105; EditCreate(0,"cm _2",0,X,Y,70,20,"Profit","Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);X+=75; EditCreate(0,"cm _b",0,X,Y,105,20,"buy","Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);X+=110; EditCreate(0,"cm _s",0,X,Y,105,20,"sell","Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);X+=110; EditCreate(0,"cm _3",0,X,Y,70,20,"Сегодня","Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);X+=75; EditCreate(0,"cm _4",0,X,Y,70,20,TimeToString(iTime(NULL,PERIOD_D1,1),TIME_DATE),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);X+=75; EditCreate(0,"cm _5",0,X,Y,70,20,TimeToString(iTime(NULL,PERIOD_D1,2),TIME_DATE),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);X+=75; EditCreate(0,"cm _6",0,X,Y,70,20,TimeToString(iTime(NULL,PERIOD_D1,3),TIME_DATE),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);X+=75; EditCreate(0,"cm _7",0,X,Y,70,20,TimeToString(iTime(NULL,PERIOD_D1,4),TIME_DATE),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);X+=75; EditCreate(0,"cm _8",0,X,Y,70,20,TimeToString(iTime(NULL,PERIOD_D1,4),TIME_DATE),"Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);X+=75; EditCreate(0,"cm _9",0,X,Y,70,20,"Неделя","Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);X+=75; EditCreate(0,"cm _10",0,X,Y,70,20,"Месяц","Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue);X+=75; EditCreate(0,"cm _11",0,X,Y,70,20,"Всего","Arial",8,ALIGN_CENTER,true,CORNER_LEFT_UPPER,clrWhite,clrBlue); ChartSetInteger(0,CHART_BRING_TO_TOP,true); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ int Slippage = 1000; #ifdef __MQL4__ bool CloseAll(string Symbol1="ALL",int tip=0) { bool error=true; int j,err,nn=0,OT; string Symb; double Profit=0,OOP; while(!IsStopped()) { for (j = OrdersTotal()-1; j >= 0; j--) { if (OrderSelect(j, SELECT_BY_POS)) { Symb = OrderSymbol(); if (Symb == Symbol1 || Symbol1=="ALL") { OT = OrderType(); OOP=OrderOpenPrice(); Profit=OrderProfit()+OrderSwap()+OrderCommission(); if (OT>1) { error=OrderDelete(OrderTicket()); } if (OT==OP_BUY && tip>-1) { error=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(Symb,MODE_BID),(int)MarketInfo(Symb,MODE_DIGITS)),Slippage,Blue); } if (OT==OP_SELL && tip<1) { error=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(Symb,MODE_ASK),(int)MarketInfo(Symb,MODE_DIGITS)),Slippage,Red); } if (!error) { err = GetLastError(); if (err<2) continue; if (err==129) { Sleep(5000); RefreshRates(); continue; } if (err==146) { if (IsTradeContextBusy()) Sleep(2000); continue; } } } } } int k=0; for (j = 0; j < OrdersTotal(); j++) { if (OrderSelect(j, SELECT_BY_POS)) { Symb = OrderSymbol(); if (Symb == Symbol1 || Symbol1=="ALL") { OT = OrderType(); if (OT==OP_BUY && tip>-1) k++; if (OT==OP_SELL && tip<1) k++; } } } if (k==0) break; nn++; if (nn>10) {/*ALERT(StringConcatenate(Symb,LANGUAGE?" Не удалось закрыть все сделки, осталось еще ":"Failed to close all transactions, there is still ",k));*/return(false);} Sleep(1000); RefreshRates(); } ObjectsDeleteAll(0,"cm"); OnInit(); return(true); } #endif //-------------------------------------------------------------------- #ifdef __MQL5__ bool CloseAll(string Symbol1="ALL",int tip=0) { bool error=true; int i,err,nn=0; long OT; string Symb; int k=0; double Profit=0; while(!IsStopped()) { k=0; for (i = PositionsTotal()-1; i >= 0; i--) { Symb=PositionGetSymbol(i); if (Symb != Symbol1 && Symbol1!="ALL") continue; Profit=PositionGetDouble(POSITION_PROFIT)+PositionGetDouble(POSITION_SWAP)+GetPositionCommission()*2; OT = PositionGetInteger(POSITION_TYPE); ZeroMemory(request); ZeroMemory(result); request.deviation = Slippage; request.volume=PositionGetDouble(POSITION_VOLUME); request.position = PositionGetInteger(POSITION_TICKET); request.action=TRADE_ACTION_DEAL; request.comment=""; request.type_filling = FillingMode; request.symbol = Symb; request.magic = PositionGetInteger(POSITION_MAGIC); k++; if (OT==POSITION_TYPE_BUY && tip>-1) { request.price=SymbolInfoDouble(Symb,SYMBOL_BID); request.type=ORDER_TYPE_SELL; } if (OT==POSITION_TYPE_SELL && tip<1) { request.price=SymbolInfoDouble(Symb,SYMBOL_ASK); request.type=ORDER_TYPE_BUY; } if(!OrderSend(request,result)) { err = GetLastError(); if (err<2) continue; Print("Ошибка ",err," закрытия ордера N ",request.position," ",TimeToString(TimeCurrent(),TIME_SECONDS)); } } if (k==0) break; nn++; if (nn>10) return(false); Sleep(1000); } return(true); } #endif //-------------------------------------------------------------------- void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &name) { int i,j,ret=IDYES; long ch,prevChart=0; if(id==CHARTEVENT_OBJECT_CLICK) { string txt,Symb=NULL; if (StringFind(name,"cm Insrt")!=-1) { i=StringFind(name,"Profit"); if (i==-1)//нажата кнопка имени валютной пары { Symb=ObjectGetString(0,name,OBJPROP_TEXT); i=-1; while(i<100)// у нас наверняка не больше 100 открытых графиков { ch=ChartNext(prevChart); if (ch==ChartID()) {prevChart=ch;continue;}//текущий график пропустим if(ch<0) break; // достигли конца списка графиков prevChart=ch;// запомним идентификатор текущего графика для ChartNext() if (ChartSymbol(ch)==Symb) { ChartSetInteger(ch,CHART_BRING_TO_TOP,true); if (ChartGetInteger(0,CHART_WIDTH_IN_PIXELS)<ChartGetInteger(ch,CHART_WIDTH_IN_PIXELS)) ChartSetInteger(0 ,CHART_BRING_TO_TOP,true); break; } i++; } } else { txt=StringSubstr(name,8,i-8); j=(int)StringToInteger(txt); Symb=Symbl[j]; txt=ObjectGetString(0,name,OBJPROP_TEXT); //Alert(txt," - ",name); if (Symb!=NULL) { if (StringFind(name,"ProfitB")!=-1)//buy { txt=StrCon(LANGUAGE?"закрыть все buy позиции ":"close all buy pozichions ",Symb," ",txt,AC); ret=MessageBox(StrCon(LANGUAGE?"Вы действительно хотите закрыть ":"Are you sure you want to close ",Symb," ?"),txt,MB_YESNO|MB_TOPMOST); if (ret==IDYES) { CloseAll(Symb,1); } } if (StringFind(name,"ProfitS")!=-1)//sell { txt=StrCon(LANGUAGE?"закрыть все sell позиции ":"close all sell pozichions ",Symb," ",txt,AC); ret=MessageBox(StrCon(LANGUAGE?"Вы действительно хотите закрыть ":"Are you sure you want to close ",Symb," ?"),txt,MB_YESNO|MB_TOPMOST); if (ret==IDYES) { CloseAll(Symb,-1); } } txt=StrCon(LANGUAGE?"закрыть все позиции ":"close all pozichions ",Symb," ",txt,AC); ret=MessageBox(StrCon(LANGUAGE?"Вы действительно хотите закрыть ":"Are you sure you want to close ",Symb," ?"),txt,MB_YESNO|MB_TOPMOST); if (ret==IDYES) { CloseAll(Symb); } } } } if (name=="cm ProfitALL") { txt=StrCon(LANGUAGE?"закрыть все позиции по счету":"close all pozichions ",DoubleToString(AccountInfoDouble(ACCOUNT_PROFIT),2),AC); ret=MessageBox((LANGUAGE?"Вы действительно хотите все закрыть?":"Are you sure you want to close everything?"),txt,MB_YESNO|MB_TOPMOST); if (ret==IDYES) { CloseAll(); } } } } //-------------------------------------------------------------------//
发表评论