OsMA Color
Download scriptThis tool is a specialized technical analysis indicator designed to help traders visualize momentum and trend direction in the financial markets. It functions by calculating and transforming standard moving average data into a visual histogram that highlights the "velocity" of price movements.
Core Logic and Functionality
The script operates through three primary layers of logic:
1. Data Foundation (The Moving Averages) At its core, the script processes three distinct types of moving averages using user-definable periods (Fast, Slow, and Signal). By calculating the relationship between a fast-moving average and a slow-moving average, the tool identifies the underlying momentum of the asset. It uses a weighted pricing model to ensure that more recent price actions have a significant impact on the current reading.
2. Momentum Calculation The script calculates an "Oscillator" value based on these moving averages. This value represents the gap between the short-term trend and the long-term trend. When this value is positive, it suggests upward momentum; when negative, it suggests downward momentum.
3. Visual Differentiation and Trend Tracking What makes this specific script unique is how it translates those raw numbers into a visual histogram. Instead of just showing a simple line, the logic analyzes the direction of change between the current price point and the previous one:
- Trend Identification: The script determines if the momentum is currently "Up" or "Down."
- Dynamic Coloring: It assigns specific colors to the histogram based on two simultaneous conditions: whether the momentum is positive/negative and whether that momentum is increasing or decreasing.
- It distinguishes between strengthening trends (where the movement is gaining speed) and weakening trends (where the movement is slowing down).
- By doing this, the visual output provides a multi-dimensional view: you can see not just where the price is going, but whether that movement has "energy" behind it or is losing steam.
User Experience
For the end-user, this logic results in a dynamic visual representation in a separate window below the main price chart. By observing the color shifts and the height of the histogram bars, a trader can quickly identify trend reversals, momentum exhaustion, and potential entry or exit points based on the "health" of the current market move.
//+------------------------------------------------------------------+
//| OsMA.mq4 |
//| Copyright © 2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net/"
//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 LimeGreen
#property indicator_color2 Green
#property indicator_color3 Red
#property indicator_color4 Maroon
//#property indicator_level1 0.0003
//#property indicator_level2 -0.0003
//---- indicator buffers
extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalSMA=9;
double ind_buffer1[], ind_buffer1s[];
double ind_buffer2[], ind_buffer2s[];
double ind_buffer3[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- 1 additional buffer used for counting.
IndicatorBuffers(5);
//---- drawing settings
SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,4);
SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,4);
SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,4);
SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_SOLID,4);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1);
SetIndexDrawBegin(0,34);
SetIndexDrawBegin(1,34);
SetIndexDrawBegin(3,34);
SetIndexDrawBegin(4,34);
//---- 3 indicator buffers mapping
if(!SetIndexBuffer(0,ind_buffer1) &&
!SetIndexBuffer(1,ind_buffer1s) &&
!SetIndexBuffer(2,ind_buffer2) &&
!SetIndexBuffer(3,ind_buffer2s) &&
!SetIndexBuffer(4,ind_buffer3))
Print("cannot set indicator buffers!");
//---- name for DataWindow and indicator subwindow label
IndicatorShortName("OsMA("+FastEMA+","+SlowEMA+","+SignalSMA+")");
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| Awesome Oscillator |
//+------------------------------------------------------------------+
int start()
{
int limit;
int counted_bars=IndicatorCounted();
double prev,current;
//---- 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;
//---- macd counted in the 1-st additional buffer
for(int i=0; i<limit; i++)
ind_buffer3[i]=iOsMA(NULL,0,FastEMA,SlowEMA,SignalSMA,PRICE_WEIGHTED,i);
//---- dispatch values between 2 buffers
bool up=true;
for(i=limit-1; i>=0; i--)
{
current=ind_buffer3[i];
prev=ind_buffer3[i+1];
if (((current<0)&&(prev>0))||(current<0)) up= false;
if (((current>0)&&(prev<0))||(current>0)) up= true;
if(!up)
{
if(current > prev)
{
ind_buffer2s[i]=current;
ind_buffer2[i]=0.0;
ind_buffer1[i]=0.0;
ind_buffer1s[i]=0.0;
}
else
{
ind_buffer2[i]=current;
ind_buffer2s[i]=0.0;
ind_buffer1[i]=0.0;
ind_buffer1s[i]=0.0;
}
}
else
{
if(current < prev)
{
ind_buffer1s[i]=current;
ind_buffer1[i]=0.0;
ind_buffer2[i]=0.0;
ind_buffer2s[i]=0.0;
}
else
{
ind_buffer1[i]=current;
ind_buffer1s[i]=0.0;
ind_buffer2[i]=0.0;
ind_buffer2s[i]=0.0;
}
}
}
//---- done
return(0);
}
Comments