The StepChoppyBars_v1 is a visual trading indicator designed to identify and categorize different types of market movements. Rather than simply telling you the direction of the price, it analyzes the relationship between trend strength and momentum to provide a detailed "roadmap" of what the current market behavior looks like.
How the Logic Works
The script operates by analyzing two primary components of market data: Trend Direction (provided by moving average calculations) and Momentum Dynamics (provided by Relative Strength Index measurements). By comparing these two factors, the indicator categorizes price action into eight distinct states, represented on your chart as colored bars.
The Eight Market States
The logic divides the market into four main categories based on whether the trend is moving upward or downward:
1. Strong Trends
- Strong UpTrend: This occurs when both the trend and momentum are aligned in a powerful upward direction. It indicates significant buying pressure.
- Strong DownTrend: This occurs when both the trend and momentum are aligned in a powerful downward direction, indicating heavy selling pressure.
2. Retracements (Corrections)
- Retrace UpTrend: The market is generally moving upward, but there is a temporary dip or "breather." The trend is still up, but momentum is momentarily pulling back.
- Retrace DownTrend: The market is generally moving downward, but there is a temporary relief rally. The trend is down, but momentum is briefly moving against it.
3. Choppy / Transitional Movements
- Choppy UpTrend: The overall trend is upward, but the price action is inconsistent and unstable. The momentum is fluctuating significantly, suggesting a lack of clear direction despite the higher price points.
- Choppy DownTrend: The overall trend is downward, but the price action is erratic. Similar to the choppy uptrend, this indicates "messy" price movement where it is difficult to determine a clean path.
4. Warning Signals (Pre-Change)
- Be Ready to Change UpTrend: This signals that an upward move is losing steam and the market may be preparing to reverse or consolidate.
- Be Ready to Change DownTrend: This signals that a downward move is exhausting and the market may be preparing for a reversal.
Summary for the User
Instead of providing a single "buy" or "sell" signal, this script acts as a diagnostic tool. It tells you the quality of the current price movement. It helps traders distinguish between a healthy, strong trend, a temporary correction, and a "choppy" market where the price is moving without clear conviction. This allows for better decision-making by helping you identify when it is safer to follow the trend and when the market is becoming too unpredictable to trade safely.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
//+------------------------------------------------------------------+
//| StepChoppyBars_v1.mq4 |
//| Copyright © 2006, Forex-TSD.com |
//| Written by IgorAD,igorad2003@yahoo.co.uk |
//| http://finance.groups.yahoo.com/group/TrendLaboratory |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Forex-TSD.com "
#property link "http://www.forex-tsd.com/"
#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 MediumBlue
#property indicator_color2 Crimson
#property indicator_color3 DodgerBlue
#property indicator_color4 Tomato
#property indicator_color5 LightBlue
#property indicator_color6 Orange
#property indicator_color7 Aqua
#property indicator_color8 Yellow
//---- input parameters
extern int Length =10;
extern double Kv = 1.0;
extern double StepSize =0;
extern int MA_Mode = 0;
extern bool HighLow = false;
extern double StepSizeFast=5;
extern double StepSizeSlow=15;
int MAPeriod=1;
int Price=0;
int Mode=2;
//---- buffers
double UpBuffer1[];
double DnBuffer1[];
double UpBuffer2[];
double DnBuffer2[];
double UpBuffer3[];
double DnBuffer3[];
double UpBuffer4[];
double DnBuffer4[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
SetIndexStyle(0,DRAW_HISTOGRAM,0,2,MediumBlue);
SetIndexBuffer(0,UpBuffer1);
SetIndexStyle(1,DRAW_HISTOGRAM,0,2,Crimson);
SetIndexBuffer(1,DnBuffer1);
SetIndexStyle(2,DRAW_HISTOGRAM,0,2,DodgerBlue);
SetIndexBuffer(2,UpBuffer2);
SetIndexStyle(3,DRAW_HISTOGRAM,0,2,Tomato);
SetIndexBuffer(3,DnBuffer2);
SetIndexStyle(4,DRAW_HISTOGRAM,0,2,LightBlue);
SetIndexBuffer(4,UpBuffer3);
SetIndexStyle(5,DRAW_HISTOGRAM,0,2,Orange);
SetIndexBuffer(5,DnBuffer3);
SetIndexStyle(6,DRAW_HISTOGRAM,0,2,Aqua);
SetIndexBuffer(6,UpBuffer4);
SetIndexStyle(7,DRAW_HISTOGRAM,0,2,Yellow);
SetIndexBuffer(7,DnBuffer4);
//----
string short_name="StepChoppyBars_v1";
IndicatorShortName(short_name);
SetIndexLabel(0,"Strong UpTrend");
SetIndexLabel(1,"Strong DownTrend");
SetIndexLabel(2,"Retrace UpTrend");
SetIndexLabel(3,"Retrace DownTrend");
SetIndexLabel(4,"Choppy UpTrend");
SetIndexLabel(5,"Choppy DownTrend");
SetIndexLabel(6,"Be ready to change UpTrend");
SetIndexLabel(7,"Be ready to change DownTrend");
//----
SetIndexDrawBegin(0,Length);
SetIndexDrawBegin(1,Length);
SetIndexDrawBegin(2,Length);
SetIndexDrawBegin(3,Length);
SetIndexDrawBegin(4,Length);
SetIndexDrawBegin(5,Length);
SetIndexDrawBegin(6,Length);
SetIndexDrawBegin(7,Length);
//----
return(0);
}
//+------------------------------------------------------------------+
//| StepChoppyBars_v1 |
//+------------------------------------------------------------------+
int start()
{
int i,counted_bars=IndicatorCounted();
double RSI, FastRSI, SlowRSI, StepMA, UpTrendMA, DnTrendMA;
//----
if(Bars<=Length) return(0);
//---- initial zero
if(counted_bars<1)
for(i=1;i<=Length;i++)
{
UpBuffer1[Bars-i]=0.0;
UpBuffer2[Bars-i]=0.0;
UpBuffer3[Bars-i]=0.0;
UpBuffer4[Bars-i]=0.0;
DnBuffer1[Bars-i]=0.0;
DnBuffer2[Bars-i]=0.0;
DnBuffer3[Bars-i]=0.0;
DnBuffer4[Bars-i]=0.0;
}
//----
if ( counted_bars > 0 ) int limit=Bars-counted_bars;
if ( counted_bars ==0 ) limit=Bars-Length-1;
for(i=limit;i>=0;i--)
{
UpTrendMA = iCustom(NULL,0,"StepMA_v7",Length,Kv,StepSize,MA_Mode,0,0,HighLow,2,0,1,i);
DnTrendMA = iCustom(NULL,0,"StepMA_v7",Length,Kv,StepSize,MA_Mode,0,0,HighLow,2,0,2,i);
RSI=iCustom(NULL,0,"StepRSI_v5.2",Length,StepSizeFast,MAPeriod,Price,Mode,0,i);
FastRSI=iCustom(NULL,0,"StepRSI_v5.2",Length,StepSizeFast,MAPeriod,Price,Mode,1,i);
SlowRSI=iCustom(NULL,0,"StepRSI_v5.2",Length,StepSizeSlow,MAPeriod,Price,Mode,1,i);
UpBuffer1[i] =EMPTY;
UpBuffer2[i] =EMPTY;
UpBuffer3[i] =EMPTY;
UpBuffer4[i] =EMPTY;
DnBuffer1[i] =EMPTY;
DnBuffer2[i] =EMPTY;
DnBuffer3[i] =EMPTY;
DnBuffer4[i] =EMPTY;
if (FastRSI > SlowRSI && RSI > FastRSI && UpTrendMA!=EMPTY_VALUE)
{UpBuffer1[i] = High[i];DnBuffer1[i] = Low[i] ;}
else if (FastRSI > SlowRSI && RSI < FastRSI && UpTrendMA!=EMPTY_VALUE)
{UpBuffer2[i] = High[i];DnBuffer2[i] = Low[i] ;}
else if (FastRSI < SlowRSI && RSI > FastRSI && UpTrendMA!=EMPTY_VALUE)
{UpBuffer3[i] = High[i];DnBuffer3[i] = Low[i] ;}
else if (FastRSI < SlowRSI && RSI < FastRSI && UpTrendMA!=EMPTY_VALUE)
{UpBuffer4[i] = High[i];DnBuffer4[i] = Low[i] ;}
else if (FastRSI < SlowRSI && RSI < FastRSI && DnTrendMA!=EMPTY_VALUE)
{DnBuffer1[i] = High[i];UpBuffer1[i] = Low[i];}
else if (FastRSI < SlowRSI && RSI > FastRSI && DnTrendMA!=EMPTY_VALUE)
{DnBuffer2[i] = High[i];UpBuffer2[i] = Low[i];}
else if (FastRSI > SlowRSI && RSI < FastRSI && DnTrendMA!=EMPTY_VALUE)
{DnBuffer3[i] = High[i];UpBuffer3[i] = Low[i];}
else if (FastRSI > SlowRSI && RSI > FastRSI && DnTrendMA!=EMPTY_VALUE)
{DnBuffer4[i] = High[i];UpBuffer4[i] = Low[i];}
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments