_252300_ZZ_Window
Download scriptThis script functions as a technical analysis indicator designed to identify significant price structure points and momentum shifts by tracking local highs and lows. It filters out market noise to highlight the most relevant price extremes, providing a visual representation of trend behavior.
Core Logic Overview
The tool operates through a multi-stage processing sequence to refine raw price data into actionable signals:
1. Peak and Trough Identification The script first scans the historical price data to locate local "peaks" (highs) and "troughs" (lows) within a specific lookback window. It uses three primary filters to ensure only significant price movements are captured:
- Depth: Defines how far back the script looks to find the highest or lowest point.
- Deviation: A sensitivity threshold that ensures the identified point is actually distinct from neighboring prices, preventing "flat" markets from triggering signals.
- Backstep: A smoothing mechanism that compares a point against its immediate neighbors to ensure it stands out as a clear local maximum or minimum.
2. Structural Filtering (The "Cutting" Phase) Once the initial peaks and troughs are identified, the script performs a secondary refinement pass. It evaluates these points against each other to identify the most prominent structural levels. If a new high is found that is higher than a previous one, it effectively replaces the older point. This creates a "skeleton" of the market's structure, focusing on major swing points rather than minor fluctuations.
3. Trend and Momentum Mapping After establishing the structural skeleton, the logic determines the current momentum. It creates an internal tracking system to see if the price is moving from one significant level to another. By analyzing the relationship between these high and low coordinates, it establishes whether the trend is currently bullish or bearish.
4. Visual Signal Generation The final stage of the logic translates these mathematical findings into visual markers on the chart:
- Dynamic Level Mapping: It assigns numerical values to specific price actions based on the strength of the momentum shift.
- Signal Coloring/Plotting: Depending on the transition between structural points, it triggers different visual outputs (such as lines or arrows). These signals represent high-probability areas where the trend may be exhausting or reversing, helping traders identify potential entry or exit zones based on the "flow" of the market structure.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
//+------------------------------------------------------------------+
//| |
//| |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net/"
#property indicator_separate_window
#property indicator_minimum -100
#property indicator_maximum 100
#property indicator_buffers 4
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_color3 Lime
#property indicator_color4 Red
//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
//---- indicator buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
double ExtMapBuffer5[];
double ExtMapBuffer6[];
double zz[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(7);
//---- drawing settings
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,119);
SetIndexBuffer(0,ExtMapBuffer3);
SetIndexEmptyValue(0,0.0);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,119);
SetIndexBuffer(1,ExtMapBuffer4);
SetIndexEmptyValue(1,0.0);
SetIndexStyle(2,DRAW_LINE);
SetIndexBuffer(2,ExtMapBuffer5);
SetIndexEmptyValue(2,0.0);
SetIndexStyle(3,DRAW_LINE);
SetIndexBuffer(3,ExtMapBuffer6);
SetIndexEmptyValue(3,0.0);
//---- indicator buffers mapping
SetIndexBuffer(4,ExtMapBuffer1);
SetIndexBuffer(5,ExtMapBuffer2);
SetIndexBuffer(6,zz);
SetIndexEmptyValue(0,0.0);
SetIndexEmptyValue(1,0.0);
SetIndexEmptyValue(2,0.0);
ArraySetAsSeries(ExtMapBuffer1,true);
ArraySetAsSeries(ExtMapBuffer2,true);
//---- indicator short name
IndicatorShortName("Its life Jim, but not as we know it... ");
//---- initialization done
return(0);
}
int deinit() {return(0);}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int shift, back,lasthighpos,lastlowpos;
double val,res;
double curlow,curhigh,lasthigh,lastlow;
bool signal;
int i;
for(shift=Bars-ExtDepth; shift>=0; shift--)
{
val=Low[Lowest(NULL,0,MODE_LOW,ExtDepth,shift)];
if(val==lastlow) val=0.0;
else
{
lastlow=val;
if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;
else
{
for(back=1; back<=ExtBackstep; back++)
{
res=ExtMapBuffer1[shift+back];
if((res!=0)&&(res>val)) ExtMapBuffer1[shift+back]=0.0;
}
}
}
ExtMapBuffer1[shift]=val;
//--- high
val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)];
if(val==lasthigh) val=0.0;
else
{
lasthigh=val;
if((val-High[shift])>(ExtDeviation*Point)) val=0.0;
else
{
for(back=1; back<=ExtBackstep; back++)
{
res=ExtMapBuffer2[shift+back];
if((res!=0)&&(res<val)) ExtMapBuffer2[shift+back]=0.0;
}
}
}
ExtMapBuffer2[shift]=val;
}
// final cutting
lasthigh=-1; lasthighpos=-1;
lastlow=-1; lastlowpos=-1;
for(shift=Bars-ExtDepth; shift>=0; shift--)
{
curlow=ExtMapBuffer1[shift];
curhigh=ExtMapBuffer2[shift];
if((curlow==0)&&(curhigh==0)) continue;
//---
if(curhigh!=0)
{
if(lasthigh>0)
{
if(lasthigh<curhigh) ExtMapBuffer2[lasthighpos]=0;
else ExtMapBuffer2[shift]=0;
}
//---
if(lasthigh<curhigh || lasthigh<0)
{
lasthigh=curhigh;
lasthighpos=shift;
}
lastlow=-1;
}
//----
if(curlow!=0)
{
if(lastlow>0)
{
if(lastlow>curlow) ExtMapBuffer1[lastlowpos]=0;
else ExtMapBuffer1[shift]=0;
}
//---
if((curlow<lastlow)||(lastlow<0))
{
lastlow=curlow;
lastlowpos=shift;
}
lasthigh=-1;
}
}
for(shift=Bars-1; shift>=0; shift--)
{
if(shift>=Bars-ExtDepth) {ExtMapBuffer1[shift]=0.0;ExtMapBuffer2[shift]=0.0;}
else
{
if (ExtMapBuffer1[shift]>0) {signal=true;}
res=ExtMapBuffer2[shift];
if(res!=0.0) {ExtMapBuffer1[shift]=res;signal=false;}
}
if (signal)
{
zz[shift]=-1;
}
else
{
zz[shift]=1;
}
}
// âûâîä
for(shift=Bars-4; shift>=0; shift--)
{
if (zz[shift]<0)
{
if (zz[shift+2]>0)
{
if (zz[shift+1]>0)
{
ExtMapBuffer4[shift+1]=-70;
ExtMapBuffer6[shift+1]=-70;
ExtMapBuffer4[shift]=-90;
ExtMapBuffer6[shift]=-90;
ExtMapBuffer3[shift]=-90;
ExtMapBuffer5[shift]=-90;
}
else
{
ExtMapBuffer3[shift]=-30;
ExtMapBuffer5[shift]=-30;
}
}
else
{
if (zz[shift+1]>0)
{
ExtMapBuffer3[shift]=-90;
ExtMapBuffer5[shift]=-90;
ExtMapBuffer4[shift]=-90;
ExtMapBuffer6[shift]=-90;
}
else
{
ExtMapBuffer3[shift]=0.001;
ExtMapBuffer5[shift]=0.001;
}
}
}
else
{
if (zz[shift+2]>0)
{
if (zz[shift+1]>0)
{
ExtMapBuffer4[shift]=0.001;
ExtMapBuffer6[shift]=0.001;
}
else
{
ExtMapBuffer3[shift]=90;
ExtMapBuffer5[shift]=90;
ExtMapBuffer4[shift]=90;
ExtMapBuffer6[shift]=90;
}
}
else
{
if (zz[shift+1]>0)
{
ExtMapBuffer4[shift]=30;
ExtMapBuffer6[shift]=30;
}
else
{
ExtMapBuffer3[shift+1]=70;
ExtMapBuffer5[shift+1]=70;
ExtMapBuffer3[shift]=90;
ExtMapBuffer5[shift]=90;
ExtMapBuffer4[shift]=90;
ExtMapBuffer6[shift]=90;
}
}
}
}
}
Comments