KC_v2
Download scriptThis tool is designed to provide a visual representation of market volatility and price trends by creating two distinct boundary lines on your trading chart. Instead of relying solely on a single moving average, this script calculates a "channel" that adjusts dynamically based on how much the market is currently fluctuating.
How the Logic Works
The indicator builds its calculations using three primary components:
- Trend Tracking (EMA): The core of the logic uses an Exponential Moving Average. This identifies the general direction of the price by giving more weight to recent price action while still accounting for historical data.
- Volatility Measurement (ATR): To understand how "noisy" or "choppy" the market is, the script utilizes the Average True Range. This measures the average distance between highs and lows over a specific period.
- The Sensitivity Factor: A customizable multiplier is applied to the volatility measurement. This allows the user to determine how wide or tight the boundaries should be relative to the price action.
The Output on Your Chart
The script generates two separate lines, which can be thought of as an upper and lower "ceiling" and "floor":
- The Upper Boundary: This is calculated by taking the moving average and adding a portion of the volatility measurement. It represents the upper limit of normal price movement.
- The Lower Boundary: This is calculated by taking the moving average and subtracting that same volatility portion. It represents the lower limit of normal price movement.
Summary of Behavior
By combining a trend-following tool (Moving Average) with a volatility-tracking tool (ATR), the script creates a dynamic zone. When the market is calm, these lines will contract toward each other; when the market becomes highly volatile, the lines will expand outward. This provides a visual guide to help identify when price action is moving significantly outside of its expected range.
//+------------------------------------------------------------------+
//| KC.mq4 |
//| Copyright © 2004, MetaQuotes Software Corp. |
//| http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net/"
//---- Matsu
//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Red
//---- indicator parameters
extern int EMA=20;
extern int ATR=20;
extern double Factor=1.5;
//---- indicator buffers
double ind_buffer1[];
double ind_buffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- 2 additional buffers are used for counting.
IndicatorBuffers(3);
//---- drawing settings
SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1);
SetIndexDrawBegin(0,EMA);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+2);
//---- 3 indicator buffers mapping
if(!SetIndexBuffer(0,ind_buffer1) &&
!SetIndexBuffer(1,ind_buffer2))
Print("cannot set indicator buffers!");
//---- name for DataWindow and indicator subwindow label
IndicatorShortName("KC("+EMA+","+ATR+","+Factor+")");
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| Moving Average of Oscillator |
//+------------------------------------------------------------------+
int start()
{
int limit;
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--;
limit=Bars-counted_bars;
//---- KC counted in the 1-st additional buffer
for(int i=0; i<limit; i++)
ind_buffer1[i]=iMA(NULL,0,EMA,0,MODE_EMA,PRICE_CLOSE,i) + iATR(NULL,0,ATR,0)*Factor;
//---- signal line counted in the 2-nd additional buffer
for(i=0; i<limit; i++)
ind_buffer2[i]=iMA(NULL,0,EMA,0,MODE_EMA,PRICE_CLOSE,i) - iATR(NULL,0,ATR,0)*Factor;
//---- done
return(0);
}
//+------------------------------------------------------------------+
Comments