Auto Fibo_Coodonates
Download scriptThis automated tool is designed to simplify the technical analysis of financial charts by automatically identifying and plotting Fibonacci retracement levels. Instead of requiring a trader to manually select price peaks and valleys, this script dynamically calculates these coordinates based on historical price action.
How the Logic Works
1. Dynamic Price Tracking The script scans a specific window of recent market history (defined by the "Band Period"). It constantly monitors price fluctuations to determine the highest and lowest points reached during that timeframe. You can choose whether the tool looks at the absolute "High/Low" prices or the "Open/Close" prices of the candles, depending on your preference for accuracy.
2. Automated Trend Detection The tool intelligently distinguishes between upward and downward market trends. It compares current price data against historical data to decide how to orient the Fibonacci levels. By identifying whether the market is currently in a bullish (upward) or bearish (downward) phase, it ensures that the retracement levels are anchored correctly to reflect the most relevant price movement.
3. Real-Time Updates Because the script runs continuously, it updates the Fibonacci object in real-time. As new candles form and prices move, the tool automatically recalculates the boundaries. This means the Fibonacci levels "move" with the market, always staying anchored to the most recent significant price range defined by your settings.
4. Visual Cleanliness The script is designed to manage the chart's visual data efficiently. It places the Fibonacci levels directly on your trading window, providing you with instant visual cues for potential support and resistance zones without the need for constant manual adjustment or complex calculation.
//+------------------------------------------------------------------+
//| Auto Fibo_Coodonates.mq4 |
//| Copyright © 2009, Julien Loutre |
//| http://www.forexcomm.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Julien Loutre"
#property link "http://www.forexcomm.com"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 LightSkyBlue
#property indicator_color2 Plum
extern int Band_Period = 48;
extern int price_type = 0; // 0 = High/Low | 1 = Open/Close
//---- buffers
double WWBuffer1[];
double WWBuffer2[];
double WWBuffer3[];
double ATR;
int init() {
IndicatorBuffers(2);
SetIndexStyle(0,DRAW_LINE,1);
SetIndexStyle(1,DRAW_LINE,1);
SetIndexLabel(0, "High");
SetIndexLabel(1, "Low");
SetIndexBuffer(0, WWBuffer1);
SetIndexBuffer(1, WWBuffer2);
IndicatorDigits(Digits+2);
IndicatorShortName("Automatic Fibonacci");
ObjectCreate("AutoFibo", OBJ_FIBO, 0, Time[0],High[0],Time[0],Low[0]);
return(0);
}
int deinit() {
ObjectDelete("AutoFibo");
}
int start() {
int counted_bars=IndicatorCounted();
int limit,i;
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
for(i=limit-1; i>=0; i--) {
WWBuffer1[i] = getPeriodHigh(Band_Period,i);
WWBuffer2[i] = getPeriodLow(Band_Period,i);
ObjectSet("AutoFibo", OBJPROP_TIME1, Time[Band_Period]);
ObjectSet("AutoFibo", OBJPROP_TIME2, Time[0]);
if (Open[Band_Period] > Open[0]) { // Up
ObjectSet("AutoFibo", OBJPROP_PRICE1, getPeriodHigh(Band_Period,i));
ObjectSet("AutoFibo", OBJPROP_PRICE2, getPeriodLow(Band_Period,i));
} else {
ObjectSet("AutoFibo", OBJPROP_PRICE1, getPeriodLow(Band_Period,i));
ObjectSet("AutoFibo", OBJPROP_PRICE2, getPeriodHigh(Band_Period,i));
}
}
return(0);
}
double getPeriodHigh(int period, int pos) {
int i;
double buffer = 0;
for (i=pos;i<=pos+period;i++) {
if (price_type == 0) {
if (High[i] > buffer) {
buffer = High[i];
}
} else {
if (Open[i] > Close[i]) { // Down
if (Open[i] > buffer) {
buffer = Open[i];
}
} else {
if (Close[i] > buffer) {
buffer = Close[i];
}
}
}
}
return (buffer);
}
double getPeriodLow(int period, int pos) {
int i;
double buffer = 100000;
for (i=pos;i<=pos+period;i++) {
if (price_type == 0) {
if (Low[i] < buffer) {
buffer = Low[i];
}
} else {
if (Open[i] > Close[i]) { // Down
if (Close[i] < buffer) {
buffer = Close[i];
}
} else {
if (Open[i] < buffer) {
buffer = Open[i];
}
}
}
}
return (buffer);
}
Comments