This script is a technical analysis tool designed for the MetaTrader platform to help traders identify potential entry, addition, and exit points in a market based on momentum. It primarily uses two mathematical indicators: the RSI (Relative Strength Index), which measures price velocity and changes, and the ATR (Average True Range), which measures market volatility.
Core Logic Overview
The tool monitors how the RSI value fluctuates around specific "trigger zones" (30, 40, 50, 60, and 70). By tracking when the RSI crosses these levels from one bar to the next, the script generates visual signals on your chart.
How it Works: Bullish Scenarios (Buying)
The script looks for upward momentum when the RSI moves into the upper half of its range:
- Initial Entry: When the RSI crosses from below 50 to above 50, the tool signals a "Long" position. It automatically clears previous visual lines and draws new ones based on the current price and volatility (ATR) to suggest potential profit targets and stop-loss levels.
- Position Addition: If the price continues to strengthen and the RSI crosses the 60 level, the script identifies this as a signal to potentially increase the size of an existing long position.
- Exit Signal: When the momentum begins to cool off and the RSI drops from above 70 back below 70, the tool provides a "Sell" signal, suggesting it may be time to close the long position.
How it Works: Bearish Scenarios (Selling)
Conversely, the script monitors downward momentum when the RSI moves into the lower half of its range:
- Initial Entry: When the RSI crosses from above 50 to below 50, the tool signals a "Short" position. Similar to the bullish logic, it clears previous markers and draws new target and stop-loss lines based on current volatility.
- Position Addition: If the downward momentum accelerates and the RSI crosses the 40 level, the script identifies this as a potential signal to add to a short position.
- Exit Signal: When the selling pressure starts to fade and the RSI rises from below 30 back above 30, the tool provides a "Sell" signal (interpreted here as a signal to close the short position).
Visual Aids & Dynamic Adjustments
- Automatic Lines: The tool dynamically calculates your entry targets and stop-loss levels by using a percentage of the ATR. This ensures that your targets adjust automatically based on how volatile the market is at that specific moment.
- Visual Markers: The script places arrows directly on the chart to distinguish between primary entries, additional positions, and exit points, providing a clean "roadmap" of the trend's progression.
//+------------------------------------------------------------------+
//| FXA0 - RSI Crossing 50.mq4 |
//| Copyright © 2007, Adam J. Richter M.S. |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, Adam J. Richter M.S."
//Version 1.2 fixed 8 digit double to 4 digits and set to remove all objects in deinitialize
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Green
double dUpRsiBuffer[];
double dDownRsiBuffer[];
double dSellBuffer[];
extern double ATR_Percent = 0.15; //This value sets the ATR Used, The ATR is 15%
extern double RSI_Period = 21; //This value sets the RSI Period Used, The default is 21
extern double ATR_Period = 21; //This value sets the ATR Period Used, The default is 21
int RowNum = 0;
int LastTrend = -1;
int UP_IND = 1;
int DOWN_IND = 0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicator buffers mapping
SetIndexBuffer(0,dUpRsiBuffer);
SetIndexBuffer(1,dDownRsiBuffer);
SetIndexBuffer(2,dSellBuffer);
//---- drawing settings
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,233); //241 option for different arrow head
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,234); //242 option for different arrow head
SetIndexStyle(2,DRAW_ARROW);
SetIndexArrow(2,252); //251 x sign or 252 green check
//----
SetIndexEmptyValue(0,0.0);
SetIndexEmptyValue(1,0.0);
SetIndexEmptyValue(2,0.0);
//---- name for DataWindow
SetIndexLabel(0,"Rsi Buy");
SetIndexLabel(1,"Rsi Sell");
SetIndexLabel(2,"Exit");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
ObjectsDeleteAll();
//----
return(0);
}
void printmyline(double vala, int topbottom) //print target line
{
vala = NormalizeDouble(vala,4);
if(topbottom==1)//target
{
ObjectCreate("theentry " + vala,OBJ_HLINE,0,0,vala);
ObjectSet("theentry " + vala,OBJPROP_COLOR, Blue);
ObjectSetText("theentry " + vala,"Long Entry",13,"Arial",Black);
}
if(topbottom==2)//stop
{
ObjectCreate("thestop " + vala,OBJ_HLINE,0,0,vala);
ObjectSet("thestop " + vala,OBJPROP_COLOR, Blue);
ObjectSetText("thestop " + vala,"Long Stop",13,"Arial",Black);
}
}
void printmylinedown(double vala, int topbottom) //print target line
{
vala = NormalizeDouble(vala,4);
if(topbottom==1)//target
{
ObjectCreate("theentry " + vala,OBJ_HLINE,0,0,vala);
ObjectSet("theentry " + vala,OBJPROP_COLOR, Red);
ObjectSetText("theentry " + vala,"Short Entry",13,"Arial",Black);
}
if(topbottom==2)//stop
{
ObjectCreate("thestop " + vala,OBJ_HLINE,0,0,vala);
ObjectSet("thestop " + vala,OBJPROP_COLOR, Red);
ObjectSetText("thestop " + vala,"Short Stop",13,"Arial",Black);
}
}
void deletealllines()
{
ObjectsDeleteAll();
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int nBars,nCountedBars;
nCountedBars=IndicatorCounted(); //ncountedbars 655
//---- check for possible errors
if(nCountedBars<0) return(-1);
//---- last counted bar will be recounted
if(nCountedBars<=2)
nBars=Bars-nCountedBars-3;
if(nCountedBars>2)
{
nCountedBars--;
nBars=Bars-nCountedBars-1; //number of bars in current chart-655-1
}
double lastRSI60arrow = NULL; //if going long
double lastRSI40arrow = NULL; //if going short
int lastCloseLong=0;
int lastCloseShort=0;
for (int ii=Bars; ii>0; ii--)
{
dUpRsiBuffer[ii]=0;
dDownRsiBuffer[ii]=0;
double myRSInow = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,ii);
double myRSI2 = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,ii+1); //RSI One bar ago
double myATR1 = iATR(NULL,PERIOD_D1,ATR_Period,ii);
if (myRSInow>=50) //is going long
{
if(myRSInow>50 && myRSI2<50) //did it cross from below 50
{
deletealllines();
dUpRsiBuffer[ii] = Low[ii] - 2 * MarketInfo(Symbol(),MODE_POINT);
printmyline((iHigh(NULL,0,ii+1)+(myATR1*ATR_Percent)),1);
printmyline((iHigh(NULL,0,ii+1)+(myATR1*ATR_Percent))-(0.30*myATR1),2);
lastRSI60arrow=0;
lastCloseLong=0;
}
if(myRSInow>=60 && myRSI2<60) //add to position at cross of 60, sometimes this can occur twice
{
if(lastRSI60arrow>=60) //don't draw another arrow
{
}
if(lastRSI60arrow<=60) //draw another arrow for adding to position
{
dUpRsiBuffer[ii] = Low[ii] - 2 * MarketInfo(Symbol(),MODE_POINT);
lastRSI60arrow = myRSInow;
}
}
if(myRSInow<70 && myRSI2>=70) //sell first lot
{
if(lastCloseLong==0)
{
dSellBuffer[ii] = High[ii] + 2 * MarketInfo(Symbol(),MODE_POINT);
lastCloseLong=1;
}
}
}
if(myRSInow<50) //is going short
{
if(myRSInow<50 && myRSI2>50) //did it cross from above 50
{
deletealllines();
dDownRsiBuffer[ii] = High[ii] + 2 * MarketInfo(Symbol(),MODE_POINT);
printmylinedown((iLow(NULL,0,ii+1)-(myATR1*ATR_Percent)),1);
printmylinedown((iLow(NULL,0,ii+1)-(myATR1*ATR_Percent))+(0.30*myATR1),2);
lastCloseShort=0;
lastRSI40arrow=myRSInow; //set out of area
}
if(myRSInow<40 && myRSI2>40)
{
if(lastRSI40arrow<=40) //don't draw another arrow
{
}
if(lastRSI40arrow>=40) //draw another arrow to add to position
{
dDownRsiBuffer[ii] = High[ii] + 2 * MarketInfo(Symbol(),MODE_POINT);
lastRSI40arrow=myRSInow;
}
}
if(myRSInow>30 && myRSI2<30)
{
if(lastCloseShort==0)
{
dSellBuffer[ii] = Low[ii] - 4 * MarketInfo(Symbol(),MODE_POINT);
lastCloseShort=1;
}
}
}
}
}
Comments