This tool is designed as a visual trading assistant for MetaTrader that analyzes price trends using three specific moving averages (EMAs). Its primary purpose is to identify clear momentum shifts and provide visual cues on your chart regarding when to enter or exit positions based on the relationship between these averages.
Core Logic and Trend Analysis
The script continuously monitors three different Exponential Moving Averages (EMAs) with periods of 7, 14, and 21. By comparing these three lines, the tool determines the "health" and direction of the market:
- Buy Signals (Long Positions): The logic looks for a specific upward stacking order. When the shortest average (7) is above the medium average (14), and both are above the longest average (21), it identifies a strong bullish trend. The script then triggers a "Go Long" notification.
- Sell Signals (Short Positions): Conversely, the tool looks for a downward stacking order. When the longest average (21) is above the medium average (14), and both are above the shortest average (7), it identifies a bearish trend and triggers a "Go Short" notification.
Exit Strategy
Unlike many indicators that only show entries, this script also includes specific logic to tell you when a move might be losing steam:
- Exit Long: It detects when the medium average crosses back over the shortest average in a way that suggests the upward momentum is breaking.
- Exit Short: It identifies when the shortest average moves back above the medium average, suggesting the downward pressure is fading.
Visual Feedback and User Interface
To make these signals easy to read at a glance, the script performs several automated actions on your chart:
- On-Screen Text: It updates a text label in the corner of your screen showing the current status (e.g., "Go Long @ [Price]" or "Exit Short @ [Price]").
- Color Coding: The tool uses colors to communicate urgency and direction—typically Green for bullish entries and Red for bearish entries/exits.
- Dynamic Drawing: Whenever a new signal is detected, the script automatically draws horizontal and vertical dotted lines at the exact price and time of the signal. This allows you to look back at historical data and see exactly where a trend change occurred.
Summary for the User
This tool simplifies complex moving average crossovers into clear "Go" and "Exit" instructions. It is best utilized on higher time frames to filter out market noise, helping you stay aligned with the prevailing trend while providing clear visual markers for your trade management.
//+------------------------------------------------------------------+
//| KM-TRADING COMMENTS.mq4 |
//| Khurram Mustafa |
//| https://www.mql5.com/en/users/kc1981 |
//+------------------------------------------------------------------+
#property copyright "KHURRAM MUSTAFA"
#property link "https://www.mql5.com/en/users/kc1981/seller"
#property version "1.0"
#property description "TRADING COMMENTS"
#property description "THANKING YOU DODACHARTS FOR HELPED ME TO MAKE THIS INDICATOR"
#property description "RECOMMEND: Higher Time Frames"
#property description "STRATEGY: Always Trades With Minimum Lots For Better Results"
#property description "WISH: My Best Wishes Always With My Friends"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
double myadxvalue;
double ema7, ema14, ema21;
string emaresult, emaresultexit;
bool EMABuyAlert=false, EMASellAlert=false, EMAExitLong=false, EMAExitShort=false, EMABuy = false, EMASell = false, EMABuyExit=False, EMASellExit=False;
double myatr, mystd,EMAtempvar,EMAtempvarexit;
string atrresult;
int counted_bars;
int ii;
int EMALastSignal;
double mainvar;
datetime adxtime;
int init()
{
//---- indicators
ObjectCreate("myema",OBJ_LABEL,0,0,0);
ObjectCreate("myemaexit",OBJ_LABEL,0,0,0);
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
ObjectDelete("myema");
ObjectDelete("myemaexit");
ObjectsDeleteAll();
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
string MyMessage1 = Symbol()+" M"+IntegerToString(Period());
counted_bars=IndicatorCounted();
//----
counted_bars=IndicatorCounted();
ii = Bars - 1;
counted_bars = IndicatorCounted();
if ( counted_bars > 1 )
ii = Bars - counted_bars - 1;
while ( ii >= 1 )
{
ema7 = iMA(NULL,0,7,0,MODE_EMA,PRICE_CLOSE,ii);
ema14 = iMA(NULL,0,14,0,MODE_EMA,PRICE_CLOSE,ii);
ema21 = iMA(NULL,0,21,0,MODE_EMA,PRICE_CLOSE,ii);
if ( ema7 > ema14 && ema7 > ema21 && ema14 > ema21 && EMABuy==False )
{
emaresult = "Go Long @";
EMAtempvar = iClose(NULL,0,ii);
adxtime = iTime(NULL,0,ii);
EMALastSignal = 1;
EMABuy = True;
EMASell = False;
}
////
/// when to exit long
if ( ema14 > ema7 && ema14 > ema21 && ema21 > ema7 && EMABuyExit==False )
{
emaresultexit = "Exit long @";
EMAtempvarexit = iClose(NULL,0,ii);
EMALastSignal = 11;
EMABuyExit = True;
EMASellExit = False;
}
// when to go short
if ( ema21 > ema7 && ema21 > ema14 && ema14 > ema7 && EMASell==False )
{
emaresult = "Go Short @";
EMAtempvar = iClose(NULL,0,ii);
adxtime = iTime(NULL,0,ii);
EMALastSignal = 2;
EMASell = True;
EMABuy = False;
}
//when to exit short
if ( ema7 > ema14 && ema7 < ema21 && EMASellExit==False )
{
emaresultexit = "Exit short @";
EMAtempvarexit = iClose(NULL,0,ii);
EMALastSignal = 22;
EMASellExit = true;
EMABuyExit = False;
}
ii--;
} //end of while loop
if (emaresultexit == "")
{
emaresultexit = "No Results";
}
if(emaresult == "")
{
emaresult = "No Results";
}
if (EMALastSignal ==1)
{
ObjectSetText("myema",StringConcatenate("EMA: ", emaresult, " ", DoubleToStr(EMAtempvar ,Digits)," " ), 10, "Arial", Green);
ObjectDelete("myHline3");
ObjectDelete("myVline3");
ObjectCreate("myHline3", OBJ_HLINE, 0, adxtime, EMAtempvar, 0, 0);
ObjectCreate("myVline3", OBJ_VLINE, 0, adxtime, EMAtempvar, 0, 0);
ObjectSet("myHline3", OBJPROP_COLOR, Lime);
ObjectSet("myVline3", OBJPROP_COLOR, Lime);
ObjectSet("myVline3", OBJPROP_STYLE, STYLE_DOT);
ObjectSet("myHline3", OBJPROP_STYLE, STYLE_DOT);
}
if (EMALastSignal ==2)
{
ObjectSetText("myema",StringConcatenate("EMA: ", emaresult, " ", DoubleToStr(EMAtempvar ,Digits)," " ), 10, "Arial", Red);
ObjectDelete("myHline3");
ObjectDelete("myVline3");
ObjectCreate("myHline3", OBJ_HLINE, 0, adxtime, EMAtempvar, 0, 0);
ObjectCreate("myVline3", OBJ_VLINE, 0, adxtime, EMAtempvar, 0, 0);
ObjectSet("myHline3", OBJPROP_COLOR, Red);
ObjectSet("myVline3", OBJPROP_COLOR, Red);
ObjectSet("myHline3", OBJPROP_STYLE, STYLE_DOT);
ObjectSet("myVline3", OBJPROP_STYLE, STYLE_DOT);
}
ObjectSet("myema",OBJPROP_XDISTANCE,250);
ObjectSet("myema",OBJPROP_YDISTANCE,268);
ObjectSet("myema", OBJPROP_CORNER, 3);
ObjectSetText("myemaexit",StringConcatenate("EMA: ", emaresultexit, " ", DoubleToStr(EMAtempvarexit ,Digits)), 10, "Arial", Red);
ObjectSet("myemaexit",OBJPROP_XDISTANCE,260);
ObjectSet("myemaexit",OBJPROP_YDISTANCE,288);
ObjectSet("myemaexit", OBJPROP_CORNER, 3);
//----
return(0);
}
//+------------------------------------------------------------------+
Comments