informer_v4

Download script
Author: Copyright � 2009, Maxim `ax` Sviridov
informer_v4

This script is designed as a visual dashboard and trade history tracker for the MetaTrader 4 platform. It provides traders with a real-time overview of their account health and a clear visual map of their past and current trading activity directly on the price chart.

Account Statistics Dashboard

The primary function of this tool is to display a comprehensive summary of your trading account in a dedicated corner of the screen. Instead of having to navigate through different menus, you can see the following data at a glance:

  • Core Account Info: Displays your account number, current currency, and leverage.
  • Financial Overview: Shows your current Deposit, Balance, Equity, and Margin.
  • Profit & Loss Tracking: Calculates your net profit/loss (including swaps and commissions) and displays these values in both absolute numbers and percentages.
  • Performance Metrics: It specifically calculates "Withdrawals" and "Equity-Balance" differences, providing a clearer picture of your actual trading growth compared to your initial capital.

Visual Trade Mapping

The script adds a layer of visual information to the price chart by identifying where trades were opened, closed, and what their targets were. This helps in analyzing trade behavior over time.

  • Historical Trade Markers: It scans your past history and places markers on the chart. It draws a dotted line connecting the entry and exit points of every completed trade.
    • Profit Lines: These appear in a distinct color (Lime) when a trade was closed for a gain.
    • Loss Lines: These appear in a different color (Red) when a trade was closed at a loss.
  • Live Position Tracking: If enabled, the script identifies your currently open trades and places markers showing your entry price, as well as your active Take Profit (TP) and Stop Loss (SL) levels. This allows you to see your "active" risk visually on the chart.

Smart Filtering & Customization

To keep the chart clean and relevant to your specific strategy, the script includes several "smart" features:

  • Magic Number Filter: You can specify certain "Magic Numbers." The script will then only display markers and statistics for trades associated with those specific numbers, effectively ignoring other automated systems or manual trades you might not want to see.
  • Symbol Filtering: The tool automatically filters the data so that it only displays information for the specific currency pair or asset you are currently viewing on your chart.
  • Visual Formatting: The script includes customizable settings for text size, colors, and decimal lengths, ensuring the dashboard fits perfectly with your personal aesthetic and readability preferences.
  • Automatic Cleanup: When the indicator is removed from the chart, it includes a cleanup routine that deletes all the drawn lines, arrows, and labels, leaving your chart exactly as it was before.
Orders Execution
Checks for the total of closed ordersChecks for the total of open orders
4 Views
0 Downloads
0 Favorites
informer_v4
//+----------------------------------------------------------------------------+
//|                                                               èíôîðìåð.mq4 |
//|                                      Copyright © 2009, Maxim `ax` Sviridov |
//|                                                 http://ax.tm3912.ru/trade/ |
//|                                                                            |
//| 13.11.2009 Ïîôèêñåíà îøèáêà "zero divide", íåáîëüøàÿ îïòèìèçàöèÿ           | 
//| 30.12.2009 Ìåòêè äëÿ íåçàêðûòûõ ïîçèöèé, ìàãèê-ôèëüòð, óðîâíè TP&SL        |
//|            êîððåêòíîå óäàëåíèå îáúåêòîâ èíäèêàòîðà                         |
//| 07.01.2010 ßçûê Englesh or not (Russian)                                   |
//+----------------------------------------------------------------------------+
#property copyright "Copyright © 2009, Maxim `ax` Sviridov"
#property link      "http://ax.tm3912.ru/trade/"

extern bool   Lang_Eng       = True;   // Englesh or not (Russian)

extern bool   DealMarkers    = True;    // Ðàçìå÷àòü ñäåëêè íà ãðàôèêå èëè íåò
extern bool   DepoStats      = True;    // Îòîáðàæàòü ñòàòèñòèêó ñ÷¸òà
extern bool   ShowLive		  = True;	 // Ïîêàçûâàòü öåíîâûå ìåòêè íà íåçàêðûòûå ïîçèöèè èëè íåò

extern string MagicFilter	  = "";		//	Åñëè çäåñü ïåðå÷èñëèòü MagicNumber (÷åðåç çàïÿòóþ, áåç ïðîáåëîâ)
													//	òî áóäóò îòîáðàæàòüñÿ òîëüêî ñäåëêè ñ ýòèìè ìýäæèêàìè

extern color  clAccName      = Silver;  // Öâåò ïîäïèñè èìåíè âëàäàëüöà àêêàóíòà
extern color  clInfData      = Gray;    // Öâåò ïîäïèñåé ðàçíûõ äàííûõ î ñ÷¸òå
extern int    FontSize       = 8;       // Ðàçìåð øðèôòà
extern int    DigitsLength   = 9;       // Äëèííà äåíåæíûõ öûôð (äëÿ âûðàâíèâàíèÿ) 
extern int    PercentLength  = 5;       // Äëèííà ïðîöåíòíûõ öûôð (äëÿ âûðàâíèâàíèÿ) 


extern color  clLineProfit   = Lime;    // Öâåò ïðèáûëüíûõ ëèíèé
extern color  clLineLoss     = Red;     // Öâåò óáûòî÷íûõ ëèíèé

extern color  clMarkerBuy    = Lime;    // Öâåò ìåòêè ïîêóïêè
extern color  clMarkerSell   = Red;     // Öâåò ìåòêè ïðîäàæè
extern color  clMarkerClose  = Silver;  // Öâåò ìåòêè çàêðûòèÿ îðäåðà


//------- Ãëîáàëüíûå ïåðåìåííûå -----------------------------------------------+

int      X,Y;           // íà÷àëüíûå êîîðäèíàòû
int      i;             // ñ÷¸ò÷èê
int      inf_count;     // êîëè÷åñòâî èíôî-áëîêîâ
string   inf_name[10];  // Ìàññèâ èì¸í èíôî-áëîêîâ
string   inf_data[10];  // Ìàññèâ çíà÷åíèé èíôî-áëîêîâ

int      maxLengthN, maxLengthD;     // Ìàêñèìàëüíàÿ äëèííà (äëÿ âûðàâíèâàíèÿ òåêñòà)
string   accName;                    // Èìÿ àêêàóíòà



