SpudFibo
Download scriptOverview of the Fibonacci Tool Logic
This script is designed to automatically generate and manage three distinct sets of Fibonacci retracement levels on your trading chart. Instead of requiring you to manually identify high and low points, the tool automatically calculates these values based on daily price action to help visualize potential support and resistance zones.
Core Functional Logic
1. Automated Data Retrieval The script constantly monitors the daily price history. It specifically looks for the "High" and "Low" prices from the previous trading day. To ensure accuracy, it includes a special check for weekends: if the previous day was a Sunday, the script automatically combines the high and low data from both Saturday and Sunday to create a more comprehensive range.
2. Triple Fibonacci Projection The tool creates three separate visual layers on your chart:
- Upper Projection (Bullish): This draws a Fibonacci sequence starting from the previous day's high and extending upwards based on the total price range of that day. It provides 15 different levels, allowing you to see potential expansion targets for upward-moving trends.
- Lower Projection (Bearish): Similar to the upper projection, this starts from the previous day's low and extends downwards. It provides 19 different levels, helping identify deep retracement zones or further downside targets during a bearish move.
- Inner Projection (The Core Range): This is an optional "inner" Fibonacci tool. If enabled, it plots the standard Fibonacci levels between yesterday's high and low. It specifically labels the 0% level as "Yesterday Low" and the 100% level as "Yesterday High," allowing you to see the immediate trading range for the current day.
3. Visual Customization & Organization The script is organized to keep your chart clean and readable:
- Layering: All Fibonacci objects are set to appear in the background of your chart so they do not obstruct your view of price candles.
- Infinite Extension: The lines are set to "Ray" mode, meaning they project forward infinitely into the future rather than stopping at a specific date.
- Dynamic Updates: As new daily data becomes available, the script automatically updates the prices and time coordinates of these lines without needing to be restarted.
Summary for the User
Essentially, this tool eliminates the manual work of drawing Fibonacci levels every day. By calculating the range from yesterday's performance, it provides you with a "map" of where the price might find support or face resistance today, projecting both how far the market could pull back into yesterday's range and how far it could extend beyond it.
//+------------------------------------------------------------------+
//| #SpudFibo.mq4
//+------------------------------------------------------------------+
#property indicator_chart_window
//----
extern string note1="Fibonacci colors";
extern color UpperFiboColor=Navy;
extern color MainFiboColor=RoyalBlue;
extern color LowerFiboColor=DodgerBlue;
extern string note2="Draw main Fibonacci lines?";
extern bool InnerFibs=true;
//----
double HiPrice, LoPrice, Range;
datetime StartTime;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int init()
{
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int deinit()
{
ObjectDelete("FiboUp");
ObjectDelete("FiboDn");
ObjectDelete("FiboIn");
return(0);
}
//+------------------------------------------------------------------+
//| Draw Fibo
//+------------------------------------------------------------------+
int DrawFibo()
{
if(ObjectFind("FiboUp")==-1)
ObjectCreate("FiboUp",OBJ_FIBO,0,StartTime,HiPrice+Range,StartTime,HiPrice);
else
{
ObjectSet("FiboUp",OBJPROP_TIME2, StartTime);
ObjectSet("FiboUp",OBJPROP_TIME1, StartTime);
ObjectSet("FiboUp",OBJPROP_PRICE1,HiPrice+Range);
ObjectSet("FiboUp",OBJPROP_PRICE2,HiPrice);
}
ObjectSet("FiboUp",OBJPROP_LEVELCOLOR,UpperFiboColor);
ObjectSet("FiboUp",OBJPROP_FIBOLEVELS,13);
ObjectSet("FiboUp",OBJPROP_FIRSTLEVEL+0,0.0); ObjectSetFiboDescription("FiboUp",0,"(100.0%) - %$");
ObjectSet("FiboUp",OBJPROP_FIRSTLEVEL+1,0.236); ObjectSetFiboDescription("FiboUp",1,"(123.6%) - %$");
ObjectSet("FiboUp",OBJPROP_FIRSTLEVEL+2,0.382); ObjectSetFiboDescription("FiboUp",2,"(138.2%) - %$");
ObjectSet("FiboUp",OBJPROP_FIRSTLEVEL+3,0.500); ObjectSetFiboDescription("FiboUp",3,"(150.0%) - %$");
ObjectSet("FiboUp",OBJPROP_FIRSTLEVEL+4,0.618); ObjectSetFiboDescription("FiboUp",4,"(161.8%) - %$");
ObjectSet("FiboUp",OBJPROP_FIRSTLEVEL+5,0.764); ObjectSetFiboDescription("FiboUp",5,"(176.4%) - %$");
ObjectSet("FiboUp",OBJPROP_FIRSTLEVEL+6,1.000); ObjectSetFiboDescription("FiboUp",6,"(200.0%) - %$");
ObjectSet("FiboUp",OBJPROP_FIRSTLEVEL+7,1.236); ObjectSetFiboDescription("FiboUp",7,"(223.6%) - %$");
ObjectSet("FiboUp",OBJPROP_FIRSTLEVEL+8,1.500); ObjectSetFiboDescription("FiboUp",8,"(250.0%) - %$");
ObjectSet("FiboUp",OBJPROP_FIRSTLEVEL+9,1.618); ObjectSetFiboDescription("FiboUp",9,"(261.8%) - %$");
ObjectSet("FiboUp",OBJPROP_FIRSTLEVEL+10,2.000); ObjectSetFiboDescription("FiboUp",10,"(300.0%) - %$");
ObjectSet("FiboUp",OBJPROP_FIRSTLEVEL+11,2.500); ObjectSetFiboDescription("FiboUp",11,"(350.0%) - %$");
ObjectSet("FiboUp",OBJPROP_FIRSTLEVEL+12,3.000); ObjectSetFiboDescription("FiboUp",12,"(400.0%) - %$");
ObjectSet("FiboUp",OBJPROP_FIRSTLEVEL+13,3.500); ObjectSetFiboDescription("FiboUp",13,"(450.0%) - %$");
ObjectSet("FiboUp",OBJPROP_FIRSTLEVEL+14,4.000); ObjectSetFiboDescription("FiboUp",14,"(500.0%) - %$");
ObjectSet("FiboUp",OBJPROP_RAY,true);
ObjectSet("FiboUp",OBJPROP_BACK,true);
if(ObjectFind("FiboDn")==-1)
ObjectCreate("FiboDn",OBJ_FIBO,0,StartTime,LoPrice-Range,StartTime,LoPrice);
else
{
ObjectSet("FiboDn",OBJPROP_TIME2, StartTime);
ObjectSet("FiboDn",OBJPROP_TIME1, StartTime);
ObjectSet("FiboDn",OBJPROP_PRICE1,LoPrice-Range);
ObjectSet("FiboDn",OBJPROP_PRICE2,LoPrice);
}
ObjectSet("FiboDn",OBJPROP_LEVELCOLOR,LowerFiboColor);
ObjectSet("FiboDn",OBJPROP_FIBOLEVELS,19);
ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+0,0.0); ObjectSetFiboDescription("FiboDn",0,"(0.0%) - %$");
ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+1,0.236); ObjectSetFiboDescription("FiboDn",1,"(-23.6%) - %$");
ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+2,0.382); ObjectSetFiboDescription("FiboDn",2,"(-38.2%) - %$");
ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+3,0.500); ObjectSetFiboDescription("FiboDn",3,"(-50.0%) - %$");
ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+4,0.618); ObjectSetFiboDescription("FiboDn",4,"(-61.8%) - %$");
ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+5,0.764); ObjectSetFiboDescription("FiboDn",5,"(-76.4%) - %$");
ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+6,1.000); ObjectSetFiboDescription("FiboDn",6,"(-100.0%) - %$");
ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+7,1.236); ObjectSetFiboDescription("FiboDn",7,"(-123.6%) - %$");
ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+8,1.382); ObjectSetFiboDescription("FiboDn",8,"(-138.2%) - %$");
ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+9,1.500); ObjectSetFiboDescription("FiboDn",9,"(-150.0%) - %$");
ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+10,1.618); ObjectSetFiboDescription("FiboDn",10,"(-161.8%) - %$");
ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+11,1.764); ObjectSetFiboDescription("FiboDn",11,"(-176.4%) - %$");
ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+12,2.000); ObjectSetFiboDescription("FiboDn",12,"(-200.0%) - %$");
ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+13,2.500); ObjectSetFiboDescription("FiboDn",13,"(-250.0%) - %$");
ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+14,3.000); ObjectSetFiboDescription("FiboDn",14,"(-300.0%) - %$");
ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+15,3.500); ObjectSetFiboDescription("FiboDn",15,"(-350.0%) - %$");
ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+16,4.000); ObjectSetFiboDescription("FiboDn",16,"(-400.0%) - %$");
ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+17,4.500); ObjectSetFiboDescription("FiboDn",17,"(-450.0%) - %$");
ObjectSet("FiboDn",OBJPROP_FIRSTLEVEL+18,5.000); ObjectSetFiboDescription("FiboDn",18,"(-500.0%) - %$");
ObjectSet("FiboDn",OBJPROP_RAY,true);
ObjectSet("FiboDn",OBJPROP_BACK,true);
if(InnerFibs)
{
if(ObjectFind("FiboIn")==-1)
ObjectCreate("FiboIn",OBJ_FIBO,0,StartTime,HiPrice,StartTime+PERIOD_D1*60,LoPrice);
else
{
ObjectSet("FiboIn",OBJPROP_TIME2, StartTime);
ObjectSet("FiboIn",OBJPROP_TIME1, StartTime+PERIOD_D1*60);
ObjectSet("FiboIn",OBJPROP_PRICE1,HiPrice);
ObjectSet("FiboIn",OBJPROP_PRICE2,LoPrice);
}
ObjectSet("FiboIn",OBJPROP_LEVELCOLOR,MainFiboColor);
ObjectSet("FiboIn",OBJPROP_FIBOLEVELS,7);
ObjectSet("FiboIn",OBJPROP_FIRSTLEVEL+0,0.0); ObjectSetFiboDescription("FiboIn",0,"Yesterday LOW (0.0) - %$");
ObjectSet("FiboIn",OBJPROP_FIRSTLEVEL+1,0.236); ObjectSetFiboDescription("FiboIn",1,"(23.6) - %$");
ObjectSet("FiboIn",OBJPROP_FIRSTLEVEL+2,0.382); ObjectSetFiboDescription("FiboIn",2,"(38.2) - %$");
ObjectSet("FiboIn",OBJPROP_FIRSTLEVEL+3,0.500); ObjectSetFiboDescription("FiboIn",3,"(50.0) - %$");
ObjectSet("FiboIn",OBJPROP_FIRSTLEVEL+4,0.618); ObjectSetFiboDescription("FiboIn",4,"(61.8) - %$");
ObjectSet("FiboIn",OBJPROP_FIRSTLEVEL+5,0.764); ObjectSetFiboDescription("FiboIn",5,"(76.4) - %$");
ObjectSet("FiboIn",OBJPROP_FIRSTLEVEL+6,1.000); ObjectSetFiboDescription("FiboIn",6,"Yesterday HIGH (100.0) - %$");
ObjectSet("FiboIn",OBJPROP_RAY,true);
ObjectSet("FiboIn",OBJPROP_BACK,true);
}
else
ObjectDelete("FiboIn");
}
//+------------------------------------------------------------------+
//| Indicator start function
//+------------------------------------------------------------------+
int start()
{
int shift =iBarShift(NULL,PERIOD_D1,Time[0]) + 1; // yesterday
HiPrice =iHigh(NULL,PERIOD_D1,shift);
LoPrice =iLow (NULL,PERIOD_D1,shift);
StartTime =iTime(NULL,PERIOD_D1,shift);
if(TimeDayOfWeek(StartTime)==0/*Sunday*/)
{//Add fridays high and low
HiPrice=MathMax(HiPrice,iHigh(NULL,PERIOD_D1,shift+1));
LoPrice=MathMin(LoPrice,iLow(NULL,PERIOD_D1,shift+1));
}
Range=HiPrice-LoPrice;
DrawFibo();
//----
return(0);
}
//+------------------------------------------------------------------+
Comments