fibocalc_V31_v1
Download scriptThis script is designed for traders who use historical price data to identify key entry points and risk management levels on a trading chart. It specifically focuses on analyzing the price action of the previous trading day to provide visual cues for current opportunities.
Core Logic Overview
The script performs three primary functions: tracking historical daily milestones, calculating Fibonacci-based trade levels, and providing real-time trade analytics.
1. Historical Data Tracking
The tool automatically scans past price history to identify the high, low, opening, and closing prices of the previous trading day. It stores these values and projects them onto your current chart as clearly labeled lines and text markers. This allows you to see at a glance where the market moved yesterday relative to where it is moving today.
2. Dynamic Trade Level Calculation
Based on the price range established during the previous day (the difference between the high and the low), the script uses Fibonacci ratios to calculate specific trade zones. Depending on the current market direction, it performs two different calculations:
- For Buy Opportunities: If the current price is trading above the previous day's close, the script identifies a "Buy Level." It then projects several potential profit targets and a specific stop-loss level based on Fibonacci proportions.
- For Sell Opportunities: If the current price is trading below the previous day's close, it identifies a "Sell Level" and calculates corresponding profit targets and stop-loss levels.
3. Visual Aids and Automated Analytics
To make these calculations actionable for the user, the script performs the following visual actions:
- On-Chart Marking: It draws horizontal lines for your Buy/Sell entries, Stop Loss (orange-red), and three distinct Profit Targets (green).
- Real-Time Feedback: The script calculates the "Risk-to-Reward Ratio" for every profit target.
- Trade Validation: In the corner of your chart, it displays a summary comment. It checks if the risk-to-reward ratio meets a specific threshold (greater than 2). If the ratios are favorable, it labels the opportunity as an "OK Trade"; if not, it warns you that it is a "NO TRADE," helping you avoid low-probability setups.
Summary of Visual Components
- Day High/Low/Open/Close: Markers showing yesterday's performance.
- Buy/Sell Level: The suggested entry price for a new position.
- Stop Loss Level: The point at which the trade should be closed to limit losses.
- Profit Targets 1, 2, and 3: Three different exit points based on Fibonacci expansions.
- Comment Box: A summary of your account details, the trend direction, and a "Go/No-Go" signal based on the calculated math.
/*+------------------------------------------------------------------+
| fibo
| Author: Copyright © 2006,
|
|
+------------------------------------------------------------------+*/
#property copyright "Copyright © 2006,"
#property link "http://www.metaquotes.net"
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 DarkGreen
#property indicator_color2 Maroon
#property indicator_color3 Yellow
#property indicator_color4 Goldenrod
//---- input parameters
//---- buffers
double PrevDayHiBuffer[];
double PrevDayLoBuffer[];
double PrevDayOpenBuffer[];
double PrevDayCloseBuffer[];
int fontsize=8;
double PrevDayHi, PrevDayLo, PrevDayOpen , PrevDayClose,fb,fs,fe,tp1,tp2,tp3;
double LastHigh,LastLow,LastOpen,LastClose,x;
double ri,re1,re2,re3,ra1,ra2,ra3;
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//---- TODO: add your code here
ObjectDelete("PrevDayHi");
ObjectDelete("PrevDayLo");
ObjectDelete("PrevDayOpen");
ObjectDelete("PrevDayClose");
ObjectDelete("fe");ObjectDelete("fe Line");
ObjectDelete("fs");ObjectDelete("fs Line");
ObjectDelete("tp3");ObjectDelete("tp3 Line");
ObjectDelete("tp2");ObjectDelete("tp2 Line");
ObjectDelete("tp1");ObjectDelete("tp1 Line");
ObjectDelete("fb");ObjectDelete("fb Line");
// ObjectsDeleteAll();
// Not a good idea to use ObjectDeleteAll function.
// It will delete ALL object on the chart
// not just the ones created by this indicator
//
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
//---- indicator line
SetIndexStyle(0,DRAW_LINE);
SetIndexStyle(1,DRAW_LINE);
SetIndexStyle(2,DRAW_LINE);
SetIndexStyle(3,DRAW_LINE);
SetIndexBuffer(0, PrevDayHiBuffer);
SetIndexBuffer(1, PrevDayLoBuffer);
SetIndexBuffer(2, PrevDayOpenBuffer);
SetIndexBuffer(3, PrevDayCloseBuffer);
//---- name for DataWindow and indicator subwindow label
short_name="Prev Hi-Lo levels";
IndicatorShortName(short_name);
SetIndexLabel(0, short_name);
//----
SetIndexDrawBegin(0,1);
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start() {
int counted_bars=IndicatorCounted();
int limit, i;
//---- indicator calculation
if (counted_bars==0)
{
x=Period();
if (x>240) return(-1);
//---- last counted bar will be recounted
// if(counted_bars>0) counted_bars--;
}
limit=(Bars-counted_bars)-1;
for (i=limit; i>=0;i--)
{
LastHigh=High[Highest(NULL,0,MODE_HIGH,i+1)];
LastLow=Low[Lowest(NULL,0,MODE_LOW,i+1)];
if (Open[i+1]>LastOpen) LastOpen=Open[i+1];
//Print("TimeDay(Time[i]=",TimeDay(Time[i]),"TimeDay(Time[i+1])",TimeDay(Time[i+1]));
if (TimeDay(Time[i])!=TimeDay(Time[i+1]))
{
RefreshRates( ) ;
PrevDayHi=LastHigh;
PrevDayLo=LastLow;
PrevDayOpen=LastClose;
PrevDayClose=Open[i];
LastLow=Open[i];
LastHigh=Open[i];
LastOpen=Open[i];
LastClose=Open[i];
if(ObjectFind("PrevDayHi") != 0)
{
ObjectCreate("PrevDayHi", OBJ_TEXT, 0, 0, 0);
ObjectSetText("PrevDayHi", " Day High",fontsize,"Arial", White);
}
else
{
ObjectMove("PrevDayHi", 0, Time[i], PrevDayHi);
}
if(ObjectFind("PrevDayLo") != 0)
{
ObjectCreate("PrevDayLo", OBJ_TEXT, 0, 0, 0);
ObjectSetText("PrevDayLo", " Day Low",fontsize,"Arial", White);
}
else
{
ObjectMove("PrevDayLo", 0, Time[i], PrevDayLo);
}
if(ObjectFind("PrevDayOpen") != 0)
{
ObjectCreate("PrevDayOpen", OBJ_TEXT, 0, 0, 0);
ObjectSetText("PrevDayOpen", " Prev. Day Open",fontsize,"Arial", White);
}
else
{
ObjectMove("PrevDayOpen", 0, Time[i], PrevDayOpen);
}
if(ObjectFind("PrevDayClose") != 0)
{
ObjectCreate("PrevDayClose", OBJ_TEXT, 0, 0, 0);
ObjectSetText("PrevDayClose", " Prev. Day Close",fontsize,"Arial", White);
}
else
{
ObjectMove("PrevDayClose", 0, Time[i], PrevDayClose);
}
}
PrevDayHiBuffer[i]=PrevDayHi;
PrevDayLoBuffer[i]=PrevDayLo;
PrevDayOpenBuffer[i]=PrevDayOpen;
PrevDayCloseBuffer[i]=PrevDayClose;
}
// BUY
if (Ask > LastClose) {
fb= PrevDayHi-(PrevDayHi-PrevDayLo)*0.382;
fe= PrevDayHi-(PrevDayHi-PrevDayLo)*0.618;
tp1=((PrevDayHi-PrevDayLo)*0.618)+fb;
tp2=(PrevDayHi-PrevDayLo)+fb;
tp3=1.618*(PrevDayHi-PrevDayLo)+fb;
ri=MathRound((+fb-fe)*10000)/10000;
re1=MathRound((+tp1-fb)*10000)/10000;
re2=MathRound((+tp2-fb)*10000)/10000;
re3=MathRound((+tp3-fb)*10000)/10000;
ra1=MathRound((+re1/ri)*10)/10;
ra2=MathRound((+re2/ri)*10)/10;
ra3=MathRound((+re3/ri)*10)/10;
RefreshRates( ) ;
if(ObjectFind("fb") != 0)
{
ObjectCreate("fb", OBJ_TEXT, 0, Time[0], fb);
ObjectSetText("fb", " BUY LEVEL", 8, "Arial", EMPTY);
}
else
{
ObjectMove("fb",fb, Time[0], fb);
}
if(ObjectFind("fb Line") != 0)
{
ObjectCreate("fb Line", OBJ_HLINE, 0, Time[0],fb);
ObjectSet("fb Line", OBJPROP_STYLE, STYLE_DASHDOT);
ObjectSet("fb Line", OBJPROP_COLOR, Blue);
}
else
{
ObjectMove("fb Line",0, Time[0], fb);
}
if((ra1>2)&&(ra2>2)&&(ra3>2))
Comment("Owner : ", AccountName()," Account number : ", AccountNumber(),
"\n\nPrevDayHi ",PrevDayHi,"\nPrevDayLo ", PrevDayLo,"\nTrend was UP ",
"\nBUY @ ",fb ,"\nStopLoss ",fe,"\nTakeProit 1 ",tp1 ,
" Risk/Reward Ratio : ", ra1 ," OK Trade ","\nTakeProit 2 ",tp2 ,
" Risk/Reward Ratio : ", ra2 ," OK Trade ","\nTakeProit 3 ",tp3,
" Risk/Reward Ratio : ", ra3 ," OK Trade ");
else
Comment("Owner : ", AccountName()," Account number : ", AccountNumber(),
"\n\nPrevDayHi ",PrevDayHi,"\nPrevDayLo ", PrevDayLo,"\nTrend was UP ",
"\nBUY @ ",fb ,"\nStopLoss ",fe,"\nTakeProit 1 ",tp1 ,
" Risk/Reward Ratio : ", ra1 ," NO TRADE ","\nTakeProit 2 ",tp2 ,
" Risk/Reward Ratio : ", ra2 ," NO TRADE ","\nTakeProit 3 ",tp3,
" Risk/Reward Ratio : ", ra3 ," NO TRADE ");
}
// SELL
if (Bid < LastClose) {
fs=(PrevDayHi-PrevDayLo)*0.382+(PrevDayLo);
fe=(PrevDayHi-PrevDayLo)*0.618+(PrevDayLo);
tp1=((PrevDayLo-PrevDayHi)*0.618)+fs;
tp2=(PrevDayLo-PrevDayHi)+fs;
tp3=1.618*(PrevDayLo-PrevDayHi)+fs;
ri=MathRound((+fs-fe)*10000)/10000;
re1=MathRound((+tp1-fs)*10000)/10000;
re2=MathRound((+tp2-fs)*10000)/10000;
re3=MathRound((+tp3-fs)*10000)/10000;
ra1=MathRound((+re1/ri)*10)/10;
ra2=MathRound((+re2/ri)*10)/10;
ra3=((+re3/ri)*10)/10;
RefreshRates( ) ;
if(ObjectFind("fs") != 0)
{
ObjectCreate("fs", OBJ_TEXT, 0, Time[0], fs);
ObjectSetText("fs", " SELL LEVEL", 8, "Arial", EMPTY);
}
else
{
ObjectMove("fs",fs, Time[0], fs);
}
if(ObjectFind("fs Line") != 0)
{
ObjectCreate("fs Line", OBJ_HLINE, 0, Time[0],fs);
ObjectSet("fs Line", OBJPROP_STYLE, STYLE_DASHDOT);
ObjectSet("fs Line", OBJPROP_COLOR, Red);
}
else
{
ObjectMove("fs Line",0, Time[0], fs);
}
if((ra1>2)&&(ra2>2)&&(ra3>2))
Comment("Owner : ", AccountName(),"Account number : ", AccountNumber(),
"\n\nPrevDayHi ",PrevDayHi,"\nPrevDayLo ", PrevDayLo,"\nTrend was Down ",
"\nSELL @ ",fs ,"\nStopLoss ",fe,"\nTakeProit 1 ",tp1 ,
" Risk/Reward Ratio : ", ra1 ," OK Trade ","\nTakeProit 2 ",tp2 ,
" Risk/Reward Ratio : ", ra2 ," OK Trade ","\nTakeProit 3 ",tp3,
" Risk/Reward Ratio : ", ra3 ," OK Trade ");
else
Comment("Owner : ", AccountName(),"Account number : ", AccountNumber(),
"\n\nPrevDayHi ",PrevDayHi,"\nPrevDayLo ", PrevDayLo,"\nTrend was Down ",
"\nSELL @ ",fs ,"\nStopLoss ",fe,"\nTakeProit 1 ",tp1 ,
" Risk/Reward Ratio : ", ra1 ," NO TRADE ","\nTakeProit 2 ",tp2 ,
" Risk/Reward Ratio : ", ra2 ," NO TRADE ","\nTakeProit 3 ",tp3,
" Risk/Reward Ratio : ", ra3 ," NO TRADE ");
}
if(ObjectFind("fe") != 0)
{
ObjectCreate("fe", OBJ_TEXT, 0, Time[0], fe);
ObjectSetText("fe", " STOPLOSS LEVEL", 8, "Arial", EMPTY);
}
else
{
ObjectMove("fe",fe, Time[0], fe);
}
if(ObjectFind("fe Line") != 0)
{
ObjectCreate("fe Line", OBJ_HLINE, 0, Time[0],fe);
ObjectSet("fe Line", OBJPROP_STYLE, STYLE_DASHDOT);
ObjectSet("fe Line", OBJPROP_COLOR,OrangeRed );
}
else
{
ObjectMove("fe Line",0, Time[0], fe);
}
if(ObjectFind("tp1") != 0)
{
ObjectCreate("tp1", OBJ_TEXT, 0, Time[0], tp1);
ObjectSetText("tp1", " PROFIT TARGET 1", 8, "Arial", EMPTY);
}
else
{
ObjectMove("tp1",tp1, Time[0],tp1 );
}
if(ObjectFind("tp1 Line") != 0)
{
ObjectCreate("tp1 Line", OBJ_HLINE, 0, Time[0],tp1);
ObjectSet("tp1 Line", OBJPROP_STYLE, STYLE_DASHDOTDOT);
ObjectSet("tp1 Line", OBJPROP_COLOR,SpringGreen );
}
else
{
ObjectMove("tp1 Line",0, Time[0],tp1 );
}
if(ObjectFind("tp2") != 0)
{
ObjectCreate("tp2", OBJ_TEXT, 0, Time[0], tp2);
ObjectSetText("tp2", " PROFIT TARGET 2", 8, "Arial", EMPTY);
}
else
{
ObjectMove("tp2",tp2, Time[0],tp2);
}
if(ObjectFind("tp2 Line") != 0)
{
ObjectCreate("tp2 Line", OBJ_HLINE, 0, Time[0],tp2);
ObjectSet("tp2 Line", OBJPROP_STYLE, STYLE_DASHDOTDOT);
ObjectSet("tp2 Line", OBJPROP_COLOR,SpringGreen );
}
else
{
ObjectMove("tp2 Line",0, Time[0],tp2);
}
if(ObjectFind("tp3") != 0)
{
ObjectCreate("tp3", OBJ_TEXT, 0, Time[0], tp3);
ObjectSetText("tp3", " PROFIT TARGET 3", 8, "Arial", EMPTY);
}
else
{
ObjectMove("tp3",tp3, Time[0],tp3);
}
if(ObjectFind("tp3 Line") != 0)
{
ObjectCreate("tp3 Line", OBJ_HLINE, 0, Time[0],tp3);
ObjectSet("tp3 Line", OBJPROP_STYLE, STYLE_DASHDOTDOT);
ObjectSet("tp3 Line", OBJPROP_COLOR,SpringGreen );
}
else
{
ObjectMove("tp3 Line",0, Time[0],tp3);
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments