informer_v4
Download scriptThis 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.
//+----------------------------------------------------------------------------+
//| èíôîðìåð.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