BreakOut_PANCA_EAGLE__indicator_v1
Download scriptThis script is a visual trading tool designed to help and analyze historical price action by automatically plotting specific zones on your chart. It focuses on identifying the highest and lowest prices reached during a predetermined timeframe each day, which helps traders visualize "breakout" levels or significant support and resistance zones.
Core Functionality
The logic operates by scanning back through a user-defined number of days (defaulting to 50) to identify price volatility within specific windows. It then draws four distinct types of visual markers (rectangles) for each day:
- High-Low Range: The script identifies the absolute highest and lowest prices during your specified morning session. It then draws a shaded box covering this entire range, providing a clear visual of the "trading corridor" for that period.
- Breakout Zones: It creates two small, specific boxes at the very top (High) and bottom (Low) of the identified range. These are slightly offset from the actual price to clearly mark the boundaries where a "breakout" would occur.
- The Session Period: A separate highlighted box is drawn to represent the full duration of the specific time window you are interested in tracking.
Key Features for the User
- Customizable Timeframes: You can define exactly which hours of the day you want the script to analyze (for example, a morning session) and how far into the future or past the boxes should extend.
- Automated Historical Data: Instead of manually drawing lines every day, the script automatically calculates and places these markers for dozens of previous days instantly. This allows for quick visual "backtesting" to see how often price has broken out of these historical zones.
- Clean Visual Organization: The logic includes a specific "offset" feature that prevents the boxes from overlapping one another. This ensures that the labels and colors remain distinct and readable, even when multiple days of data are visible on the screen at once.
- Data Transparency: Each zone plotted on the chart includes a text description that displays the exact high and low price levels used for that calculation, ensuring there is no guesswork regarding the script's logic.
Practical Application
For a trader, this tool simplifies the process of identifying "Price Action." By looking at where these boxes appear over 50 days, you can quickly see if certain prices act as recurring barriers or if breakouts from specific morning sessions consistently lead to significant moves in the opposite direction.
//+------------------------------------------------------------------+
//| BreakOutPANCA-EAGLE.mq4 |
//| hapalkos |
//| 2007.11.20 |
//| ++ modified so that rectangles do not overlay |
//| ++ this makes color selection more versatile |
//| ++ code consolidated |
//+------------------------------------------------------------------+
#property copyright "hapalkos"
#property link ""
#property indicator_chart_window
//----
extern int NumberOfDays=50;
extern string periodBegin ="00:00";
extern string periodEnd ="05:30";
extern string BoxEnd ="23:00";
extern int BoxBreakOut_Offset=10;
extern color BoxHLColor =MidnightBlue;
extern color BoxBreakOutColor =LimeGreen;
extern color BoxPeriodColor =OrangeRed;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
void init()
{
DeleteObjects();
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
void deinit()
{
DeleteObjects();
return(0);
}
//+------------------------------------------------------------------+
//| Remove all Rectangles |
//+------------------------------------------------------------------+
void DeleteObjects()
{
ObjectsDeleteAll(0,OBJ_RECTANGLE);
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
void start()
{
datetime dtTradeDate=TimeCurrent();
for(int i=0; i<NumberOfDays; i++) {
//----
DrawObjects(dtTradeDate, "BoxHL " + TimeToStr(dtTradeDate,TIME_DATE), periodBegin, periodEnd, BoxEnd, BoxHLColor, 0, 1);
DrawObjects(dtTradeDate, "BoxBreakOut_High " + TimeToStr(dtTradeDate,TIME_DATE), periodBegin, periodEnd, BoxEnd, BoxBreakOutColor, BoxBreakOut_Offset,2);
DrawObjects(dtTradeDate, "BoxBreakOut_Low " + TimeToStr(dtTradeDate,TIME_DATE), periodBegin, periodEnd, BoxEnd, BoxBreakOutColor, BoxBreakOut_Offset,3);
DrawObjects(dtTradeDate, "BoxPeriod " + TimeToStr(dtTradeDate,TIME_DATE), periodBegin, periodEnd, periodEnd, BoxPeriodColor, BoxBreakOut_Offset,4);
dtTradeDate=decrementTradeDate(dtTradeDate);
while(TimeDayOfWeek(dtTradeDate) > 5) dtTradeDate=decrementTradeDate(dtTradeDate);
}
}
//+------------------------------------------------------------------+
//| Create Rectangles |
//+------------------------------------------------------------------+
void DrawObjects(datetime dtTradeDate, string sObjName, string sTimeBegin, string sTimeEnd, string sTimeObjEnd, color cObjColor, int iOffSet, int iForm)
{
datetime dtTimeBegin, dtTimeEnd, dtTimeObjEnd;
double dPriceHigh, dPriceLow;
int iBarBegin, iBarEnd;
//----
dtTimeBegin=StrToTime(TimeToStr(dtTradeDate, TIME_DATE) + " " + sTimeBegin);
dtTimeEnd=StrToTime(TimeToStr(dtTradeDate, TIME_DATE) + " " + sTimeEnd);
dtTimeObjEnd=StrToTime(TimeToStr(dtTradeDate, TIME_DATE) + " " + sTimeObjEnd);
//----
iBarBegin=iBarShift(NULL, 0, dtTimeBegin);
iBarEnd=iBarShift(NULL, 0, dtTimeEnd);
dPriceHigh=High[Highest(NULL, 0, MODE_HIGH, iBarBegin-iBarEnd, iBarEnd)];
dPriceLow=Low [Lowest (NULL, 0, MODE_LOW , iBarBegin-iBarEnd, iBarEnd)];
//----
ObjectCreate(sObjName, OBJ_RECTANGLE, 0, 0, 0, 0, 0);
ObjectSet(sObjName, OBJPROP_TIME1 , dtTimeBegin);
ObjectSet(sObjName, OBJPROP_TIME2 , dtTimeObjEnd);
//---- High-Low Rectangle
if(iForm==1)
{
ObjectSet(sObjName, OBJPROP_PRICE1, dPriceHigh);
ObjectSet(sObjName, OBJPROP_PRICE2, dPriceLow);
ObjectSet(sObjName, OBJPROP_STYLE, STYLE_SOLID);
ObjectSet(sObjName, OBJPROP_COLOR, cObjColor);
ObjectSet(sObjName, OBJPROP_BACK, True);
}
//---- Upper Rectangle
if(iForm==2)
{
ObjectSet(sObjName, OBJPROP_PRICE1, dPriceHigh);
ObjectSet(sObjName, OBJPROP_PRICE2, dPriceHigh + iOffSet*Point);
ObjectSet(sObjName, OBJPROP_STYLE, STYLE_SOLID);
ObjectSet(sObjName, OBJPROP_COLOR, cObjColor);
ObjectSet(sObjName, OBJPROP_BACK, True);
}
//---- Lower Rectangle
if(iForm==3)
{
ObjectSet(sObjName, OBJPROP_PRICE1, dPriceLow - iOffSet*Point);
ObjectSet(sObjName, OBJPROP_PRICE2, dPriceLow);
ObjectSet(sObjName, OBJPROP_STYLE, STYLE_SOLID);
ObjectSet(sObjName, OBJPROP_COLOR, cObjColor);
ObjectSet(sObjName, OBJPROP_BACK, True);
}
//---- Period Rectangle
if(iForm==4)
{
ObjectSet(sObjName, OBJPROP_PRICE1, dPriceHigh + iOffSet*Point);
ObjectSet(sObjName, OBJPROP_PRICE2, dPriceLow - iOffSet*Point);
ObjectSet(sObjName, OBJPROP_STYLE, STYLE_SOLID);
ObjectSet(sObjName, OBJPROP_COLOR, cObjColor);
ObjectSet(sObjName, OBJPROP_WIDTH, 2);
ObjectSet(sObjName, OBJPROP_BACK, False);
}
string sObjDesc=StringConcatenate("High: ",dPriceHigh," Low: ", dPriceLow, " OffSet: ",iOffSet);
ObjectSetText(sObjName, sObjDesc,10,"Times New Roman",Black);
}
//+------------------------------------------------------------------+
//| Decrement Date to draw objects in the past |
//+------------------------------------------------------------------+
datetime decrementTradeDate (datetime dtTimeDate)
{
int iTimeYear=TimeYear(dtTimeDate);
int iTimeMonth=TimeMonth(dtTimeDate);
int iTimeDay=TimeDay(dtTimeDate);
int iTimeHour=TimeHour(dtTimeDate);
int iTimeMinute=TimeMinute(dtTimeDate);
//----
iTimeDay--;
if (iTimeDay==0)
{
iTimeMonth--;
if (iTimeMonth==0)
{
iTimeYear--;
iTimeMonth=12;
}
// Thirty days hath September...
if (iTimeMonth==4 || iTimeMonth==6 || iTimeMonth==9 || iTimeMonth==11) iTimeDay=30;
// ...all the rest have thirty-one...
if (iTimeMonth==1 || iTimeMonth==3 || iTimeMonth==5 || iTimeMonth==7 || iTimeMonth==8 || iTimeMonth==10 || iTimeMonth==12) iTimeDay=31;
// ...except...
if (iTimeMonth==2) if (MathMod(iTimeYear, 4)==0) iTimeDay=29; else iTimeDay=28;
}
return(StrToTime(iTimeYear + "." + iTimeMonth + "." + iTimeDay + " " + iTimeHour + ":" + iTimeMinute));
}
//+------------------------------------------------------------------+
Comments