ZigZag_Fibo_v2beta_001
Download scriptThis tool is designed to automatically identify significant price turning points on a trading chart and project Fibonacci retracement levels based on the most recent market movement. It simplifies the process of technical analysis by identifying "peaks" and "valleys" in real-time without requiring manual drawing.
Core Logic and Functionality
1. Identifying Key Price Points The script continuously scans historical price data to find significant highs and lows. Instead of reacting to every minor fluctuation, it uses specific filters—Depth, Deviation, and Backstep—to ensure it only captures meaningful structural changes in the market.
- Smoothing: It filters out "noise" by checking how far the price has moved relative to a set deviation.
- Verification: It compares current points against very recent data to ensure that a peak or valley is actually a reversal rather than just a temporary pause.
2. Dynamic Structure Mapping Once the script identifies these key highs and lows, it performs a "cleaning" pass over the data. This logic ensures that only the most prominent peaks remain visible. For example, if a new high is discovered that is higher than a previous one within the same local trend, the script effectively "erases" the lower peak to maintain a clean, accurate structural path of the price action.
3. Automated Fibonacci Projection The primary objective of the logic is to detect the most recent completed "ZigZag" movement—the distance between the last two major structural points.
- Automatic Detection: The script identifies the exact coordinates (time and price) of the most recent high and low.
- Visual Execution: Whenever a new structural point is confirmed, the script automatically deletes the previous drawing and creates a fresh Fibonacci retracement object on the chart.
4. Real-Time Alerts To keep the trader informed, the logic includes an automated notification system. Every time the market completes a significant move and the script generates a new Fibonacci structure, it triggers a visual alert and an audible sound. This allows traders to react immediately to new price targets and retracement levels without having to constantly monitor the screen for manual updates.
// 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