infoboard
Download scriptThis script functions as a comprehensive, real-time information dashboard (an "Infoboard") designed to be displayed directly on your trading charts. Instead of cluttering your screen with multiple separate windows, it consolidates essential market data into a single, organized visual panel.
The logic follows these primary functional areas:
Visual Presentation and Customization
The script is designed for high visibility and flexibility. It allows you to:
- Positioning: Choose which corner of the chart the dashboard appears in and adjust its spacing from the edges.
- Layering: It includes a feature to automatically push other chart objects (like trendlines or indicators) into the background, ensuring the dashboard remains readable on top of your analysis.
- Styling: You can customize the colors for different data points—specifically using different colors to represent "Up" movements (Green), "Neutral/Middle" prices (Yellow), and "Down" movements (Red).
Real-Time Market Data Monitoring
The dashboard tracks and displays a wide variety of live metrics, which you can toggle on or off individually:
- Core Basics: It shows the current trading symbol, the timeframe you are viewing, the current bid price, and the current spread.
- Dynamic Updates: The price and spread values are "intelligent." They change color instantly based on whether the price is moving up or down compared to the previous tick.
- Time Tracking: It displays a live countdown of the remaining time until the current candle closes, alongside a flashing "Tick" indicator to confirm that the market is active and data is flowing.
Advanced Technical Analytics
Beyond basic prices, the script performs several automated calculations to help with deeper analysis:
- Fractal Trend Analysis: This section scans multiple timeframes simultaneously (from 1 minute to Daily) to identify recent "fractals" (highs and lows). It then compares the current market price against these levels, changing segments to different colors to show if the price is currently above, below, or within those historical ranges.
- Volatility & Range Metrics: It calculates the Average True Range (ATR) over a user-defined period (e.g., 100 days) and compares it against today's High/Low range.
- Comparative Ratios: It can calculate the "ATR to Spread Ratio," which helps traders understand how much "room" there is to move compared to the cost of entering a trade.
- Account & Execution Details: The dashboard can display specific broker data, including the value of a single tick in your account currency, the minimum stop level required by the broker, and the overnight swap rates for both long and short positions.
Automatic Maintenance
To ensure the platform remains clean, the script includes a "cleanup" logic. Every time you remove the indicator or restart the platform, it automatically detects and deletes all visual elements created by the dashboard, ensuring no "ghost" objects are left behind on your charts.
//+------------------------------------------------------------------+
//| Infoboard.mq4 |
//| Copyright © 2014, TrueTL |
//| http://www.truetl.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2014, TrueTL"
#property link "http://www.truetl.com"
#property indicator_chart_window
#import "user32.dll"
int PostMessageW(int hWnd,int Msg,int wParam,int lParam);
int RegisterWindowMessageW(string lpString);
#import
extern string Version_140="www.truetl.com";
extern int Corner=1;
extern int Offset_X = 1;
extern int Offset_Y = 21;
extern bool All_Other_Objects_To_Background=true;
extern int Days_For_ATR=100;
extern bool Show_Symbol_and_Timeframe=1;
extern bool Show_Price_and_Spread=1;
extern bool Show_Time_and_Tick = 1;
extern bool Show_Fractal_Trend = 1;
extern bool Show_Average_Hi_Lo = 1;
extern bool Show_Today_Hi_Lo=1;
extern bool Show_Hi_Lo_to_Spread=1;
extern bool Show_Current_Bar_Hi_Lo=1;
extern bool Show_Previous_Bar_Hi_Lo=1;
extern bool Show_Tickvalue = 1;
extern bool Show_Stoplevel = 1;
extern bool Show_Swap=1;
extern color Background_Color=C'40,40,40';
extern color Text_Color=C'220,220,220';
extern color Text_Label_Color=C'120,120,120';
extern color Up_Color=Green;
extern color Middle_Color=Yellow;
extern color Down_Color=Red;
double old_price,old_spread;
string timeframe;
string tick="n";
int di,po,ti;
string info_font="Verdana";
int info_fontsize=8;
int tf[]={1,5,15,30,60,240,1440};
string tf_label[]={"M1","M5","M15","M30","H1","H4","D1"};
int tf_lab_ofset[]={4,4,2,2,4,4,4};
int xp[4],yo[10],lo[3];
int x,y,ofs_sema=23;;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int init()
{
int ylen=3;
int TitleX,TitleY,WebX,WebY,extend_board,offset_col;
int symlen=StringLen(Symbol());
if(All_Other_Objects_To_Background)
{
int hwnd=WindowHandle(Symbol(),Period());
int msg=RegisterWindowMessageW("MetaTrader4_Internal_Message");
PostMessageW(hwnd,msg,2,1);
}
if(Show_Symbol_and_Timeframe)
{
if(symlen>7)
{
extend_board=symlen-6;
offset_col=symlen*5;
}
ylen+=3;
}
if(Show_Price_and_Spread) ylen+=3;
if(Show_Time_and_Tick) ylen+=3;
if(Show_Fractal_Trend) ylen+=4;
if(Show_Average_Hi_Lo) ylen+=1;
if(Show_Today_Hi_Lo) ylen+=1;
if(Show_Hi_Lo_to_Spread) ylen+=1;
if(Show_Current_Bar_Hi_Lo) ylen+=1;
if(Show_Previous_Bar_Hi_Lo) ylen+=1;
if(Show_Tickvalue) ylen+=1;
if(Show_Stoplevel) ylen+=1;
if(Show_Swap) ylen+=2;
if(Corner>3) Corner=1;
switch(Corner)
{
case 0: x = Offset_X;
y = Offset_Y;
TitleX = x+42;
TitleY = y+3;
WebX = x+60;
WebY = y+21;
xp[0] = x+132+offset_col;
xp[1] = x+10;
xp[2] = x+10;
xp[3] = x+123;
yo[0] = y+40;
yo[1] = 14;
yo[2] = 26;
yo[3] = 6;
yo[4] = 0;
yo[5] = 10;
yo[6] = 14;
yo[7] = 24;
yo[8] = 45;
yo[9] = 14;
lo[0] = -32;
lo[1] = -28;
lo[2] = 10;
CreateBox("XBoard_Main",x,y,14+extend_board,ylen);
break;
case 1: x = Offset_X;
y = Offset_Y;
TitleX = x+42;
TitleY = y+3;
WebX = x+60;
WebY = y+21;
xp[0] = x+10;
xp[1] = x+80;
xp[2] = x+74;
xp[3] = x+10;
yo[0] = y+40;
yo[1] = 14;
yo[2] = 26;
yo[3] = 6;
yo[4] = 0;
yo[5] = 10;
yo[6] = 14;
yo[7] = 24;
yo[8] = 45;
yo[9] = 14;
lo[0] = -32;
lo[1] = -28;
lo[2] = 10;
CreateBox("XBoard_Main",x,y,14+extend_board,ylen);
ArraySetAsSeries(tf,true);
ArraySetAsSeries(tf_label,true);
ArraySetAsSeries(tf_lab_ofset,true);
break;
case 2: x = Offset_X;
y = Offset_Y-(25-ylen)*14;
TitleX = x+42;
TitleY = y+3+330;
WebX = x+60;
WebY = y+325;
xp[0] = x+132+offset_col;
xp[1] = x+10;
xp[2] = x+10;
xp[3] = x+123;
yo[0] = y+295;
yo[1] = -30;
yo[2] = -10;
yo[3] = 9;
yo[4] = 12;
yo[5] = -29;
yo[6] = -300;
yo[7] = -4;
yo[8] = -28;
yo[9] = -14;
lo[0] = 24;
lo[1] = 22;
lo[2] = -11;
CreateBox("XBoard_Main",x,y+(25-ylen)*14,14+extend_board,ylen);
break;
case 3: x = Offset_X;
y = Offset_Y-(25-ylen)*14;
TitleX = x+42;
TitleY = y+3+330;
WebX = x+60;
WebY = y+325;
xp[0] = x+10;
xp[1] = x+80;
xp[2] = x+75;
xp[3] = x+10;
yo[0] = y+295;
yo[1] = -30;
yo[2] = -10;
yo[3] = 9;
yo[4] = 12;
yo[5] = -29;
yo[6] = -300;
yo[7] = -4;
yo[8] = -28;
yo[9] = -14;
lo[0] = 24;
lo[1] = 22;
lo[2] = -11;
CreateBox("XBoard_Main",x,y+(25-ylen)*14,14+extend_board,ylen);
ArraySetAsSeries(tf,true);
ArraySetAsSeries(tf_label,true);
ArraySetAsSeries(tf_lab_ofset,true);
break;
}
switch(Period())
{
case 1 : timeframe = "M1"; break;
case 5 : timeframe = "M5"; break;
case 15 : timeframe = "M15"; break;
case 30 : timeframe = "M30"; break;
case 60 : timeframe = "H1"; break;
case 240 : timeframe = "H4"; break;
case 1440 : timeframe = "D1"; break;
case 10080 : timeframe = "W1"; break;
case 43200 : timeframe = "MN1"; break;
default : timeframe = Period()+" Min"; break;
}
switch(Digits)
{
case 0: di = 0; po = 1; ti = 1; break;
case 1: di = 1; po = 1; ti = 10; break;
case 2: di = 0; po = 100; ti = 1; break;
case 3: di = 1; po = 100; ti = 10; break;
case 4: di = 0; po = 10000; ti = 1; break;
case 5: di = 1; po = 10000; ti = 10; break;
default: di= Digits;
}
CreateText("XBoard_Title",TitleX,TitleY,"INFOBOARD",11,"Arial Black",Text_Color);
CreateText("XBoard_Web",WebX,WebY,"www.truetl.com",7,"Arial",Text_Color);
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int deinit()
{
for(int i=ObjectsTotal(); i>=0; i--)
{
if(StringSubstr(ObjectName(i),0,7)=="XBoard_")
{
ObjectDelete(ObjectName(i));
}
}
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int i,c,a;
double uplevel,dolevel,new_price,new_spread,avg;
if(All_Other_Objects_To_Background)
{
for(i=ObjectsTotal(); i>=0; i--)
{
if(StringSubstr(ObjectName(i),0,7)!="XBoard_")
{
ObjectSet(ObjectName(i),OBJPROP_BACK,1);
}
}
}
y=yo[0];
for(a=1; a<11; a++) CreateText("XBoard_Line1"+"_"+a,a*16+x-3,y+lo[0],"_",20,"Verdana",Text_Label_Color);
if(Show_Symbol_and_Timeframe)
{
CreateText("XBoard_Tf",xp[0],y,timeframe,16,"Verdana",Text_Color);
CreateText("XBoard_Symbol",xp[1],y,Symbol(),16,"Verdana",Text_Color);
y+=yo[2];
CreateText("XBoard_Tf_label",xp[0],y,"TF",6,"Verdana",Text_Label_Color);
CreateText("XBoard_Symbol_label",xp[1],y,"SYMBOL",6,"Verdana",Text_Label_Color);
y+=yo[1];
}
if(Show_Price_and_Spread)
{
new_price=Bid;
if(old_price<new_price)
{
CreateText("XBoard_Price",xp[1],y,DoubleToStr(new_price,Digits),16,"Verdana",Up_Color);
} else if(old_price>new_price) {
CreateText("XBoard_Price",xp[1],y,DoubleToStr(new_price,Digits),16,"Verdana",Down_Color);
} else {
CreateText("XBoard_Price",xp[1],y,DoubleToStr(new_price,Digits),16,"Verdana",Middle_Color);
}
old_price=new_price;
new_spread=(Ask-Bid)*po;
if(old_spread<new_spread)
{
CreateText("XBoard_Spread",xp[0],y,DoubleToStr(new_spread,di),16,"Verdana",Up_Color);
} else if(old_spread>new_spread) {
CreateText("XBoard_Spread",xp[0],y,DoubleToStr(new_spread,di),16,"Verdana",Down_Color);
} else {
CreateText("XBoard_Spread",xp[0],y,DoubleToStr(new_spread,di),16,"Verdana",Middle_Color);
}
old_spread=new_spread;
y+=yo[2];
CreateText("XBoard_Spread_label",xp[0],y,"SPREAD",6,"Verdana",Text_Label_Color);
CreateText("XBoard_Price_label",xp[1],y,"BID PRICE",6,"Verdana",Text_Label_Color);
y+=yo[1];
}
if(Show_Time_and_Tick)
{
CreateText("XBoard_Tick",xp[0],y,tick,18,"Wingdings",Text_Color);
datetime closetime=Time[0]+(Time[0]-Time[1])-TimeCurrent();
string TimeRemain = TimeToStr(closetime,TIME_SECONDS);
if(TimeRemain=="invalid time" || StringFind(TimeRemain,"-",0)>=0 || StringLen(TimeRemain)==0 || TimeRemain==" ")
{
TimeRemain= "Waiting...";
}
CreateText("XBoard_Time",xp[1],y,TimeRemain,16,"Verdana",Text_Color);
if(tick=="n")
{
tick= "o";
} else {
tick="n";
}
y+=yo[2];
CreateText("XBoard_Tick_label",xp[0],y,"TICK",6,"Verdana",Text_Label_Color);
CreateText("XBoard_Time_label",xp[1],y,"TIME REMAIN",6,"Verdana",Text_Label_Color);
y+=yo[1];
}
if(Show_Symbol_and_Timeframe || Show_Price_and_Spread || Show_Time_and_Tick)
{
for(a=1; a<11; a++) CreateText("XBoard_Line2"+"_"+a,a*16+x-3,y+lo[1],"_",20,"Verdana",Text_Label_Color);
y+=yo[3];
} else {
y+=yo[4];
}
if(Show_Fractal_Trend)
{
CreateText("XBoard_Fractal_label",x+57,y,"FRACTAL TREND",6,"Verdana",Text_Label_Color);
y+=yo[5];
for(i=0; i<7; i++)
{
CreateText("XBoard_Segment_"+i,x+16+ofs_sema*i,y,CharToStr(108),20,"Wingdings",Gray);
CreateText("XBoard_Segment_Label_"+i,x+16+tf_lab_ofset[i]+ofs_sema*i,y+yo[7],tf_label[i],6,"Verdana",Text_Label_Color);
for(c=3; c<200; c++)
{
if(iHigh(Symbol(),tf[i],c) >= iHigh(Symbol(),tf[i],c+1) &&
iHigh(Symbol(),tf[i],c) >= iHigh(Symbol(),tf[i],c+2) &&
iHigh(Symbol(),tf[i],c) >= iHigh(Symbol(),tf[i],c-1) &&
iHigh(Symbol(),tf[i],c) >= iHigh(Symbol(),tf[i],c-2))
break;
}
uplevel=iHigh(Symbol(),tf[i],c);
for(c=3; c<200; c++)
{
if(iLow(Symbol(),tf[i],c) <= iLow(Symbol(),tf[i],c+1) &&
iLow(Symbol(),tf[i],c) <= iLow(Symbol(),tf[i],c+2) &&
iLow(Symbol(),tf[i],c) <= iLow(Symbol(),tf[i],c-1) &&
iLow(Symbol(),tf[i],c) <= iLow(Symbol(),tf[i],c-2))
break;
}
dolevel=iLow(Symbol(),tf[i],c);
if(Bid<dolevel) ObjectSet("XBoard_Segment_"+i,OBJPROP_COLOR,Down_Color);
if(Bid>=dolevel && Bid<=uplevel) ObjectSet("XBoard_Segment_"+i,OBJPROP_COLOR,Middle_Color);
if(Bid>uplevel) ObjectSet("XBoard_Segment_"+i,OBJPROP_COLOR,Up_Color);
}
for(a=1; a<11; a++) CreateText("XBoard_Line3"+"_"+a,a*16+x-3,y+lo[2],"_",20,"Verdana",Text_Label_Color);
y+=yo[8];
}
if(Show_Average_Hi_Lo)
{
for(i=1; i<=Days_For_ATR; i++)
{
avg+=iHigh(Symbol(),1440,i)-iLow(Symbol(),1440,i);
}
double PrevHiLo=(avg/Days_For_ATR)*po;
CreateText("XBoard_ATR",xp[3],y,DoubleToStr(PrevHiLo,di),info_fontsize,"Verdana",Text_Color);
CreateText("XBoard_ATR_label",xp[2],y,Days_For_ATR+" Days ATR:",info_fontsize,"Verdana",Text_Color);
y+=yo[9];
}
if(Show_Today_Hi_Lo)
{
double TodayHiLo=(iHigh(Symbol(),1440,0)-iLow(Symbol(),1440,0))*po;
CreateText("XBoard_TodayHiLo",xp[3],y,DoubleToStr(TodayHiLo,di),info_fontsize,"Verdana",Text_Color);
CreateText("XBoard_TodayHiLo_label",xp[2],y,"Today Hi-Lo:",info_fontsize,"Verdana",Text_Color);
y+=yo[9];
}
if(Show_Hi_Lo_to_Spread)
{
double HiLoToSpread=PrevHiLo/NormalizeDouble((Ask-Bid)*po,di);
CreateText("XBoard_ATRToSpread",xp[3],y,DoubleToStr(HiLoToSpread,2)+"X",info_fontsize,"Verdana",Text_Color);
CreateText("XBoard_ATRToSpread_label",xp[2],y,"ATR/Spread Ratio:",info_fontsize,"Verdana",Text_Color);
y+=yo[9];
}
if(Show_Current_Bar_Hi_Lo)
{
double BarHiLo=(High[0]-Low[0])*po;
CreateText("XBoard_CurrentBarHiLo",xp[3],y,DoubleToStr(BarHiLo,di),info_fontsize,"Verdana",Text_Color);
CreateText("XBoard_CurrentBarHiLo_label",xp[2],y,"Current Bar Hi-Lo:",info_fontsize,"Verdana",Text_Color);
y+=yo[9];
}
if(Show_Previous_Bar_Hi_Lo)
{
double PrevBarHiLo=(High[1]-Low[1])*po;
CreateText("XBoard_PrevBarHiLo",xp[3],y,DoubleToStr(PrevBarHiLo,di),info_fontsize,"Verdana",Text_Color);
CreateText("XBoard_PrevBarHiLo_label",xp[2],y,"Prev Bar Hi-Lo:",info_fontsize,"Verdana",Text_Color);
y+=yo[9];
}
if(Show_Tickvalue)
{
CreateText("XBoard_Tickvalue",xp[3],y,DoubleToStr(MarketInfo(Symbol(),MODE_TICKVALUE)*ti,3),info_fontsize,"Verdana",Text_Color);
CreateText("XBoard_Tickvalue_label",xp[2],y,"Tickvalue:",info_fontsize,"Verdana",Text_Color);
y+=yo[9];
}
if(Show_Stoplevel)
{
CreateText("XBoard_Stoplevel",xp[3],y,DoubleToStr(MarketInfo(Symbol(),MODE_STOPLEVEL),3),info_fontsize,"Verdana",Text_Color);
CreateText("XBoard_Stoplevel_label",xp[2],y,"Stoplevel:",info_fontsize,"Verdana",Text_Color);
y+=yo[9];
}
if(Show_Swap)
{
CreateText("XBoard_SwapLong",xp[3],y,DoubleToStr(MarketInfo(Symbol(),MODE_SWAPLONG),Digits),info_fontsize,"Verdana",Text_Color);
CreateText("XBoard_SwapLong_label",xp[2],y,"Swap Long:",info_fontsize,"Verdana",Text_Color);
y+=yo[9];
CreateText("XBoard_SwapShort",xp[3],y,DoubleToStr(MarketInfo(Symbol(),MODE_SWAPSHORT),Digits),info_fontsize,"Verdana",Text_Color);
CreateText("XBoard_SwapShort_label",xp[2],y,"Swap Short:",info_fontsize,"Verdana",Text_Color);
}
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CreateText(string label,int posx,int posy,string text,int fontsize,string font,color fontcolor)
{
ObjectDelete(label);
ObjectCreate(label,OBJ_LABEL,0,0,0);
ObjectSet(label,OBJPROP_CORNER,Corner);
ObjectSet(label,OBJPROP_XDISTANCE,posx);
ObjectSet(label,OBJPROP_YDISTANCE,posy);
ObjectSet(label,OBJPROP_BACK,false);
ObjectSetText(label,text,fontsize,font,fontcolor);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CreateBox(string name,int xpos,int ypos,int xsize,int ysize)
{
for(int a=0; a<xsize; a++)
{
for(int b=0; b<ysize; b++)
{
CreateText(name+"_"+a+"_"+b,a*13+xpos,b*14+ypos,CharToStr(110),18,"Wingdings",Background_Color);
}
}
}
//+------------------------------------------------------------------+
Comments