//+------------------------------------------------------------------+
//| ForexScannerDashboard.mq5                                        |
//| Custom Indicator for scanning multiple pairs                     |
//+------------------------------------------------------------------+
#property strict
#property indicator_chart_window
#include <Trade\Trade.mqh>
// Timeframe inputs
input ENUM_TIMEFRAMES TimeFrame1 = PERIOD_M1;
input ENUM_TIMEFRAMES TimeFrame2 = PERIOD_M5;
input ENUM_TIMEFRAMES TimeFrame3 = PERIOD_M15;
input ENUM_TIMEFRAMES TimeFrame4 = PERIOD_M30;
input ENUM_TIMEFRAMES TimeFrame5 = PERIOD_H1;
input ENUM_TIMEFRAMES TimeFrame6 = PERIOD_H4;
input ENUM_TIMEFRAMES TimeFrame7 = PERIOD_D1;
// Moving Average inputs
input ENUM_MA_METHOD MA_Method = MODE_EMA;
input ENUM_APPLIED_PRICE Applied_Price = PRICE_CLOSE;
input int Period_MA1 = 5;
input int Period_MA2 = 10;
// Signal options
input bool Send_Alert = true;
input bool Send_eMail = false;
input bool Send_Notification = false;
// Dashboard display options
input int RowHeight = 20; // Row height
input int ColWidth = 100; // Column width
input color HeaderTextColor = clrWhite; // Header text color
input color HeaderBgColor = clrBlack; // Header background color
input color RowTextColor = clrBlack; // Row text color
input color RowBgColor = clrLightGray; // Row background color
input color ColBgColor = clrWhite; // Column background color
input int FontSize = 10; // Font size
input string FontType = "Arial"; // Font type
double CrossUP[], CrossDOWN[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
int symbolsCount = SymbolsTotal(true); // Get the total number of symbols in Market Watch
int timeframes[] = {TimeFrame1, TimeFrame2, TimeFrame3, TimeFrame4, TimeFrame5, TimeFrame6, TimeFrame7};
ArrayResize(CrossUP, ArraySize(timeframes) * symbolsCount);
ArrayResize(CrossDOWN, ArraySize(timeframes) * symbolsCount);
for(int i = 0; i < ArraySize(CrossUP); i++)
{
CrossUP[i] = 0;
CrossDOWN[i] = 0;
}
EventSetTimer(60); // Set the timer to trigger every minute
return INIT_SUCCEEDED;
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
EventKillTimer();
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
void OnTimer()
{
int index = 0;
int timeframes[] = {TimeFrame1, TimeFrame2, TimeFrame3, TimeFrame4, TimeFrame5, TimeFrame6, TimeFrame7};
int symbolsCount = SymbolsTotal(true);
for(int tfIndex = 0; tfIndex < ArraySize(timeframes); tfIndex++)
{
ENUM_TIMEFRAMES timeframe = ENUM_TIMEFRAMES(timeframes[tfIndex]);
for(int symbolIndex = 0; symbolIndex < symbolsCount; symbolIndex++)
{
string symbol = SymbolName(symbolIndex, true);
double MA1 = iMA(symbol, timeframe, Period_MA1, 0, MA_Method, Applied_Price);
double MA2 = iMA(symbol, timeframe, Period_MA2, 0, MA_Method, Applied_Price);
double prevMA1 = iMA(symbol, timeframe, Period_MA1, 1, MA_Method, Applied_Price);
double prevMA2 = iMA(symbol, timeframe, Period_MA2, 1, MA_Method, Applied_Price);
if(prevMA1 < prevMA2 && MA1 > MA2) // Cross up
{
CrossUP[index] = 1;
CrossDOWN[index] = 0;
SendAlert(symbol, timeframe, "Cross Up");
}
else if(prevMA1 > prevMA2 && MA1 < MA2) // Cross down
{
CrossUP[index] = 0;
CrossDOWN[index] = 1;
SendAlert(symbol, timeframe, "Cross Down");
}
else
{
CrossUP[index] = 0;
CrossDOWN[index] = 0;
}
index++;
}
}
ChartRedraw();
}
//+------------------------------------------------------------------+
//| Custom chart drawing function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
if(id == CHARTEVENT_CUSTOM)
{
DrawDashboard();
}
}
//+------------------------------------------------------------------+
//| Timer event function |
//+------------------------------------------------------------------+
void OnTick()
{
OnTimer();
}
//+------------------------------------------------------------------+
//| Draw the dashboard on the chart |
//+------------------------------------------------------------------+
void DrawDashboard()
{
int symbolsCount = SymbolsTotal(true);
int timeframes[] = {TimeFrame1, TimeFrame2, TimeFrame3, TimeFrame4, TimeFrame5, TimeFrame6, TimeFrame7};
int totalRows = ArraySize(timeframes) * symbolsCount;
int x = 10;
int y = 20;
// Draw headers
ObjectCreate(0, "SymbolHeader", OBJ_LABEL, 0, 0, 0);
ObjectSetString(0, "SymbolHeader", OBJPROP_TEXT, "Symbol");
ObjectSetInteger(0, "SymbolHeader", OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, "SymbolHeader", OBJPROP_XDISTANCE, x);
ObjectSetInteger(0, "SymbolHeader", OBJPROP_YDISTANCE, y);
ObjectSetInteger(0, "SymbolHeader", OBJPROP_FONTSIZE, FontSize + 2); // Slightly larger for header
ObjectSetInteger(0, "SymbolHeader", OBJPROP_COLOR, HeaderTextColor);
ObjectSetString(0, "SymbolHeader", OBJPROP_FONT, FontType);
ObjectSetInteger(0, "SymbolHeader", OBJPROP_BACK, HeaderBgColor);
ObjectCreate(0, "TimeFrameHeader", OBJ_LABEL, 0, 0, 0);
ObjectSetString(0, "TimeFrameHeader", OBJPROP_TEXT, "TimeFrame");
ObjectSetInteger(0, "TimeFrameHeader", OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, "TimeFrameHeader", OBJPROP_XDISTANCE, x + ColWidth);
ObjectSetInteger(0, "TimeFrameHeader", OBJPROP_YDISTANCE, y);
ObjectSetInteger(0, "TimeFrameHeader", OBJPROP_FONTSIZE, FontSize + 2);
ObjectSetInteger(0, "TimeFrameHeader", OBJPROP_COLOR, HeaderTextColor);
ObjectSetString(0, "TimeFrameHeader", OBJPROP_FONT, FontType);
ObjectSetInteger(0, "TimeFrameHeader", OBJPROP_BACK, HeaderBgColor);
ObjectCreate(0, "SignalHeader", OBJ_LABEL, 0, 0, 0);
ObjectSetString(0, "SignalHeader", OBJPROP_TEXT, "Signal");
ObjectSetInteger(0, "SignalHeader", OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, "SignalHeader", OBJPROP_XDISTANCE, x + 2 * ColWidth);
ObjectSetInteger(0, "SignalHeader", OBJPROP_YDISTANCE, y);
ObjectSetInteger(0, "SignalHeader", OBJPROP_FONTSIZE, FontSize + 2);
ObjectSetInteger(0, "SignalHeader", OBJPROP_COLOR, HeaderTextColor);
ObjectSetString(0, "SignalHeader", OBJPROP_FONT, FontType);
ObjectSetInteger(0, "SignalHeader", OBJPROP_BACK, HeaderBgColor);
y += RowHeight;
int index = 0;
for(int tfIndex = 0; tfIndex < ArraySize(timeframes); tfIndex++)
{
ENUM_TIMEFRAMES timeframe = ENUM_TIMEFRAMES(timeframes[tfIndex]);
for(int symbolIndex = 0; symbolIndex < symbolsCount; symbolIndex++)
{
string symbol = SymbolName(symbolIndex, true);
string tfText = EnumToString(timeframe);
string signalText = "";
if(CrossUP[index] == 1)
signalText = "UP";
else if(CrossDOWN[index] == 1)
signalText = "DOWN";
ObjectCreate(0, "Symbol" + (string)index, OBJ_LABEL, 0, 0, 0);
ObjectSetString(0, "Symbol" + (string)index, OBJPROP_TEXT, symbol);
ObjectSetInteger(0, "Symbol" + (string)index, OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, "Symbol" + (string)index, OBJPROP_XDISTANCE, x);
ObjectSetInteger(0, "Symbol" + (string)index, OBJPROP_YDISTANCE, y);
ObjectSetInteger(0, "Symbol" + (string)index, OBJPROP_FONTSIZE, FontSize);
ObjectSetInteger(0, "Symbol" + (string)index, OBJPROP_COLOR, RowTextColor);
ObjectSetString(0, "Symbol" + (string)index, OBJPROP_FONT, FontType);
ObjectSetInteger(0, "Symbol" + (string)index, OBJPROP_BACK, RowBgColor);
ObjectCreate(0, "TimeFrame" + (string)index, OBJ_LABEL, 0, 0, 0);
ObjectSetString(0, "TimeFrame" + (string)index, OBJPROP_TEXT, tfText);
ObjectSetInteger(0, "TimeFrame" + (string)index, OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, "TimeFrame" + (string)index, OBJPROP_XDISTANCE, x + ColWidth);
ObjectSetInteger(0, "TimeFrame" + (string)index, OBJPROP_YDISTANCE, y);
ObjectSetInteger(0, "TimeFrame" + (string)index, OBJPROP_FONTSIZE, FontSize);
ObjectSetInteger(0, "TimeFrame" + (string)index, OBJPROP_COLOR, RowTextColor);
ObjectSetString(0, "TimeFrame" + (string)index, OBJPROP_FONT, FontType);
ObjectSetInteger(0, "TimeFrame" + (string)index, OBJPROP_BACK, ColBgColor);
ObjectCreate(0, "Signal" + (string)index, OBJ_LABEL, 0, 0, 0);
ObjectSetString(0, "Signal" + (string)index, OBJPROP_TEXT, signalText);
ObjectSetInteger(0, "Signal" + (string)index, OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, "Signal" + (string)index, OBJPROP_XDISTANCE, x + 2 * ColWidth);
ObjectSetInteger(0, "Signal" + (string)index, OBJPROP_YDISTANCE, y);
ObjectSetInteger(0, "Signal" + (string)index, OBJPROP_FONTSIZE, FontSize);
ObjectSetInteger(0, "Signal" + (string)index, OBJPROP_COLOR, RowTextColor);
ObjectSetString(0, "Signal" + (string)index, OBJPROP_FONT, FontType);
ObjectSetInteger(0, "Signal" + (string)index, OBJPROP_BACK, RowBgColor);
y += RowHeight;
index++;
}
}
}
//+------------------------------------------------------------------+
//| Send alert function |
//+------------------------------------------------------------------+
void SendAlert(string symbol, ENUM_TIMEFRAMES timeframe, string signal)
{
string message = StringFormat("Symbol: %s\nTimeframe: %s\nSignal: %s", symbol, EnumToString(timeframe), signal);

if(Send_Alert)
Alert(message);
if(Send_eMail)
SendMail("Forex Signal", message);
if(Send_Notification)
SendNotification(message);
}
