KC_v2

This 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":

  1. 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.
  2. 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.

Indicators Used
Indicator of the average true rangeMoving average indicator
Miscellaneous
Implements a curve of type %1
17 Views
0 Downloads
0 Favorites
KC_v2
//+------------------------------------------------------------------+
//|                                                         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