ZigZag_Fibo_v2beta_v1
Download scriptThis script is designed to automate the identification of significant market structures and automatically draw Fibonacci retracement levels on your trading chart. It essentially acts as an intelligent "map maker" for price action, identifying key peaks and valleys without requiring manual intervention.
How the Logic Works
1. Identifying Key Price Points The tool starts by scanning historical price data to locate prominent highs and lows. It doesn't simply look at every single candle; instead, it uses specific parameters (Depth and Deviation) to filter out minor market "noise." This ensures that only significant turning points are captured, making the resulting data more reliable for analysis.
2. Filtering and Smoothing To ensure the movements are consistent, the script applies a logic check where it compares current price movements against recent history. If a new high or low is detected that doesn't meet the necessary "strength" or "distance" criteria, the script ignores it. This prevents the tool from reacting to tiny fluctuations and focuses on meaningful trend changes.
3. Establishing the ZigZag Structure The core logic utilizes a "ZigZag" method. It looks for sequential movements: once a new high is established, it seeks out the next significant low, and vice versa. The script intelligently manages these points so that if a new, higher high is reached before a low is confirmed, it updates the structure to reflect the most extreme point of the current move.
4. Automatic Fibonacci Drawing Once the tool identifies the two most recent major structural points (the significant start and end of the latest trend), it automatically performs the following actions:
- It clears any previous markings to keep your chart clean.
- It draws a new Fibonacci retracement tool based on those exact coordinates.
- It provides a real-time alert via both a visual notification and an audible sound signal to inform you that a new structural move has been completed and the levels have updated.
Summary for the Trader
Instead of you having to manually click points on your chart to see where the next retracement might happen, this script does the heavy lifting. It constantly monitors the market, "watches" for significant trend shifts, and automatically places a Fibonacci tool on your screen as soon as a new structural high or low is confirmed.
/*-----------------------------+
| |
| 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[];
int OldLastZigZag, OldPreviousZigZag;
//+------------------------------------------------------------------+
//| 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("Fibodrawer");
//---- 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;
int h=0;
while ( ExtMapBuffer[h]==0 && ExtMapBuffer2[h]==0) {
h++;
}
LastZigZag=h;
h++;
while(ExtMapBuffer[h]==0 && ExtMapBuffer2[h]==0) {
h++;
}
PreviousZigZag=h;
if (OldLastZigZag!=LastZigZag || OldPreviousZigZag!=PreviousZigZag) {
OldLastZigZag=LastZigZag;
OldPreviousZigZag=PreviousZigZag;
ObjectDelete("Fibo");
ObjectCreate("Fibo", OBJ_FIBO, 0, Time[PreviousZigZag], ExtMapBuffer[LastZigZag], Time[LastZigZag], ExtMapBuffer[PreviousZigZag]);
Alert("New ZigZag and new Fibo drawn");
PlaySound("alert.wav");
}
}
Comments