//+----------------------------------------------------------------------------+ //| i-Profit.mq4 | //| | //| Ким Игорь В. aka KimIV | //| http://www.kimiv.ru | //| | //+----------------------------------------------------------------------------+ #property copyright "Ким Игорь В. aka KimIV" #property link "http://www.kimiv.ru" #property indicator_chart_window //------- Внешние параметры индикатора ----------------------------------------+ extern int eiPercent = 0; // Расчёт процента прибыли относительно: // 0 - текущего баланса // 1 - баланса на начало дня // 2 - баланса на начало недели // 3 - баланса на начало месяца // 4 - баланса на начало квартала // 5 - баланса на начало года // 6 - баланса на пользовательскую дату extern datetime edUserDate=D'2012.12.20 09:12'; // Пользовательская дата extern int eiOffsetY = 30; // Смещение текста по вертикали extern int eiStepY = 12; // Шаг смещения текста по вертикали extern int eiX1Row = 3; // Координата X первой колонки extern int eiX2Row = 165; // Координата X второй колонки extern int eiX3Row = 230; // Координата X третей колонки extern int eiX4Row = 305; // Координата X четвёртой колонки extern color ecText = Gray; // Цвет текста extern color ecProfit = Green; // Цвет прибыли extern color ecLoss = FireBrick; // Цвет убытка //------- Глобальные переменные индикатора ------------------------------------+ //------- Буферы индикатора ---------------------------------------------------+ //------- Поключение внешних модулей ------------------------------------------+ //+----------------------------------------------------------------------------+ //| Custom indicator initialization function | //+----------------------------------------------------------------------------+ void init() { DeleteObjects(); Comment(""); } //+----------------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+----------------------------------------------------------------------------+ void deinit() { DeleteObjects(); Comment(""); } //+----------------------------------------------------------------------------+ //| Custom indicator iteration function | //+----------------------------------------------------------------------------+ void start() { datetime d0,d1,d2,d3,d4,d5,d6,d7,d8,d9; d0=StrToTime(TimeToStr(TimeCurrent(),TIME_DATE)); while(TimeDayOfWeek(d0)<1 || TimeDayOfWeek(d0)>5) d0-=24*60*60; d1=d0-24*60*60; while(TimeDayOfWeek(d1)<1 || TimeDayOfWeek(d1)>5) d1-=24*60*60; d2=d1-24*60*60; while(TimeDayOfWeek(d2)<1 || TimeDayOfWeek(d2)>5) d2-=24*60*60; d3=d2-24*60*60; while(TimeDayOfWeek(d3)<1 || TimeDayOfWeek(d3)>5) d3-=24*60*60; d4=d3-24*60*60; while(TimeDayOfWeek(d4)<1 || TimeDayOfWeek(d4)>5) d4-=24*60*60; d5=DateOfMonday(); d6=StrToTime(Year()+"."+Month()+".01"); d7=DateBeginQuarter(); d8=StrToTime(Year()+".01.01"); d9=edUserDate; double tu=GetProfitOpenPosInPoint(); double u0=GetProfitFromDateInPoint("", -1, -1, d0); double u1=GetProfitFromDateInPoint("", -1, -1, d1)-u0; double u2=GetProfitFromDateInPoint("", -1, -1, d2)-u1-u0; double u3=GetProfitFromDateInPoint("", -1, -1, d3)-u2-u1-u0; double u4=GetProfitFromDateInPoint("", -1, -1, d4)-u3-u2-u1-u0; double u5=GetProfitFromDateInPoint("", -1, -1, d5); double u6=GetProfitFromDateInPoint("", -1, -1, d6); double u7=GetProfitFromDateInPoint("", -1, -1, d7); double u8=GetProfitFromDateInPoint("", -1, -1, d8); double u9=GetProfitFromDateInPoint("", -1, -1, d9); double tb=AccountBalance(), tp=AccountProfit(); double p0=GetProfitFromDateInCurrency("", -1, -1, d0); double p1=GetProfitFromDateInCurrency("", -1, -1, d1)-p0; double p2=GetProfitFromDateInCurrency("", -1, -1, d2)-p1-p0; double p3=GetProfitFromDateInCurrency("", -1, -1, d3)-p2-p1-p0; double p4=GetProfitFromDateInCurrency("", -1, -1, d4)-p3-p2-p1-p0; double p5=GetProfitFromDateInCurrency("", -1, -1, d5); double p6=GetProfitFromDateInCurrency("", -1, -1, d6); double p7=GetProfitFromDateInCurrency("", -1, -1, d7); double p8=GetProfitFromDateInCurrency("", -1, -1, d8); double p9=GetProfitFromDateInCurrency("", -1, -1, d9); // Изменение баланса double h0=GetChangeBalance("", -1, -1, d0); double h5=GetChangeBalance("", -1, -1, d5); double h6=GetChangeBalance("", -1, -1, d6); double h7=GetChangeBalance("", -1, -1, d7); double h8=GetChangeBalance("", -1, -1, d8); double h9=GetChangeBalance("", -1, -1, d9); string st; switch(eiPercent) { case 0 : st="текущего"; break; case 1 : tb-=p0+h0; st="на начало дня"; break; case 2 : tb-=p5+h5; st="на начало недели"; break; case 3 : tb-=p6+h6; st="на начало месяца"; break; case 4 : tb-=p7+h7; st="на начало квартала"; break; case 5 : tb-=p8+h8; st="на начало года"; break; default: tb-=p9+h9; st="на "+TimeToStr(d9, TIME_DATE); break; } double tr=tp*100/tb; double r0=p0*100/tb; double r1=p1*100/tb; double r2=p2*100/tb; double r3=p3*100/tb; double r4=p4*100/tb; double r5=p5*100/tb; double r6=p6*100/tb; double r7=p7*100/tb; double r8=p8*100/tb; double r9=p9*100/tb; SetLabel("iProfit05","Прибыль",ecText,eiX1Row+25,eiOffsetY); SetLabel("iProfit06","в пунктах",ecText,eiX2Row-15,eiOffsetY); SetLabel("iProfit07","в валюте",ecText,eiX3Row+35,eiOffsetY); SetLabel("iProfit11","Текущая прибыль",ecText,eiX1Row,eiOffsetY+1*eiStepY); SetLabel("iProfit21","Прибыль за сегодня",ecText,eiX1Row,eiOffsetY+2*eiStepY); SetLabel("iProfit31","Прибыль за "+TimeToStr(d1,TIME_DATE),ecText,eiX1Row,eiOffsetY+3*eiStepY); SetLabel("iProfit41","Прибыль за "+TimeToStr(d2,TIME_DATE),ecText,eiX1Row,eiOffsetY+4*eiStepY); SetLabel("iProfit51","Прибыль за "+TimeToStr(d3,TIME_DATE),ecText,eiX1Row,eiOffsetY+5*eiStepY); SetLabel("iProfit61","Прибыль за "+TimeToStr(d4,TIME_DATE),ecText,eiX1Row,eiOffsetY+6*eiStepY); SetLabel("iProfit71","Прибыль за неделю",ecText,eiX1Row,eiOffsetY+7*eiStepY); SetLabel("iProfit81","Прибыль за месяц",ecText,eiX1Row,eiOffsetY+8*eiStepY); SetLabel("iProfit91","Прибыль за квартал",ecText,eiX1Row,eiOffsetY+9*eiStepY); SetLabel("iProfit01","Прибыль за год",ecText,eiX1Row,eiOffsetY+10*eiStepY); SetLabel("iProfita1","Прибыль с "+TimeToStr(d9,TIME_DATE),ecText,eiX1Row,eiOffsetY+11*eiStepY); SetLabel("iProfit12",DoubleToStr(tu,0),ColorOnSign(tp),eiX2Row,eiOffsetY+1*eiStepY); SetLabel("iProfit22",DoubleToStr(u0,0),ColorOnSign(u0),eiX2Row,eiOffsetY+2*eiStepY); SetLabel("iProfit32",DoubleToStr(u1,0),ColorOnSign(u1),eiX2Row,eiOffsetY+3*eiStepY); SetLabel("iProfit42",DoubleToStr(u2,0),ColorOnSign(u2),eiX2Row,eiOffsetY+4*eiStepY); SetLabel("iProfit52",DoubleToStr(u3,0),ColorOnSign(u3),eiX2Row,eiOffsetY+5*eiStepY); SetLabel("iProfit62",DoubleToStr(u4,0),ColorOnSign(u4),eiX2Row,eiOffsetY+6*eiStepY); SetLabel("iProfit72",DoubleToStr(u5,0),ColorOnSign(u5),eiX2Row,eiOffsetY+7*eiStepY); SetLabel("iProfit82",DoubleToStr(u6,0),ColorOnSign(u6),eiX2Row,eiOffsetY+8*eiStepY); SetLabel("iProfit92",DoubleToStr(u7,0),ColorOnSign(u7),eiX2Row,eiOffsetY+9*eiStepY); SetLabel("iProfit02",DoubleToStr(u8,0),ColorOnSign(u8),eiX2Row,eiOffsetY+10*eiStepY); SetLabel("iProfita2",DoubleToStr(u9,0),ColorOnSign(u9),eiX2Row,eiOffsetY+11*eiStepY); SetLabel("iProfit13",DoubleToStr(tp,2),ColorOnSign(tp),eiX3Row,eiOffsetY+1*eiStepY); SetLabel("iProfit23",DoubleToStr(p0,2),ColorOnSign(p0),eiX3Row,eiOffsetY+2*eiStepY); SetLabel("iProfit33",DoubleToStr(p1,2),ColorOnSign(p1),eiX3Row,eiOffsetY+3*eiStepY); SetLabel("iProfit43",DoubleToStr(p2,2),ColorOnSign(p2),eiX3Row,eiOffsetY+4*eiStepY); SetLabel("iProfit53",DoubleToStr(p3,2),ColorOnSign(p3),eiX3Row,eiOffsetY+5*eiStepY); SetLabel("iProfit63",DoubleToStr(p4,2),ColorOnSign(p4),eiX3Row,eiOffsetY+6*eiStepY); SetLabel("iProfit73",DoubleToStr(p5,2),ColorOnSign(p5),eiX3Row,eiOffsetY+7*eiStepY); SetLabel("iProfit83",DoubleToStr(p6,2),ColorOnSign(p6),eiX3Row,eiOffsetY+8*eiStepY); SetLabel("iProfit93",DoubleToStr(p7,2),ColorOnSign(p7),eiX3Row,eiOffsetY+9*eiStepY); SetLabel("iProfit03",DoubleToStr(p8,2),ColorOnSign(p8),eiX3Row,eiOffsetY+10*eiStepY); SetLabel("iProfita3",DoubleToStr(p9,2),ColorOnSign(p9),eiX3Row,eiOffsetY+11*eiStepY); SetLabel("iProfit14",DoubleToStr(tr,2)+" %",ColorOnSign(tr),eiX4Row,eiOffsetY+1*eiStepY); SetLabel("iProfit24",DoubleToStr(r0,2)+" %",ColorOnSign(r0),eiX4Row,eiOffsetY+2*eiStepY); SetLabel("iProfit34",DoubleToStr(r1,2)+" %",ColorOnSign(r1),eiX4Row,eiOffsetY+3*eiStepY); SetLabel("iProfit44",DoubleToStr(r2,2)+" %",ColorOnSign(r2),eiX4Row,eiOffsetY+4*eiStepY); SetLabel("iProfit54",DoubleToStr(r3,2)+" %",ColorOnSign(r3),eiX4Row,eiOffsetY+5*eiStepY); SetLabel("iProfit64",DoubleToStr(r4,2)+" %",ColorOnSign(r4),eiX4Row,eiOffsetY+6*eiStepY); SetLabel("iProfit74",DoubleToStr(r5,2)+" %",ColorOnSign(r5),eiX4Row,eiOffsetY+7*eiStepY); SetLabel("iProfit84",DoubleToStr(r6,2)+" %",ColorOnSign(r6),eiX4Row,eiOffsetY+8*eiStepY); SetLabel("iProfit94",DoubleToStr(r7,2)+" %",ColorOnSign(r7),eiX4Row,eiOffsetY+9*eiStepY); SetLabel("iProfit04",DoubleToStr(r8,2)+" %",ColorOnSign(r8),eiX4Row,eiOffsetY+10*eiStepY); SetLabel("iProfita4",DoubleToStr(r9,2)+" %",ColorOnSign(r9),eiX4Row,eiOffsetY+11*eiStepY); Comment("Процент прибыли относительно баланса "+st); } //+----------------------------------------------------------------------------+ //| Возвращает цвет по знаку числа | //+----------------------------------------------------------------------------+ color ColorOnSign(double nu) { color lcColor=ecText; if(nu>0) lcColor=ecProfit; if(nu<0) lcColor=ecLoss; return(lcColor); } //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 12.05.2008 | //| Описание : Возвращает дату начала квартала | //+----------------------------------------------------------------------------+ //| Параметры: | //| (-2 - позапрошлый) | //| (-1 - прошлый) | //| no - номер квартала ( 0 - текущий) | //| ( 1 - следующий) | //| ( 2 - последующий) | //+----------------------------------------------------------------------------+ datetime DateBeginQuarter(int nk=0) { int ye=Year()-MathFloor(nk/4); nk=MathMod(nk,4); int mo=Month()-MathMod(Month()+2,3)+3*nk; if(mo<1) { mo+=12; ye--; } if(mo>12) { mo-=12; ye++; } return(StrToTime(ye+"."+mo+".01")); } //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 12.05.2008 | //| Описание : Возвращает дату понедельника | //+----------------------------------------------------------------------------+ //| Параметры: | //| (-2 - позатой недели) | //| (-1 - прошлой недели) | //| no - номер понедельника ( 0 - текущей недели) | //| ( 1 - следующий, ближайший будущий) | //| ( 2 - последующий) | //+----------------------------------------------------------------------------+ datetime DateOfMonday(int no=0) { datetime dt=StrToTime(TimeToStr(TimeCurrent(),TIME_DATE)); while(TimeDayOfWeek(dt)!=1) dt-=24*60*60; dt+=no*7*24*60*60; return(dt); } //+----------------------------------------------------------------------------+ //| Удаление объектов. | //+----------------------------------------------------------------------------+ void DeleteObjects() { string st="iProfit"; int i,j; for(i=0; i<10; i++) { for(j=1; j<8; j++) ObjectDelete(st+i+j); } for(i=1; i<5; i++) ObjectDelete("iProfita"+i); } //+----------------------------------------------------------------------------+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru | //+----------------------------------------------------------------------------+ //| Версия : 30.04.2010 | //| Описание : Возвращает суммарный профит в валюте депозита | //| закрытых с определённой даты позиций | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //| dt - Дата и время в секундах с 1970 года ( 0 - с начала истории) | //+----------------------------------------------------------------------------+ double GetChangeBalance(string sy="",int op=-1,int mn=-1,datetime dt=0) { double p=0; int i,k=OrdersHistoryTotal(); if(sy=="0") sy=Symbol(); for(i=0; i