Q(VolumeNorm_Low)
Download scriptThis technical tool is designed to analyze market dynamics by focusing on the relationship between price movement and trading volume. Instead of looking at price alone, it evaluates how much "effort" (volume) is being expended to move the price in a specific direction, helping traders identify the intensity behind market trends.
Core Logic and Mechanics
The script operates through several distinct analytical stages to transform raw market data into visual signals:
1. Volume-Adjusted Movement Calculation The foundation of this indicator is a unique calculation that measures the distance between a candle's opening price and its low point, weighted against the total volume of that period. By dividing this price range by the volume, the script essentially determines the "cost" or "efficiency" of the downward movement. It highlights whether price drops are occurring on high liquidity or if they are becoming exhausted.
2. Smoothing and Trend Identification To prevent the data from appearing too erratic or "noisy," the script applies a Moving Average to the calculated volume-adjusted values. This smoothing process helps filter out minor market fluctuations, allowing the user to see the broader underlying trend of the volume-to-price relationship more clearly.
3. Directional Filtering and Visualization The indicator then categorizes these movements into specific visual components:
- Dynamic Histograms: The tool separates the data into two distinct categories based on whether the movement is positive or negative. When the logic detects a specific direction, it highlights that value as a histogram; when the direction flips, it clears the opposite side. This creates a clean, visual "split" between different types of market pressure.
- Signal Line: A dedicated signal line tracks the moving average of these values, providing a steady reference point to observe the overarching momentum.
Summary for the User
In practical terms, this script helps you visualize whether the market is moving with strong conviction or if it is losing steam. By normalizing price movements against volume, it provides a clearer picture of "true" market activity, making it easier to distinguish between significant trend shifts and insignificant price fluctuations.
//+------------------------------------------------------------------+
//| Web: Q(VolumeNorm).mq4 |
//| MNS777 |
//| mns777.ru@mail.ru |
//+------------------------------------------------------------------+
#property copyright "MNS777"
#property link "Web:"
//---- îòðèñîâêà èíäèêàòîðà â îòäåëüíîì îêíå
#property indicator_separate_window
//---- êîëè÷åñòâî èíäèêàòîðíûõ áóôôåðîâ
#property indicator_buffers 4
//---- öâåòà èíäèêàòîðà
#property indicator_color1 Black
#property indicator_color2 Lime
#property indicator_color3 Red
#property indicator_color4 Blue
//---- òîëùèíà èíäèêàòîðíûõ ëèíèé
#property indicator_width1 1
#property indicator_width2 2
#property indicator_width3 2
#property indicator_width4 2
//---- ÂÕÎÄÍÛÅ ÏÀÐÀÌÅÒÐÛ ÈÍÄÈÊÀÒÎÐÀ þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþææ+
extern int PeriodMA = 24;
extern int ShiftMA = 0;
extern int ModeMA = 0;
extern double K = 1000;
extern int MaxBars = 1000 ; // áàðîâ èñòîðèè
extern string autor="Mns777.ru@mail.ru";
//---- æææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ+
//---- èíäèêàòîðíûå áóôôåðû
double ExtBuffer0[];
double ExtBuffer1[];
double ExtBuffer2[];
double SignalBuffer[];
//+------------------------------------------------------------------+
//| indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- ñòèëè èçîáðàæåíèÿ èíäèêàòîðà
SetIndexStyle(0,DRAW_NONE);
SetIndexStyle(1,DRAW_HISTOGRAM);
SetIndexStyle(2,DRAW_HISTOGRAM);
SetIndexStyle(3,DRAW_LINE);
//---- òî÷íîñòü
IndicatorDigits(Digits+1);
SetIndexDrawBegin(0,Digits);
SetIndexDrawBegin(1,Digits);
SetIndexDrawBegin(2,Digits);
SetIndexDrawBegin(3,Digits);
//---- 3 èíäèêàòîðíûõ áóôôåðà èñïîëüçîâàíû äëÿ ñ÷¸òà.
SetIndexBuffer(0,ExtBuffer0);
SetIndexBuffer(1,ExtBuffer1);
SetIndexBuffer(2,ExtBuffer2);
SetIndexBuffer(3,SignalBuffer);
//---- èìåíà äëÿ îêîí äàííûõ è ëýéáû äëÿ ñóáúîêîí.
IndicatorShortName("Q(VolumeNorm)");
SetIndexLabel(1,NULL);
SetIndexLabel(2,NULL);
SetIndexLabel(3,"MA");
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int limit;
int counted_bars=IndicatorCounted();
double prev,current;
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;
limit=MaxBars;
//---- macd
for(int i=0; i<limit; i++)
ExtBuffer0[i]= ((Low[i] - Open[i])*K)/ Volume[i];
//---- signal line counted in the 2-nd buffer
for(i=0; i<limit; i++)
SignalBuffer[i]=iMAOnArray(ExtBuffer0,Bars,PeriodMA,ShiftMA,ModeMA,i);
//---- dispatch values between 2 buffers
bool up=true;
for(i=limit-1; i>=0; i--)
{
current=ExtBuffer0[i];
if(current>0) up=true;
if(current<0) up=false;
if(!up)
{
ExtBuffer2[i]=current;
ExtBuffer1[i]=0.0;
}
else
{
ExtBuffer1[i]=current;
ExtBuffer2[i]=0.0;
}
}
//---- done
return(0);
}
//+------------------------------------------------------------------+
Comments