High_Low v2 (ZigZag)_001
Download scriptThis script is designed to identify and map significant structural points in price movement, specifically focusing on historical highs and lows. It acts as a visual tool that clarifies the "skeleton" of a market's price action by filtering out minor fluctuations to highlight major turning points.
Core Logic Overview
The tool works by scanning through a specific historical period of price data (defined by the user) to determine whether the market is currently making new highs, new lows, or alternating between both. Instead of just plotting every single price movement, it looks for "swing" behaviors—moments where the price reverses its trend.
How the Analysis Works
The script processes the market data through several logical layers:
- Neighborhood Scanning: For every point in time, the tool looks at a small window of nearby candles (determined by the "Length" setting). It compares the current price against these neighbors to see if it qualifies as a local peak or a local valley.
- Trend Tracking: The script maintains a continuous memory of the current price direction. It identifies if the market is in an "Upward Swing," a "Downward Swing," or a state of transition.
- Significant Point Capture: When the logic detects a reversal (for example, moving from an upward move to a downward move), it captures the exact coordinates of that peak. Conversely, when it detects a move from downward to upward, it captures the valley.
- Data Storage and Mapping: Once these key highs and lows are identified, the script stores them in a dedicated memory list. It then maps these specific prices back onto your chart window.
Visual Output
The final result is a series of yellow lines or markers that represent significant price levels. By isolating these specific "Highs" and "Lows," the tool allows you to see the broader structure of the market clearly, helping to distinguish major price peaks and valleys from everyday market noise.
//+------------------------------------------------------------------+
//| High_Low v2 (ZigZag).mq4 |
//| rewritten by CrazyChart |
//| |
//+------------------------------------------------------------------+
#property copyright "rewritten by CrazyChart"
#property link ""
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Yellow
//---- input parameters
extern int barn=300;
extern int Length=2;
//---- buffers
double ExtMapBuffer1[];
//double ExtMapBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexEmptyValue(0,0.0);
//SetIndexDrawBegin(0, barn);
SetIndexStyle(0,DRAW_SECTION);
SetIndexBuffer(0,ExtMapBuffer1);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
int shift,Swing,Swing_n,uzl,i,zu,zd,mv;
double LL,HH,BH,BL,NH,NL;
double Uzel[10000][3];
string text;
// loop from first bar to current bar (with shift=0)
Swing_n=0;Swing=0;uzl=0;
BH =High[barn];BL=Low[barn];zu=barn;zd=barn;
for (shift=barn;shift>=0;shift--) {
LL=10000000;HH=-100000000;
for (i=shift+Length;i>=shift+1;i--) {
if (Low[i]< LL) {LL=Low[i];};
if (High[i]>HH) {HH=High[i];};
};
if (Low[shift]<LL && High[shift]>HH){
Swing=2;
if (Swing_n==1) {zu=shift+1;};
if (Swing_n==-1) {zd=shift+1;};
} else {
if (Low[shift]<LL) {Swing=-1;};
if (High[shift]>HH) {Swing=1;};
};
if (Swing!=Swing_n && Swing_n!=0) {
if (Swing==2) {
Swing=-Swing_n;BH = High[shift];BL = Low[shift];
};
uzl=uzl+1;
if (Swing==1) {
Uzel[uzl][1]=zd;
Uzel[uzl][2]=BL;
};
if (Swing==-1) {
Uzel[uzl][1]=zu;
Uzel[uzl][2]=BH;
};
BH = High[shift];
BL = Low[shift];
};
if (Swing==1) {
if (High[shift]>=BH) {BH=High[shift];zu=shift;};};
if (Swing==-1) {
if (Low[shift]<=BL) {BL=Low[shift]; zd=shift;};};
Swing_n=Swing;
};
for (i=1;i<=uzl;i++) {
//text=DoubleToStr(Uzel[i][1],0);
//text=;
mv=StrToInteger(DoubleToStr(Uzel[i][1],0));
ExtMapBuffer1[mv]=Uzel[i][2];
};
return(0);
}
//+------------------------------------------------------------------+
Comments