ZCOMFX daily trend v2
Download scriptThis script is designed to act as a comprehensive market trend dashboard for the MetaTrader platform. Its primary purpose is to provide a real-time visual summary of the price direction for six major currency pairs simultaneously, allowing traders to see "at a glance" which markets are trending upwards, downwards, or remaining neutral.
Core Functionality and Logic
The script operates by analyzing two specific technical indicators—Moving Averages (EMA) and the Stochastic Oscillator—across multiple timeframes to determine market sentiment.
1. Multi-Pair Dashboard
Instead of forcing the user to switch between different charts, the script monitors six customizable currency pairs (defaulting to EURUSD, GBPUSD, AUDUSD, USDCHF, USDCAD, and USDJPY). It gathers data from these pairs in the background and displays their statuses on a single visual panel on your current chart.
2. Trend Identification Logic
The script classifies each currency pair into one of three states based on the following rules:
- Bullish Trend (Upward): The market is considered to be trending up when the shorter-term moving average is above the longer-term moving average, and the Stochastic Oscillator is in the upper half of its range (above 50).
- Bearish Trend (Downward): The market is considered to be trending down when the shorter-term moving average is below the longer-term moving average, and the Stochastic Oscillator is in the lower half of its range (below 50).
- Neutral/Flat Trend: If the moving averages and the Stochastic Oscillator provide conflicting signals (e.g., the moving averages suggest an uptrend but the Stochastic suggests a downtrend), the script labels the trend as "Flat."
3. Visual Representation
The script creates a clean, organized text panel on your screen:
- Labels: It lists the names of the currency pairs clearly.
- Directional Icons: Next to each pair, it displays a specific symbol (using Wingdings icons) and color-codes the status:
- Lime/Green for Upward trends.
- Red for Downward trends.
- DodgerBlue for Flat or neutral markets.
4. On-Chart Signals and Alerts
In addition to the dashboard, the script performs a deeper calculation on the active chart you are currently viewing:
- Dynamic Arrows: It calculates "Cross" signals where moving averages intersect or Stochastic levels shift. When these specific conditions are met, it places visual arrows (Up, Down, or Flat) directly on your price candles.
- Audio Notifications: The script includes an alert system that can trigger a sound notification when a significant trend crossover occurs on the current chart, ensuring you don't miss key price action transitions.
Summary for the User
This tool is essentially a "Trend Radar." It eliminates the need to manually check six different charts by aggregating technical data into a single color-coded dashboard. It uses a balanced approach—combining moving averages (which show momentum) with Stochastic oscillators (which show overbought/oversold conditions)—to give you a filtered view of where the market is heading.
//+------------------------------------------------------------------+
//| ZCOMFX daily trend v2.mq4 |
//| |
/*
It shows a direction of 6 pairs (EUR/USD, GBP/USD, AUD/USD, USD/CHF, USD/CAD, USD/JPY) by indicators EMA and Stochastic.
You can change pairs whatever You would like to show daily trend.
*/
//+------------------------------------------------------------------+
#property copyright "ZCOMFX"
#property indicator_chart_window
#define Pref "ZCOMFX"
#property indicator_buffers 3
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_color3 DodgerBlue
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
double CrossUp[];
double CrossDown[];
double CrossFlat[];
double prevtime;
double Range, AvgRange;
double ema1,ema2;
double ema1pr,ema2pr;
double sto,stopr;
//----
int SoundAlert = 0; // 0 = disabled
extern string note="Write 6 pairs to show trend:";
extern string symbol1="EURUSD";
extern string symbol2="GBPUSD";
extern string symbol3="AUDUSD";
extern string symbol4="USDCHF";
extern string symbol5="USDCAD";
extern string symbol6="USDJPY";
extern bool ShowArrows = True;
string note1="Parameters of MACD:";
int FastEMA=12;
int SlowEMA=26;
int SignalSMA=9;
extern string note2="Coordinates:";
extern int X=40;
extern int Y=20;
int RowStep=12;
int ColStep=17;
extern int Corner=1;
int FSize=10;
//extern int H=0;
string note3="Colors, two themes:";
color RectClr=Gray;
color TxtClr=White;
color UpClr=Lime;
color DnClr=Red;
bool White_Chart_Theme=True;
color RectClr1=Gray;
color TxtClr1=Gray;
color UpClr1=Lime;
color DnClr1=Red;
color FlatClr=DodgerBlue;
int TimeX;
double PriceY;
int codeAO,
codeAO2,
codeAO3,
codeAO4,
codeAO5,
codeAO6, codeAC, codeMACD;
color ClrAO,
ClrAO2,
ClrAO3,
ClrAO4,
ClrAO5,
ClrAO6, ClrAC, ClrMACD ;
//bool Alert_=False;
//color Alert_Clr=Red;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle (0, DRAW_ARROW, EMPTY);
SetIndexArrow (0, 233);
SetIndexBuffer(0, CrossUp);
SetIndexStyle (1, DRAW_ARROW, EMPTY);
SetIndexArrow (1, 234);
SetIndexBuffer(1, CrossDown);
SetIndexStyle (2, DRAW_ARROW, EMPTY);
SetIndexArrow (2, 220);
SetIndexBuffer(2, CrossFlat);
if(White_Chart_Theme)
{
RectClr=RectClr1;
TxtClr=TxtClr1;
UpClr=UpClr1;
DnClr=DnClr1;
}
DrawPanel();
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
Delete_My_Obj(Pref);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
{
int limit, i, counter;
int counted_bars=IndicatorCounted();
//---- check for possible errors
if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;
//----
limit=Bars-counted_bars;
//----
for(i = 0; i <= limit; i++)
{
counter=i;
Range=0;
AvgRange=0;
for (counter=i ;counter<=i+9;counter++)
{
AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
}
Range=AvgRange/10;
//----
//----
ema1=iMA(NULL,PERIOD_H1,100,0,MODE_SMMA,PRICE_CLOSE,i+1);
ema2=iMA(NULL,PERIOD_H1,50,0,MODE_SMMA,PRICE_CLOSE,i+1);
ema1pr=iMA(NULL,PERIOD_H1,100,0,MODE_SMMA,PRICE_CLOSE,i+2);
ema2pr=iMA(NULL,PERIOD_H1,50,0,MODE_SMMA,PRICE_CLOSE,i+2);
sto=iStochastic(NULL,PERIOD_H1,120,1,8,MODE_SMA,0,MODE_MAIN,i+1);
stopr=iStochastic(NULL,PERIOD_H1,120,1,8,MODE_SMA,0,MODE_MAIN,i+2);
if ( (ema2>ema1 && sto<50 && stopr>50) || (ema2<ema1 && sto>50 && stopr<50) )
{
CrossFlat[i] = Low[i] - Range*0.5;
}
if ((ema2>ema1 && ema2pr<ema1pr && sto>50)
|| (sto>50 && stopr<50 && ema2>ema1)
)
{
CrossUp[i] = Low[i] - Range*0.5;
}
if ((ema2<ema1 && ema2pr>ema1pr && sto<50)
|| (sto<50 && stopr>50 && ema2<ema1)
)
{
CrossDown[i] = High[i] + Range*0.5;
}
}
if ((CrossUp[0] > 2000) && (CrossDown[0] > 2000)) { prevtime = 0; }
if ((CrossUp[0] == Low[0] - Range*0.5) && (prevtime != Time[0]) && (SoundAlert != 0))
{
prevtime = Time[0];
Alert(Symbol()," 3 MA Cross Up @ Hour ",Hour()," Minute ",Minute());
}
if ((CrossDown[0] == High[0] + Range*0.5) && (prevtime != Time[0]) && (SoundAlert != 0))
{
prevtime = Time[0];
Alert(Symbol()," 3 MA Cross Down @ Hour ",Hour()," Minute ",Minute());
}
//Comment(" CrossUp[0] ",CrossUp[0]," , CrossDown[0] ",CrossDown[0]," , prevtime ",prevtime);
//Comment("");
}
// int counted_bars=IndicatorCounted();
//----
double ema1,ema2,sto;
ema1=iMA(symbol1,PERIOD_H1,100,0,MODE_SMMA,PRICE_CLOSE,0);
ema2=iMA(symbol1,PERIOD_H1,50,0,MODE_SMMA,PRICE_CLOSE,0);
sto=iStochastic(symbol1,PERIOD_H4,30,3,3,MODE_SMA,0,MODE_MAIN,0);
if ( ema2>ema1 && sto>50 )
{codeAO=241; ClrAO=UpClr;}
if ( ema2<ema1 && sto<50 )
{codeAO=242; ClrAO=DnClr;}
if ( (ema2>ema1 && sto<50) || (ema2<ema1 && sto>50) )
{codeAO=240; ClrAO=FlatClr;}
double ema12,ema22,sto2;
ema12=iMA(symbol2,PERIOD_H1,100,0,MODE_SMMA,PRICE_CLOSE,0);
ema22=iMA(symbol2,PERIOD_H1,50,0,MODE_SMMA,PRICE_CLOSE,0);
sto2=iStochastic(symbol2,PERIOD_H4,30,3,3,MODE_SMA,0,MODE_MAIN,0);
if ( ema22>ema12 && sto2>50 )
{codeAO2=241; ClrAO2=UpClr;}
if ( ema22<ema12 && sto2<50 )
{codeAO2=242; ClrAO2=DnClr;}
if ( (ema22>ema12 && sto2<50) || (ema22<ema12 && sto2>50) )
{codeAO2=240; ClrAO2=FlatClr;}
double ema13,ema23,sto3;
ema13=iMA(symbol3,PERIOD_H1,100,0,MODE_SMMA,PRICE_CLOSE,0);
ema23=iMA(symbol3,PERIOD_H1,50,0,MODE_SMMA,PRICE_CLOSE,0);
sto3=iStochastic(symbol3,PERIOD_H4,30,3,3,MODE_SMA,0,MODE_MAIN,0);
if ( ema23>ema13 && sto3>50 )
{codeAO3=241; ClrAO3=UpClr;}
if ( ema23<ema13 && sto3<50 )
{codeAO3=242; ClrAO3=DnClr;}
if ( (ema23>ema13 && sto3<50) || (ema23<ema13 && sto3>50) )
{codeAO3=240; ClrAO3=FlatClr;}
double ema14,ema24,sto4;
ema14=iMA(symbol4,PERIOD_H1,100,0,MODE_SMMA,PRICE_CLOSE,0);
ema24=iMA(symbol4,PERIOD_H1,50,0,MODE_SMMA,PRICE_CLOSE,0);
sto4=iStochastic(symbol4,PERIOD_H4,30,3,3,MODE_SMA,0,MODE_MAIN,0);
if ( ema24>ema14 && sto4>50 )
{codeAO4=241; ClrAO4=UpClr;}
if ( ema24<ema14 && sto4<50 )
{codeAO4=242; ClrAO4=DnClr;}
if ( (ema24>ema14 && sto4<50) || (ema24<ema14 && sto4>50) )
{codeAO4=240; ClrAO4=FlatClr;}
double ema15,ema25,sto5;
ema15=iMA(symbol5,PERIOD_H1,100,0,MODE_SMMA,PRICE_CLOSE,0);
ema25=iMA(symbol5,PERIOD_H1,50,0,MODE_SMMA,PRICE_CLOSE,0);
sto5=iStochastic(symbol5,PERIOD_H4,30,3,3,MODE_SMA,0,MODE_MAIN,0);
if ( ema25>ema15 && sto5>50 )
{codeAO5=241; ClrAO5=UpClr;}
if ( ema25<ema15 && sto5<50 )
{codeAO5=242; ClrAO5=DnClr;}
if ( (ema25>ema15 && sto5<50) || (ema25<ema15 && sto5>50) )
{codeAO5=240; ClrAO5=FlatClr;}
double ema16,ema26,sto6;
ema16=iMA(symbol6,PERIOD_H1,100,0,MODE_SMMA,PRICE_CLOSE,0);
ema26=iMA(symbol6,PERIOD_H1,50,0,MODE_SMMA,PRICE_CLOSE,0);
sto6=iStochastic(symbol6,PERIOD_H4,30,3,3,MODE_SMA,0,MODE_MAIN,0);
if ( ema26>ema16 && sto6>50 )
{codeAO6=241; ClrAO6=UpClr;}
if ( ema25<ema15 && sto5<50 )
{codeAO6=242; ClrAO6=DnClr;}
if ( (ema26>ema16 && sto6<50) || (ema26<ema16 && sto6>50) )
{codeAO6=240; ClrAO6=FlatClr;}
// if (iAC( NULL , Period(), 1)<iAC( NULL , Period(), 0))
// {codeAC=217; ClrAC=UpClr;} else
// {codeAC=218; ClrAC=DnClr;} /* */
// if( iMACD( NULL , Period(),
// FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, MODE_MAIN, 1)< iMACD( NULL , Period(),
// FastEMA, SlowEMA, SignalSMA, PRICE_CLOSE, MODE_MAIN, 0) )
// {codeMACD=217; ClrMACD=UpClr;} else
// {codeMACD=218; ClrMACD=DnClr;}
/* if(Alert_)
{
if(codeAO==217 && codeAC==217 && codeMACD==217)
{Alert(Symbol()+" "+PeriodToStr(Period())
+" : AO, AC and MACD are UP at "+TimeToStr(TimeCurrent(),TIME_MINUTES));
ObjectDelete(Pref+"Unidirection Alert"); }
if(codeAO==218 && codeAC==218 && codeMACD==218)
{Alert(Symbol()+" "+PeriodToStr(Period())
+" : AO, AC and MACD are DOWN at "+TimeToStr(TimeCurrent(),TIME_MINUTES) );
ObjectDelete(Pref+"Unidirection Alert"); }
}
if(ObjectFind(Pref+"Unidirection Alert")<0)
Alert_=!Alert_;
if(Alert_)Alert_Clr=UpClr; else Alert_Clr=DnClr;*/
DrawPanel();
//----
return(0);
}
//+------------------------------------------------------------------+
int DrawText( string name, datetime T, double P, string Text, int code=0, color Clr=Green, int Fsize=10, int Win=0)
{
if (name=="") name="Text_"+T;
int Error=ObjectFind(name);// Çàïðîñ
if (Error!=Win)// Åñëè îáúåêòà â óê. îêíå íåò :(
{
ObjectCreate(name, OBJ_TEXT, Win, T, P);
}
ObjectSet(name, OBJPROP_TIME1, T);
ObjectSet(name, OBJPROP_PRICE1, P);
if(code==0)
ObjectSetText(name, Text ,Fsize,"Arial",Clr);
else
ObjectSetText(name, CharToStr(code), Fsize,"Wingdings",Clr);
}
//--------------------------------------
void DrawPanel()
{ if(Y<0) Y=0;
//if(Y>(WindowPriceMax()-WindowPriceMin())/Point-H)
// Y=(WindowPriceMax()-WindowPriceMin())/Point-H;
// TimeX=Time[WindowFirstVisibleBar()]+X*Period()*60;
// PriceY=WindowPriceMax()-Y*Point;
// DrawRect( Pref+"Rect", TimeX, PriceY, TimeX+TimeW ,PriceY-PriceH, RectClr, 1, "");
// DrawText( Pref+"Allow Hand Moving", TimeX+1*Period()*60, PriceY-1*Point, "", 73, HandClr );
//DrawText( Pref+"Unidirection Alert", TimeX+1*Period()*60, PriceY-(1+StepS)*Point, "", 37, Alert_Clr );
// DrawText( Pref+"AO", TimeX+4*Period()*60, PriceY-1*Point, "AO", 0,TxtClr );//0, 10, 0
// DrawText( Pref+"AC", TimeX+4*Period()*60, PriceY-(1+StepS)*Point, "AC", 0,TxtClr );
// DrawText( Pref+"MACD", TimeX+3*Period()*60, PriceY-(1+2*StepS)*Point, "MACD", 0,TxtClr );
// DrawText( Pref+"AO direction", TimeX+8*Period()*60, PriceY-1*Point, "", codeAO, ClrAO );
// DrawText( Pref+"AC direction", TimeX+8*Period()*60, PriceY-(1+StepS)*Point, "", codeAC, ClrAC );
// DrawText( Pref+"MACD direction", TimeX+8*Period()*60, PriceY-(1+2*StepS)*Point, "", codeMACD, ClrMACD );
DrawLabels(Pref+"AO", Corner, X+20, Y+10, symbol1, 0,TxtClr, 0, 10);
DrawLabels(Pref+"AO2", Corner, X+20, Y+60, symbol2, 0,TxtClr, 0, 10);
DrawLabels(Pref+"AO3", Corner, X+20, Y+110, symbol3, 0,TxtClr, 0, 10);
DrawLabels(Pref+"AO4", Corner, X+20, Y+160, symbol4, 0,TxtClr, 0, 10);
DrawLabels(Pref+"AO5", Corner, X+20, Y+210, symbol5, 0,TxtClr, 0, 10);
DrawLabels(Pref+"AO6", Corner, X+20, Y+260, symbol6, 0,TxtClr, 0, 10);
// DrawLabels(Pref+" ", Corner, X, Y+RowStep, " ",0, TxtClr, 0, FSize);
// DrawLabels(Pref+"MACD", Corner, X, Y+RowStep*2, " ", 0,TxtClr, 0, FSize);
DrawLabels(Pref+"AO direction", Corner, X-ColStep, Y, "bv", codeAO,ClrAO, 0, 30);
DrawLabels(Pref+"AO2 direction", Corner, X-ColStep, Y+50, "", codeAO2,ClrAO2, 0, 30);
DrawLabels(Pref+"AO3 direction", Corner, X-ColStep, Y+100, "", codeAO3,ClrAO3, 0, 30);
DrawLabels(Pref+"AO4 direction", Corner, X-ColStep, Y+150, "", codeAO4,ClrAO4, 0, 30);
DrawLabels(Pref+"AO5 direction", Corner, X-ColStep, Y+200, "", codeAO5,ClrAO5, 0, 30);
DrawLabels(Pref+"AO6 direction", Corner, X-ColStep, Y+250, "", codeAO6,ClrAO6, 0, 30);
// DrawLabels(Pref+"AC direction", Corner, X-ColStep, Y+RowStep, "", codeAC, ClrAC, 0, FSize);
// DrawLabels(Pref+"MACD direction", Corner, X-ColStep, Y+RowStep*2, "", codeMACD, ClrMACD, 0, FSize);
}
//---------------------------------
int DrawRect( string name, datetime T1, double P1,datetime T2, double P2,
color Clr=Green, int Width=1, string Text="", int Win=0)
{
if (name=="") name="Text_"+T1;
int Error=ObjectFind(name);// Çàïðîñ
if (Error!=Win)// Åñëè îáúåêòà â óê. îêíå íåò :(
{
ObjectCreate(name, OBJ_RECTANGLE, Win,T1,P1,T2,P2);//ñîçäàíèå òðåíäîâîé ëèíèè
}
ObjectSet(name, OBJPROP_TIME1 ,T1);
ObjectSet(name, OBJPROP_PRICE1,P1);
ObjectSet(name, OBJPROP_TIME2 ,T2);
ObjectSet(name, OBJPROP_PRICE2,P2);
ObjectSet(name,OBJPROP_BACK, false);
ObjectSet(name,OBJPROP_STYLE,0);
ObjectSet(name, OBJPROP_COLOR , Clr);
ObjectSet(name, OBJPROP_WIDTH , Width);
ObjectSetText(name,Text);
}
///-----------------------
void Delete_My_Obj(string Prefix)
{//Alert(ObjectsTotal());
for(int k=ObjectsTotal()-1; k>=0; k--) // Ïî êîëè÷åñòâó âñåõ îáúåêòîâ
{
string Obj_Name=ObjectName(k); // Çàïðàøèâàåì èìÿ îáúåêòà
string Head=StringSubstr(Obj_Name,0,StringLen(Prefix));// Èçâëåêàåì ïåðâûå ñèì
if (Head==Prefix)// Íàéäåí îáúåêò, ..
{
ObjectDelete(Obj_Name);
//Alert(Head+";"+Prefix);
}
}
}
///=====================
string PeriodToStr(int Per)
{
switch(Per) // Ðàñ÷¸ò äëÿ..
{ // .. ðàçëè÷íûõ ÒÔ
case 1: return("M1"); break;// Òàéìôðåéì Ì1
case 5: return("M5"); break;// Òàéìôðåéì Ì5
case 15: return("M15"); break;// Òàéìôðåéì Ì15
case 30: return("M30"); break;// Òàéìôðåéì Ì30
case 60: return("H1"); break;// Òàéìôðåéì H1
case 240: return("H4"); break;// Òàéìôðåéì H4
case 1440: return("D1"); break;// Òàéìôðåéì D1
case 10080: return("W1"); break;// Òàéìôðåéì W1
case 43200: return("ÌN"); break;// Òàéìôðåéì ÌN
}
}
//==================================
/*int CalculeH()
{
switch(Period()) // Ðàñ÷¸ò äëÿ..
{ // .. ðàçëè÷íûõ ÒÔ
case 1: return(15); break;// Òàéìôðåéì Ì1
case 5: return(15); break;// Òàéìôðåéì Ì5
case 15: return(30); break;// Òàéìôðåéì Ì15
case 30: return(45); break;// Òàéìôðåéì Ì30
case 60: return(60); break;// Òàéìôðåéì H1
case 240: return(180); break;// Òàéìôðåéì H4
case 1440: return(270); break;// Òàéìôðåéì D1
case 10080: return(450); break;// Òàéìôðåéì W1
case 43200: return(900); break;// Òàéìôðåéì ÌN
}
}*/
int DrawLabels(string name, int corn, int X, int Y, string Text, int code=0, color Clr=Green, int Win=0, int FSize=10)
{
int Error=ObjectFind(name);// Çàïðîñ
if (Error!=Win)// Åñëè îáúåêòà â óê. îêíå íåò :(
{
ObjectCreate(name,OBJ_LABEL,Win, 0,0); // Ñîçäàíèå îáúåêòà
}
ObjectSet(name, OBJPROP_CORNER, corn); // Ïðèâÿçêà ê óãëó
ObjectSet(name, OBJPROP_XDISTANCE, X); // Êîîðäèíàòà Õ
ObjectSet(name,OBJPROP_YDISTANCE,Y);// Êîîðäèíàòà Y
ObjectSetText(name,Text,FSize,"Arial",Clr);
if(code==0)
ObjectSetText(name, Text ,FSize,"Arial",Clr);
else
ObjectSetText(name, CharToStr(code), FSize,"Wingdings",Clr);
}
Comments