ZigZag_Fibo_v1beta_v1
Download scriptThis script is designed to analyze market price movements by identifying significant structural points—specifically the major "peaks" (highs) and "troughs" (lows)—in a trading chart. It functions as an automated tool that filters out minor market noise to highlight the overall trend and core price action.
How the Logic Works
1. Identifying Significant Price Points The script continuously scans historical price data to find extreme highs and lows. Rather than marking every small fluctuation, it uses three specific user-defined parameters to decide what qualifies as a "significant" move:
- Depth: Defines how many candles the script looks back to find a peak or trough.
- Deviation: Sets a minimum price distance that a move must cover to be considered a valid point.
- Backstep: Ensures that points are spaced out correctly so that the chart doesn't become cluttered with overlapping markers.
2. Filtering and Refinement The logic employs a "cleanup" phase where it evaluates recently identified points. If a new high is found that is higher than a previous one (or a new low that is lower than the last), the script intelligently discards the old, less significant point and replaces it with the new extreme. This ensures that the resulting lines only connect the most important structural turns in the market.
3. Automatic Trend Geometry Once the primary highs and lows are finalized, the script automatically identifies the two most recent major turning points. It then uses this data to project a Fibonacci Retracement tool onto the chart.
Practical Application
Instead of a trader having to manually click on charts to guess where a trend started or ended, this script performs that calculation automatically. By identifying the core structure of the current price move and drawing the Fibonacci levels accordingly, it provides an immediate visual reference for potential support, resistance, and retracement zones based on the most recent significant market behavior.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
// fukinagashi
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
//---- indicator buffers
double ExtMapBuffer[];
double ExtMapBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(2);
//---- drawing settings
SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
SetIndexBuffer(0,ExtMapBuffer);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexEmptyValue(0,0.0);
ArraySetAsSeries(ExtMapBuffer,true);
ArraySetAsSeries(ExtMapBuffer2,true);
//---- indicator short name
IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+","+ExtBackstep+")");
//---- initialization done
return(0);
}
int deinit() {
ObjectDelete("Fibo");
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int shift, back,lasthighpos,lastlowpos;
double val,res;
double curlow,curhigh,lasthigh,lastlow;
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=ExtMapBuffer[shift+back];
if((res!=0)&&(res>val)) ExtMapBuffer[shift+back]=0.0;
}
}
}
ExtMapBuffer[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=ExtMapBuffer[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) ExtMapBuffer[lastlowpos]=0;
else ExtMapBuffer[shift]=0;
}
//---
if((curlow<lastlow)||(lastlow<0))
{
lastlow=curlow;
lastlowpos=shift;
}
lasthigh=-1;
}
}
for(shift=Bars-1; shift>=0; shift--)
{
if(shift>=Bars-ExtDepth) ExtMapBuffer[shift]=0.0;
else
{
res=ExtMapBuffer2[shift];
if(res!=0.0) ExtMapBuffer[shift]=res;
}
}
int i=0;
int LastZigZag, PreviousZigZag;
/*
for(int h=0; h<Bars && i<=2; h++)
{
if (ExtMapBuffer[h]!=0) {
i++;
if (i==1) { LastZigZag=h;
} else { PreviousZigZag=h; }
} else if (ExtMapBuffer2[h]!=0) {
i++;
if (i==1) { LastZigZag=h;
} else { PreviousZigZag=h; }
}
}
*/
int h=0;
while ( ExtMapBuffer[h]==0 && ExtMapBuffer2[h]==0) {
h++;
}
LastZigZag=h;
h++;
while(ExtMapBuffer[h]==0 && ExtMapBuffer2[h]==0) {
h++;
}
PreviousZigZag=h;
ObjectCreate("Fibo", OBJ_FIBO, 0, Time[PreviousZigZag], ExtMapBuffer[LastZigZag], Time[LastZigZag], ExtMapBuffer[PreviousZigZag]);
}
Comments