#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
   X = 10;
   Y = 35;
   inf_count  = 8;            // Ñ÷¸ò, Äåïî, Áàëàíñ, Ïðèáûëü, Ñíÿòèå, Çàëîã, Ïîçèöèÿ, Ñðåäñòâà
   maxLengthN = 13; 
   maxLengthD = 18+(DigitsLength-6); 
   
   for(i=0; i<=inf_count-1; i++) {inf_name[i]="";inf_data[i]="";}
 
   if (Lang_Eng){
      inf_name[0] = "Account ¹: ";
      inf_name[1] = "Deposit: ";
      inf_name[2] = "Balance: ";
      inf_name[3] = "Profit: ";
      inf_name[4] = "Withdraw: ";
      inf_name[5] = "Margin: ";
      inf_name[6] = "Equity-Balance: ";
      inf_name[7] = "Equity: ";
   }else{  
      inf_name[0] = "Ñ÷¸ò ¹: ";
      inf_name[1] = "Äåïîçèò: ";
      inf_name[2] = "Áàëàíñ: ";
      inf_name[3] = "Ïðèáûëü: ";
      inf_name[4] = "Ñíÿòèå: ";
      inf_name[5] = "Çàëîã: ";
      inf_name[6] = "Ïîçèöèÿ: ";
      inf_name[7] = "Ñðåäñòâà: ";
   }

	if(MagicFilter != "") MagicFilter = "," + MagicFilter + ",";

   return(0);
 }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   // óäàëèì âñå îáúåêòû ñîçäàííûå èíäèêàòîðîì
   DeleteIndObjects();
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
   if(DepoStats)  // Ïîêàçàòü ñòàòèñòèêó ñ÷¸òà
   {
      string accName     = AccountName();
      string accNumber   = AccountNumber();
      string accCurrency = AccountCurrency();
      double accBalance  = AccountBalance();
      double accMargin   = AccountMargin();
      double accEquity   = AccountEquity();
      double accDepo     = Depo();
      double accProfit   = Profit();
      double accWidch    = Widch();
      
      int md = ((maxLengthN + maxLengthD - StringLen(accName))/2) + StringLen(accName);
      while(StringLen(accName) < md ) accName = accName + " ";
      
      
      string sign="";   // çíàê äëÿ èçìåíåíèÿ â ïðîöåíòàõ
      if (accBalance>accDepo) sign = "+";
      
      if(ObjectFind("AccountName")<0)ObjectCreate("AccountName", OBJ_LABEL, 0, 0, 0);
      ObjectSet("AccountName", OBJPROP_CORNER, 1);
      ObjectSetText("AccountName", accName, FontSize, "Lucida Console", clAccName);
      ObjectSet("AccountName", OBJPROP_XDISTANCE, X);
      ObjectSet("AccountName", OBJPROP_YDISTANCE, Y - 15);


      inf_data[0] = RAlignD(accNumber) + " (" + accCurrency + ") 1:" + AccountLeverage();   // Ñ÷¸ò ¹
      inf_data[1] = RAlignD(DoubleToStr(accDepo,2));
      inf_data[2] = RAlignD(DoubleToStr(accBalance, 2));   // Áàëàíñ
      inf_data[3] = RAlignD(DoubleToStr(accProfit,2));
      inf_data[4] = RAlignD(DoubleToStr(accWidch,2));              // Ñíÿòèå
      inf_data[5] = RAlignD(DoubleToStr(accMargin,2));             // Çàëîã
      inf_data[6] = RAlignD(DoubleToStr(accEquity-accBalance,2)) + " | " + RAlignP(DoubleToStr((accEquity/accBalance-1)*100,2)) + "%";  // 
      inf_data[7] = RAlignD(DoubleToStr(accEquity, 2));            // Ýêâèòè

      if(accDepo>0){
         inf_data[2] = inf_data[2] + " | " + RAlignP(sign + DoubleToStr(accProfit/accDepo*100,2)) + "%" ;
         inf_data[7] = inf_data[7] + " | " + RAlignP(DoubleToStr((accEquity/accDepo-1)*100,2)) + "%";
      }
      
      for(i=0; i<=inf_count-1; i++) // Äëÿ âñåõ èíôî-áëîêîâ îáíîâèì çíà÷åíèÿ
      {  
         //if (inf_name[i]=="") continue; // Ïðîïóñòèì ïóñòûå
         while(StringLen(inf_data[i]) < maxLengthD) inf_data[i] = inf_data[i] + " ";
         if(ObjectFind(inf_name[i])<0) ObjectCreate(inf_name[i], OBJ_LABEL, 0, 0, 0);
         ObjectSet(inf_name[i], OBJPROP_CORNER, 1);
         ObjectSetText(inf_name[i], inf_name[i] + inf_data[i], FontSize, "Lucida Console", clInfData);
         ObjectSet(inf_name[i], OBJPROP_XDISTANCE, X);
         ObjectSet(inf_name[i], OBJPROP_YDISTANCE, Y + i*11);
      }
   }
   // Âèçóàëèçàöèÿ ñäåëîê íà ãðàôèêå
   if (DealMarkers || ShowLive){
      datetime ot, ct;
      double   op, cp, tp, sl;
      int      i,  ty, k, iMagicNum;

		if (DealMarkers){
         k=OrdersHistoryTotal();
         for (i=0; i<k; i++){
            if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
		    		if(MagicFilter != "") {
		 	  	     	iMagicNum = OrderMagicNumber();
			   		iMagicNum = StringFind(MagicFilter, "," + iMagicNum + ",");
               }
				  else iMagicNum = 1;
            
              ty=OrderType();
				  if (OrderSymbol()==Symbol() && ty<2 && iMagicNum != -1){
                  ot=OrderOpenTime();
                  op=OrderOpenPrice();
                  ct=OrderCloseTime();
                  cp=OrderClosePrice();
                  SetObj(OrderTicket(), ty, ot, op, ct, cp);
               }
            }
         }
      }
      
		if (ShowLive) {
			k=OrdersTotal();
			for (i=0; i<k; i++) {
				if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
					if(MagicFilter != "") {
						iMagicNum = OrderMagicNumber();
						iMagicNum = StringFind(MagicFilter, "," + iMagicNum + ",");
					}
					else iMagicNum = 1;
					ty=OrderType();
					
					if (OrderSymbol()==Symbol() && ty<2 && iMagicNum != -1){
                  ot=OrderOpenTime();
                  op=OrderOpenPrice();
                  tp=OrderTakeProfit();
                  sl=OrderStopLoss();
						SetObj(OrderTicket(), ty, ot, op, 0, 0, tp, sl);
					}
				}
			}
		}
   }
   return(0);
  }
//+----------------------------------------------------------------------------+

