i-Profit_001
Download scriptThis script is a specialized dashboard tool designed to provide traders with a comprehensive visual summary of their account performance. Instead of requiring users to manually dig through trade histories or calculate complex figures, it automatically gathers and displays profit data across various timeframes directly on the trading chart.
Core Functionality
The primary logic of the script revolves around identifying historical "cut-off" points in time—such as the start of the current day, week, month, quarter, or year. It then scans your account's closed trade history to aggregate all profits (including commissions and swaps) that occurred between those specific dates.
Key Features
- Multi-Timeframe Tracking: The tool calculates and displays profit figures for:
- Today’s performance.
- The previous day, several days ago, and the current week.
- Monthly, quarterly, and yearly totals.
- Dynamic Percentage Calculations: Beyond just showing raw currency values, the script can calculate your return on investment as a percentage. Users can choose the "base" for this calculation (e.g., calculating profit relative to your current balance, the balance at the start of the day, the start of the week, etc.).
- Visual Color Coding: To allow for quick "at-a-glance" monitoring, the script uses automated color signaling. Profit figures are displayed in green, while losses are highlighted in red, making it immediately obvious whether a specific period was successful or not.
- Customizable On-Screen Dashboard: The layout of the information is organized into a clean list on your chart. It includes customizable settings for:
- Text Positioning: Adjusting the horizontal and vertical placement of the data.
- Visual Styling: Changing text colors and spacing to ensure the dashboard fits perfectly with your trading workspace layout.
User Experience
For a trader, this means having a "live scoreboard" on their screen. It removes the guesswork from performance tracking by providing a structured view of how much money has been made or lost over different horizons, helping to maintain a clearer perspective on long-term trading goals versus short-term daily fluctuations.
//+----------------------------------------------------------------------------+
//| i-Profit.mq4 |
//| |
//| Êèì Èãîðü Â. aka KimIV |
//| http://www.kimiv.ru |
//| |
//| 12.05.2008 Èíäèêàòîð: |
//| - òåêóùåé ïðèáûëè |
//| - ïðèáûëè çà ñåãîäíÿ |
//| - ïðèáûëè çà â÷åðà |
//| - ïðèáûëè çà íåñêîëüêî ïðîøåäøèõ äíåé |
//| - ïðèáûëè çà òåêóùóþ íåäåëþ |
//| - ïðèáûëè çà òåêóùèé ìåñÿö |
//| - ïðèáûëè çà òåêóùèé êâàðòàë |
//| - ïðèáûëè çà òåêóùèé ãîä |
//+----------------------------------------------------------------------------+
#property copyright "Êèì Èãîðü Â. aka KimIV"
#property link "http://www.kimiv.ru"
#property indicator_chart_window
//------- Âíåøíèå ïàðàìåòðû èíäèêàòîðà ----------------------------------------+
extern int eiPercent = 5; // Ðàñ÷¸ò ïðîöåíòà ïðèáûëè îòíîñèòåëüíî:
// 0 - òåêóùåãî áàëàíñà
// 1 - áàëàíñà íà íà÷àëî äíÿ
// 2 - áàëàíñà íà íà÷àëî íåäåëè
// 3 - áàëàíñà íà íà÷àëî ìåñÿöà
// 4 - áàëàíñà íà íà÷àëî êâàðòàëà
// 5 - áàëàíñà íà íà÷àëî ãîäà
extern int eiOffsetY = 30; // Ñìåùåíèå òåêñòà ïî âåðòèêàëè
extern int eiStepY = 12; // Øàã ñìåùåíèÿ òåêñòà ïî âåðòèêàëè
extern int eiX1Row = 3; // Êîîðäèíàòà X ïåðâîé êîëîíêè
extern int eiX2Row = 165; // Êîîðäèíàòà X âòîðîé êîëîíêè
extern int eiX3Row = 240; // Êîîðäèíàòà 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;
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");
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);
string st;
switch (eiPercent) {
case 0 : st="òåêóùåãî" ; break;
case 1 : tb-=p0; st="íà íà÷àëî äíÿ" ; break;
case 2 : tb-=p5; st="íà íà÷àëî íåäåëè" ; break;
case 3 : tb-=p6; st="íà íà÷àëî ìåñÿöà" ; break;
case 4 : tb-=p7; st="íà íà÷àëî êâàðòàëà"; break;
default: tb-=p8; st="íà íà÷àëî ãîäà" ; 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;
SetLabel("iProfit11", "Òåêóùàÿ ïðèáûëü", ecText, eiX1Row, eiOffsetY);
SetLabel("iProfit21", "Ïðèáûëü çà ñåãîäíÿ", ecText, eiX1Row, eiOffsetY+eiStepY);
SetLabel("iProfit31", "Ïðèáûëü çà "+TimeToStr(d1, TIME_DATE), ecText, eiX1Row, eiOffsetY+2*eiStepY);
SetLabel("iProfit41", "Ïðèáûëü çà "+TimeToStr(d2, TIME_DATE), ecText, eiX1Row, eiOffsetY+3*eiStepY);
SetLabel("iProfit51", "Ïðèáûëü çà "+TimeToStr(d3, TIME_DATE), ecText, eiX1Row, eiOffsetY+4*eiStepY);
SetLabel("iProfit61", "Ïðèáûëü çà "+TimeToStr(d4, TIME_DATE), ecText, eiX1Row, eiOffsetY+5*eiStepY);
SetLabel("iProfit71", "Ïðèáûëü çà íåäåëþ", ecText, eiX1Row, eiOffsetY+6*eiStepY);
SetLabel("iProfit81", "Ïðèáûëü çà ìåñÿö", ecText, eiX1Row, eiOffsetY+7*eiStepY);
SetLabel("iProfit91", "Ïðèáûëü çà êâàðòàë", ecText, eiX1Row, eiOffsetY+8*eiStepY);
SetLabel("iProfit01", "Ïðèáûëü çà ãîä", ecText, eiX1Row, eiOffsetY+9*eiStepY);
SetLabel("iProfit12", DoubleToStr(tp, 2), ColorOnSign(tp), eiX2Row, eiOffsetY);
SetLabel("iProfit22", DoubleToStr(p0, 2), ColorOnSign(p0), eiX2Row, eiOffsetY+eiStepY);
SetLabel("iProfit32", DoubleToStr(p1, 2), ColorOnSign(p1), eiX2Row, eiOffsetY+2*eiStepY);
SetLabel("iProfit42", DoubleToStr(p2, 2), ColorOnSign(p2), eiX2Row, eiOffsetY+3*eiStepY);
SetLabel("iProfit52", DoubleToStr(p3, 2), ColorOnSign(p3), eiX2Row, eiOffsetY+4*eiStepY);
SetLabel("iProfit62", DoubleToStr(p4, 2), ColorOnSign(p4), eiX2Row, eiOffsetY+5*eiStepY);
SetLabel("iProfit72", DoubleToStr(p5, 2), ColorOnSign(p5), eiX2Row, eiOffsetY+6*eiStepY);
SetLabel("iProfit82", DoubleToStr(p6, 2), ColorOnSign(p6), eiX2Row, eiOffsetY+7*eiStepY);
SetLabel("iProfit92", DoubleToStr(p7, 2), ColorOnSign(p7), eiX2Row, eiOffsetY+8*eiStepY);
SetLabel("iProfit02", DoubleToStr(p8, 2), ColorOnSign(p8), eiX2Row, eiOffsetY+9*eiStepY);
SetLabel("iProfit13", DoubleToStr(tr, 2)+" %", ColorOnSign(tr), eiX3Row, eiOffsetY);
SetLabel("iProfit23", DoubleToStr(r0, 2)+" %", ColorOnSign(r0), eiX3Row, eiOffsetY+eiStepY);
SetLabel("iProfit33", DoubleToStr(r1, 2)+" %", ColorOnSign(r1), eiX3Row, eiOffsetY+2*eiStepY);
SetLabel("iProfit43", DoubleToStr(r2, 2)+" %", ColorOnSign(r2), eiX3Row, eiOffsetY+3*eiStepY);
SetLabel("iProfit53", DoubleToStr(r3, 2)+" %", ColorOnSign(r3), eiX3Row, eiOffsetY+4*eiStepY);
SetLabel("iProfit63", DoubleToStr(r4, 2)+" %", ColorOnSign(r4), eiX3Row, eiOffsetY+5*eiStepY);
SetLabel("iProfit73", DoubleToStr(r5, 2)+" %", ColorOnSign(r5), eiX3Row, eiOffsetY+6*eiStepY);
SetLabel("iProfit83", DoubleToStr(r6, 2)+" %", ColorOnSign(r6), eiX3Row, eiOffsetY+7*eiStepY);
SetLabel("iProfit93", DoubleToStr(r7, 2)+" %", ColorOnSign(r7), eiX3Row, eiOffsetY+8*eiStepY);
SetLabel("iProfit03", DoubleToStr(r8, 2)+" %", ColorOnSign(r8), eiX3Row, eiOffsetY+9*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<4; j++) ObjectDelete(st+i+j);
}
}
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 19.02.2008 |
//| Îïèñàíèå : Âîçâðàùàåò ñóììàðíûé ïðîôèò â âàëþòå äåïîçèòà |
//| çàêðûòûõ ñ îïðåäåë¸ííîé äàòû ïîçèöèé |
//+----------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| sy - íàèìåíîâàíèå èíñòðóìåíòà ("" - ëþáîé ñèìâîë, |
//| NULL - òåêóùèé ñèìâîë) |
//| op - îïåðàöèÿ (-1 - ëþáàÿ ïîçèöèÿ) |
//| mn - MagicNumber (-1 - ëþáîé ìàãèê) |
//| dt - Äàòà è âðåìÿ â ñåêóíäàõ ñ 1970 ãîäà ( 0 - ñ íà÷àëà èñòîðèè) |
//+----------------------------------------------------------------------------+
double GetProfitFromDateInCurrency(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<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
if (dt<OrderCloseTime()) {
p+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
}
}
}
return(p);
}
//+----------------------------------------------------------------------------+
//| Àâòîð : Êèì Èãîðü Â. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Âåðñèÿ : 12.10.2007 |
//| Îïèñàíèå : Óñòàíîâêà òåêñòîâîé ìåòêè |
//+----------------------------------------------------------------------------+
//| Ïàðàìåòðû: |
//| nm - íàèìåíîâàíèå îáúåêòà |
//| tx - òåêñò |
//| cl - öâåò ìåòêè |
//| xd - êîîðäèíàòà X â ïèêñåëàõ |
//| yd - êîîðäèíàòà Y â ïèêñåëàõ |
//| cr - íîìåð óãëà ïðèâÿçêè (0 - ëåâûé âåðõíèé) |
//| fs - ðàçìåð øðèôòà (8 - ïî óìîë÷àíèþ) |
//+----------------------------------------------------------------------------+
void SetLabel(string nm, string tx, color cl, int xd, int yd, int cr=0, int fs=9) {
if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_LABEL, 0, 0,0);
ObjectSetText(nm, tx, fs);
ObjectSet(nm, OBJPROP_COLOR , cl);
ObjectSet(nm, OBJPROP_XDISTANCE, xd);
ObjectSet(nm, OBJPROP_YDISTANCE, yd);
ObjectSet(nm, OBJPROP_CORNER , cr);
ObjectSet(nm, OBJPROP_FONTSIZE , fs);
}
//+----------------------------------------------------------------------------+
Comments