This script is designed as a visual technical analysis tool for the MetaTrader 4 platform. It transforms complex Relative Strength Index (RSI) data into a simplified, color-coded histogram that helps traders quickly identify market momentum and trends at a glance.
Core Functionality
The primary purpose of this tool is to interpret "strength" signals from another underlying indicator and translate them into a visual display of colored blocks. Instead of requiring you to analyze raw numerical values or multiple lines on a chart, the script categorizes market behavior into specific visual zones.
How the Logic Works
The script scans the price history and evaluates data points based on specific intensity levels. It then "paints" the chart using different colors to represent these states:
- Bullish Momentum (Green Zones): When the underlying data indicates strong upward movement reaching specific high-intensity thresholds, the script activates various green blocks. Depending on how strong the signal is, it may fill different sections of the histogram to show the "depth" of the trend.
- Bearish Momentum (Red Zones): Conversely, when the data identifies significant downward pressure reaching specific low-intensity thresholds, the script activates red blocks. Similar to the bullish signals, the placement and presence of these blocks change based on the severity of the downward move.
- Neutral/Ranging Markets (White Zone): When the market is neither showing strong upward nor downward momentum—essentially moving sideways or "ranging"—the script identifies this middle ground and highlights it with a white block.
Visual Representation
The logic uses an 8-buffer system to manage different visual layers. By mapping specific numerical results (such as 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, and 7.1) to different "draw" commands, the script ensures that:
- The Trend Color is Immediate: You can instantly see if the market is biased toward the buy side (Green), the sell side (Red), or is currently flat (White).
- The Trend Strength is Scalable: By activating different blocks as the numbers increase, the script provides a visual "heat map" of how powerful the current price movement actually is.
Summary for the User
Essentially, this script acts as a translator. It takes a complex mathematical calculation (RSI-based strength), filters out the noise, and presents you with a clean, color-coded dashboard. It allows you to see the "mood" of the market: green for strength, red for weakness, and white for indecision.
//+------------------------------------------------------------------+
//| multisymbol_color-RSI_1.0.mq4 |
//| Lq_sunshine |
//| http://www.forex-tsd.com |
//+------------------------------------------------------------------+
//#property indicator_chart_window
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_color1 C'162,208,162'
#property indicator_color2 C' 90,185, 90'
#property indicator_color3 C' 23,139, 23'
#property indicator_color4 C'255,255,255'
#property indicator_color5 C'255,185,185'
#property indicator_color6 C'255,115,115'
#property indicator_color7 C'255, 76, 76'
#property indicator_color8 C'255, 32, 32'
string indicator1="#SVM_b4_dd_pred3";
//extern int Periode=10;
//extern bool invert_strength = 0;
//extern string CurrencyPair = "";
//extern string NOTE0 = "enter currencypair in uppercase";
//extern string NOTE1 = "like EURUSD";
//extern string NOTE2 = "leave empty for current symbol";
//extern string NOTE3 = "if you have a mini account";
//extern string NOTE4 = "add a \"m\" e.g EURUSDm ";
//----------
//---- buffers
double ExtBuffer0[];
double ExtBuffer1[];
double ExtBuffer2[];
double ExtBuffer3[];
double ExtBuffer4[];
double ExtBuffer5[];
double ExtBuffer6[];
double ExtBuffer7[];
double ExtBuffer8[];
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int init()
{
SetIndexBuffer(0,ExtBuffer0);
SetIndexBuffer(1,ExtBuffer1);
SetIndexBuffer(2,ExtBuffer2);
SetIndexBuffer(3,ExtBuffer3);
SetIndexBuffer(4,ExtBuffer4);
SetIndexBuffer(5,ExtBuffer5);
SetIndexBuffer(6,ExtBuffer6);
SetIndexBuffer(7,ExtBuffer7);
SetIndexStyle(0,DRAW_HISTOGRAM, EMPTY, 5);
SetIndexStyle(1,DRAW_HISTOGRAM, EMPTY, 5);
SetIndexStyle(2,DRAW_HISTOGRAM, EMPTY, 5);
SetIndexStyle(3,DRAW_HISTOGRAM, EMPTY, 5);
SetIndexStyle(4,DRAW_HISTOGRAM, EMPTY, 5);
SetIndexStyle(5,DRAW_HISTOGRAM, EMPTY, 5);
SetIndexStyle(6,DRAW_HISTOGRAM, EMPTY, 5);
SetIndexStyle(7,DRAW_HISTOGRAM, EMPTY, 5);
//for (int i=0;i<indicator_buffers;i++) SetIndexLabel(i,NULL);
//if (CurrencyPair == "") CurrencyPair = Symbol();
//if (iClose(CurrencyPair,0,0) == 0)
// CurrencyPair = Symbol();
//IndicatorShortName(CurrencyPair+"("+Periode+")");
return(1);
}
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int start()
{
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--;
int pos=Bars-counted_bars;
double ddraw;
//---- main calculation loop
while(pos>=0)
{
ddraw= iCustom(Symbol(),0,indicator1,6,pos);
//if (invert_strength==1)
// ddraw=ddraw-(ddraw-50)*2; //---- Inversion of the RSI
// 1 2 3 4 5 6 7
//-2.9 -1.9 -0.9 0.1 1.1 2.1 3.1
if(ddraw==1.1 ) //---- RSI <= 48 draws RED blocks
{
//Print("----> -0.9");
// 1 2 3 4 5 6 7 8
drawblock(0,0,0,0,5,0,0,0,pos);
// 1 2 3 4 5 6 7 8
//drawblock(0,0,0,0,0,5,0,0,pos);
// 1 2 3 4 5 6 7 8
//drawblock(0,0,0,0,0,0,5,0,pos);
// 1 2 3 4 5 6 7 8
//drawblock(0,0,0,0,0,0,0,5,pos);
}
// 1 2 3 4 5 6 7
//-2.9 -1.9 -0.9 0.1 1.1 2.1 3.1
else if(ddraw==2.1 ) //---- RSI <= 48 draws RED blocks
{
//Print("----> -0.9");
// 1 2 3 4 5 6 7 8
//drawblock(0,0,0,0,5,0,0,0,pos);
// 1 2 3 4 5 6 7 8
drawblock(0,0,0,0,0,5,0,0,pos);
// 1 2 3 4 5 6 7 8
//drawblock(0,0,0,0,0,0,5,0,pos);
// 1 2 3 4 5 6 7 8
//drawblock(0,0,0,0,0,0,0,5,pos);
}
// 1 2 3 4 5 6 7
//-2.9 -1.9 -0.9 0.1 1.1 2.1 3.1
else if(ddraw==3.1 ) //---- RSI <= 48 draws RED blocks
{
//Print("----> -0.9");
// 1 2 3 4 5 6 7 8
//drawblock(0,0,0,0,5,0,0,0,pos);
// 1 2 3 4 5 6 7 8
//drawblock(0,0,0,0,0,5,0,0,pos);
// 1 2 3 4 5 6 7 8
drawblock(0,0,0,0,0,0,5,0,pos);
// 1 2 3 4 5 6 7 8
//drawblock(0,0,0,0,0,0,0,5,pos);
}
// 1 2 3 4 5 6 7
//-2.9 -1.9 -0.9 0.1 1.1 2.1 3.1
else if(ddraw==5.1) //---- RSI >= 52 draws green blocks
{
//Print("----> 1.1");
// 1 2 3 4 5 6 7 8
//drawblock(5,0,0,0,0,0,0,0,pos);
// 1 2 3 4 5 6 7 8
//drawblock(0,5,0,0,0,0,0,0,pos);
// 1 2 3 4 5 6 7 8
drawblock(0,0,5,0,0,0,0,0,pos);
}
// 1 2 3 4 5 6 7
//-2.9 -1.9 -0.9 0.1 1.1 2.1 3.1
else if(ddraw==6.1) //---- RSI >= 52 draws green blocks
{
//Print("----> 1.1");
// 1 2 3 4 5 6 7 8
//drawblock(5,0,0,0,0,0,0,0,pos);
// 1 2 3 4 5 6 7 8
drawblock(0,5,0,0,0,0,0,0,pos);
// 1 2 3 4 5 6 7 8
//drawblock(0,0,5,0,0,0,0,0,pos);
}
// 1 2 3 4 5 6 7
//-2.9 -1.9 -0.9 0.1 1.1 2.1 3.1
else if(ddraw==7.1) //---- RSI >= 52 draws green blocks
{
//Print("----> 1.1");
// 1 2 3 4 5 6 7 8
drawblock(5,0,0,0,0,0,0,0,pos);
// 1 2 3 4 5 6 7 8
//drawblock(0,5,0,0,0,0,0,0,pos);
// 1 2 3 4 5 6 7 8
//drawblock(0,0,5,0,0,0,0,0,pos);
}
// 1 2 3 4 5 6 7
//-2.9 -1.9 -0.9 0.1 1.1 2.1 3.1
else if(ddraw==4.1)
{
//Print("----> 0.1");
//---- draw white block if there chart is ranging
// 1 2 3 4 5 6 7 8
drawblock(0,0,0,5,0,0,0,0,pos);
}
pos--;
}
//----
return(0);
}
void drawblock(int a,int b,int c,int d,int e,int f,int g,int h,int pos)
{
ExtBuffer0[pos]=a;
ExtBuffer1[pos]=b;
ExtBuffer2[pos]=c;
ExtBuffer3[pos]=d;
ExtBuffer4[pos]=e;
ExtBuffer5[pos]=f;
ExtBuffer6[pos]=g;
ExtBuffer7[pos]=h;
}
Comments