//+----------------------------------------------------------------------------+
string RAlignD(string s="") {
while(StringLen(s) < DigitsLength) s = StringConcatenate(" ", s);
return(s);}
//+----------------------------------------------------------------------------+
string RAlignP(string s="") {
while(StringLen(s) < PercentLength+3) s = StringConcatenate(" ", s);
return(s);}
//+----------------------------------------------------------------------------+
double Depo(){int y=0; double d=0;
for(y=0;y<OrdersHistoryTotal();y++){OrderSelect(y,SELECT_BY_POS,MODE_HISTORY);
if(OrderType()==6 && OrderProfit()>0) d+=OrderProfit();}
return(d);}
//+----------------------------------------------------------------------------+
double Widch(){int y=0; double w=0;
for(y=0;y<OrdersHistoryTotal();y++){OrderSelect(y,SELECT_BY_POS,MODE_HISTORY);
if(OrderType()==6 && OrderProfit()<0) w+=OrderProfit();}
return(w);}
//+----------------------------------------------------------------------------+
double Profit(){int y=0; double p=0;
for(y=0;y<OrdersHistoryTotal();y++){OrderSelect(y,SELECT_BY_POS,MODE_HISTORY);
if(OrderType()<2) p+=OrderProfit()+OrderSwap()+OrderCommission();}
return(p);}
//+----------------------------------------------------------------------------+
//|  SetObj: óñòàíîâêà îáúåêòîâ                                                |
//|  Ïàðàìåòðû:                                                                |
//|    or - íîìåð îáúåêòà                                                      |
//|    ty - îïåðàöèÿ                                                           |
//|    ot - äàòà, âðåìÿ îòêðûòèÿ                                               |
//|    op - öåíà îòêðûòèÿ                                                      |
//|    ct - äàòà, âðåìÿ çàêðûòèÿ                                               |
//|    cp - öåíà çàêðûòèÿ                                                      |
//|    tp - öåíà òåéê-ïðîôèòà                                                  |
//|    sl - öåíà ñòîï-ëîñà                                                     |
//+----------------------------------------------------------------------------+
void SetObj(int or, int ty, datetime ot, double op, datetime ct=0, double cp=0, double tp=0, double sl=0)
{

   datetime tc = TimeCurrent()-(240*Period());
   datetime tf = TimeCurrent()+(600*Period());


   // Ëèíèÿ îò îòêðûòèÿ äî çàêðûòèÿ ñäåëêè
   if (ct!=0)
   {
      string no="Deal";

      if(ObjectFind(no+or)<0) ObjectCreate(no+or, OBJ_TREND, 0, 0, 0, 0, 0);
         ObjectSet(no+or, OBJPROP_STYLE, STYLE_DOT);
         ObjectSet(no+or, OBJPROP_TIME1 , ot);
         ObjectSet(no+or, OBJPROP_PRICE1, op);
         ObjectSet(no+or, OBJPROP_TIME2 , ct);
         ObjectSet(no+or, OBJPROP_PRICE2, cp);
   
      if(ty==OP_BUY){
         if (op<cp) ObjectSet(no+or, OBJPROP_COLOR, clLineProfit);
         if (op>cp) ObjectSet(no+or, OBJPROP_COLOR, clLineLoss);
      }
  
      if(ty==OP_SELL){
         if (op>cp) ObjectSet(no+or, OBJPROP_COLOR, clLineProfit);
         if (op<cp) ObjectSet(no+or, OBJPROP_COLOR, clLineLoss);
      }
      
      ObjectSet(no+or, OBJPROP_RAY , False);
      
      // óäàëÿåì óæå íå íóæíîå
      if (ObjectFind("ADealTP"+or)!=-1)      ObjectDelete("ADealTP"+or);  
      if (ObjectFind("ADealTP-l-"+or)!=-1)   ObjectDelete("ADealTP-l-"+or);  
      if (ObjectFind("ADealSL"+or)!=-1)      ObjectDelete("ADealSL"+or);  
      if (ObjectFind("ADealSL-l-"+or)!=-1)   ObjectDelete("ADealSL-l-"+or);  
    }

   // Ìåòêè îòêðûòèÿ ñäåëîê   
   no="ADealOp";
   if (ObjectFind(no+or)<0) ObjectCreate(no+or, OBJ_ARROW, 0, 0,0); ObjectSet(no+or, OBJPROP_TIME1, ot);
   if (ty==OP_BUY){
      ObjectSet(no+or, OBJPROP_PRICE1   , op);
      ObjectSet(no+or, OBJPROP_COLOR    , clMarkerBuy);
      ObjectSet(no+or, OBJPROP_ARROWCODE, SYMBOL_LEFTPRICE);
   }
   if (ty==OP_SELL){
      ObjectSet(no+or, OBJPROP_PRICE1   , op);
      ObjectSet(no+or, OBJPROP_COLOR    , clMarkerSell);
      ObjectSet(no+or, OBJPROP_ARROWCODE, SYMBOL_LEFTPRICE);
   }

   // Ìåòêè çàêðûòèÿ ñäåëîê   
   if (cp!=0){
      no="ADealCl";
      if (ObjectFind(no+or)<0) ObjectCreate(no+or, OBJ_ARROW, 0, 0,0); ObjectSet(no+or, OBJPROP_TIME1, ct);
      ObjectSet(no+or, OBJPROP_PRICE1  , cp);
      ObjectSet(no+or, OBJPROP_COLOR   , clMarkerClose);
      ObjectSet(no+or, OBJPROP_ARROWCODE, SYMBOL_RIGHTPRICE);
   }
   
   // Ìåòêè òåéê-ïðîôèòà
   if (tp!=0)
   {
      no="ADealTP";
      
      if (ObjectFind(no+or)<0) ObjectCreate(no+or, OBJ_ARROW, 0, 0,0); ObjectSet(no+or, OBJPROP_TIME1, tf);
      ObjectSet(no+or, OBJPROP_PRICE1  , tp);
      ObjectSet(no+or, OBJPROP_COLOR   , clLineProfit);
      ObjectSet(no+or, OBJPROP_ARROWCODE, SYMBOL_RIGHTPRICE);
      
      if(ObjectFind(no+"-l-"+or)<0) ObjectCreate(no+"-l-"+or, OBJ_TREND, 0, 0, 0, 0, 0);
         ObjectSet(no+"-l-"+or, OBJPROP_RAY , False);
         ObjectSet(no+"-l-"+or, OBJPROP_STYLE, STYLE_SOLID);
         ObjectSet(no+"-l-"+or, OBJPROP_TIME1 , tc);
         ObjectSet(no+"-l-"+or, OBJPROP_PRICE1, tp);
         ObjectSet(no+"-l-"+or, OBJPROP_TIME2 , tf+60*Period());
         ObjectSet(no+"-l-"+or, OBJPROP_PRICE2, tp);
         ObjectSet(no+"-l-"+or, OBJPROP_COLOR, clLineProfit);
   } 
   

   // Ìåòêè ñòîï-ëîñà   
   if (sl!=0)
   {
      no="ADealSL";
      
      if (ObjectFind(no+or)<0) ObjectCreate(no+or, OBJ_ARROW, 0, 0,0); ObjectSet(no+or, OBJPROP_TIME1, tf);
      ObjectSet(no+or, OBJPROP_PRICE1  , sl);
      ObjectSet(no+or, OBJPROP_COLOR   , clLineLoss);
      ObjectSet(no+or, OBJPROP_ARROWCODE, SYMBOL_RIGHTPRICE);
      
      if(ObjectFind(no+"-l-"+or)<0) ObjectCreate(no+"-l-"+or, OBJ_TREND, 0, 0, 0, 0, 0);
         ObjectSet(no+"-l-"+or, OBJPROP_RAY , False);
         ObjectSet(no+"-l-"+or, OBJPROP_STYLE, STYLE_SOLID);
         ObjectSet(no+"-l-"+or, OBJPROP_TIME1 , tc);
         ObjectSet(no+"-l-"+or, OBJPROP_PRICE1, sl);
         ObjectSet(no+"-l-"+or, OBJPROP_TIME2 , tf+60*Period());
         ObjectSet(no+"-l-"+or, OBJPROP_PRICE2, sl);
         ObjectSet(no+"-l-"+or, OBJPROP_COLOR, clLineLoss);
   } 
}
//+----------------------------------------------------------------------------+
void DeleteIndObjects()
{
   int ot, iMagicNum;
   
   // Óäàëèòü ñòàò-äàííûå
   ObjectDelete("AccountName");
   for(i=0; i<=inf_count-1; i++) ObjectDelete(inf_name[i]);
   
   // Óäàëèòü ìàðêåðû ïîçèöèé
   if (DealMarkers){
      int i,  ty, k=OrdersHistoryTotal();
      for (i=0; i<k; i++){
         if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)){
            ty=OrderType();
            ot=OrderTicket();
            if (OrderSymbol()==Symbol() && ty<2){
               ObjectDelete("ADealOp"+ot);
               ObjectDelete("ADealCl"+ot);
               ObjectDelete("Deal"+ot);
            }
         }
      }
   }
   
   if (ShowLive){
      if (OrdersTotal()>0){
 			k=OrdersTotal();
			for (i=0; i<k; i++) {
				if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
					if(MagicFilter != "") {
						iMagicNum = OrderMagicNumber();
						iMagicNum = StringFind(MagicFilter, "," + iMagicNum + ",");
					}
					else iMagicNum = 1;
					ty=OrderType();
					ot=OrderTicket();
					if (OrderSymbol()==Symbol() && ty<2 && iMagicNum != -1){
                  ObjectDelete("ADealOp"+ot);
                  ObjectDelete("ADealTP"+ot);
                  ObjectDelete("ADealTP-l-"+ot);
                  ObjectDelete("ADealSL"+ot);
                  ObjectDelete("ADealSL-l-"+ot);
					}
				}
			}
      }
   }
}

Comments