Dolly_v02
Download scriptThis script is designed as a technical analysis tool for traders to identify potential price action zones and structural levels on a trading chart. It focuses primarily on "Breakout Strategies," helping users visualize where the market might shift from one trend to another or where significant price targets might be reached.
Core Logic and Functionality
The script operates by calculating several key price levels based on historical price action. Here is a breakdown of how it handles that data:
1. Dynamic Pivot Point Calculation The tool identifies a central "Pivot" level. It does this by tracking the highest and lowest prices reached during a specific period (until a new day begins). Once a new day starts, it takes the average of the previous day's high, low, and the closing price to establish a baseline for that trading session.
2. Buy and Sell Zones (Momentum Breakouts) Based on the central Pivot point, the script automatically generates specific "Zones" on your chart:
- Entry Areas: It establishes immediate boundaries for potential Buy and Sell entries based on small movements from the Pivot.
- Breakout Targets: It projects further lines to show where a "Break High" or "Break Low" might occur.
- Secondary Targets: It identifies extended zones (further out) to act as secondary profit-taking targets if the momentum continues in one direction.
3. Support and Resistance Levels (Pivot Lines) When enabled by the user, the script calculates standard technical "Pivot Points." These are horizontal lines that represent:
- Resistance (R1, R2, R3): Areas where price faces selling pressure.
- Support (S1, S2, S3): Areas where price finds buying support. The script dynamically draws these lines and labels them on the chart so you can see the "ceiling" and "floor" of the current market price.
4. On-Screen Trading Instructions One of the most user-friendly features of this script is its automated "Comment" system. It translates all the complex math into a simple text box on your screen. This box provides:
- Specific Buy Stop and Sell Stop prices.
- Recommended Take Profit (TP) levels.
- Suggested Stop Loss (SL) placements.
- Warning notes about "Reversal Trades" that the author suggests avoiding, helping to guide the user toward the intended breakout strategy.
Summary for the Trader
Essentially, this tool acts as an automated assistant. It watches the high and low of the previous sessions, calculates where the "fair value" (Pivot) is today, and then draws a roadmap of potential "walls" (Support/Resistance) and "doorways" (Buy/Sell zones). It takes the heavy lifting out of calculating these numbers manually, providing you with clear visual targets and suggested trade parameters directly on your screen.
//+------------------------------------------------------------------+
//| Dolly (the famous sheep) |
//| original indicator is called valasholic13 v2.5.mq4 |
//| |
//| and the original author is valasholic@yahoo.com |
//| |
//| mods and stuff by Linuxser for Forex-TSD |
//| (there is a lot of usefull code inside here)|
//|Credits: hulahula (traslation from original indonesian language) |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""
#property indicator_chart_window
//#property indicator_separate_window
#property indicator_buffers 7
#property indicator_color1 Snow
#property indicator_width1 0
#property indicator_color2 Red
#property indicator_width2 2
#property indicator_color3 Blue
#property indicator_width3 2
#property indicator_color4 Crimson
#property indicator_width4 2
#property indicator_color5 SteelBlue
#property indicator_width5 2
#property indicator_color6 LimeGreen
#property indicator_width6 1
#property indicator_color7 LimeGreen
#property indicator_width7 1
//---- input parameters
extern bool pivotlines = false;
//---- buffers
double PBuffer[];
double J1Buffer[];
double B1Buffer[];
double J2Buffer[];
double B2Buffer[];
double J3Buffer[];
double B3Buffer[];
string Pivot = "Pivot Point", Jual1 = "S 1", Beli1 = "R 1";
string Jual2="S 2", Beli2="R 2", Jual3="S 3", Beli3="R 3";
int fontsize = 10;
double P, J1, B1, J2, B2, J3, B3;
double LastHigh, LastLow, x;
double D4=0.55;
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
// ObjectDelete("Pivot");
ObjectDelete("Jual1");
ObjectDelete("Beli1");
ObjectDelete("Jual2");
ObjectDelete("Beli2");
ObjectDelete("Jual3");
ObjectDelete("Beli3");
ObjectDelete("r1 Label");
ObjectDelete("r1_Line");
ObjectDelete("r2 Label");
ObjectDelete("r2_Line");
ObjectDelete("r3 Label");
ObjectDelete("r3_Line");
ObjectDelete("r1 Label");
ObjectDelete("r1_Line");
ObjectDelete("r2 Label");
ObjectDelete("r2_Line");
ObjectDelete("r3 Label");
ObjectDelete("r3_Line");
ObjectDelete("R1 Label");
ObjectDelete("R1_Line");
ObjectDelete("R2 Label");
ObjectDelete("R2_Line");
ObjectDelete("R3 Label");
ObjectDelete("R3_Line");
ObjectDelete("S1 Label");
ObjectDelete("S1_Line");
ObjectDelete("S2 Label");
ObjectDelete("S2_Line");
ObjectDelete("S3 Label");
ObjectDelete("S3_Line");
ObjectDelete("P Label");
ObjectDelete("P_Line");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicator line
SetIndexStyle(0, DRAW_NONE);
SetIndexStyle(1, DRAW_LINE);
SetIndexStyle(2, DRAW_LINE);
SetIndexStyle(3, DRAW_LINE);
SetIndexStyle(4, DRAW_LINE);
SetIndexStyle(5, DRAW_LINE);
SetIndexStyle(6, DRAW_LINE);
SetIndexBuffer(0, PBuffer);
SetIndexBuffer(1, J1Buffer);
SetIndexBuffer(2, B1Buffer);
SetIndexBuffer(3, J2Buffer);
SetIndexBuffer(4, B2Buffer);
SetIndexBuffer(5, J3Buffer);
SetIndexBuffer(6, B3Buffer);
//---- name for DataWindow and indicator subwindow label
IndicatorShortName("PP");
//SetIndexLabel(0, "Pivot Point");
//----
SetIndexDrawBegin(0,1);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars = IndicatorCounted();
int limit, i;
Print(DoubleToStr(Close[i], Digits));
Print(DoubleToStr(Close[0], Digits));
Print(DoubleToStr(Close[0], Digits));
//---- indicator calculation
if(counted_bars == 0)
{
x = Period();
if(x > 240)
return(-1);
///////////To Make a Line for SELL/BUY \\\\\\\\\\\\\
//ObjectCreate("Pivot", OBJ_TEXT, 0, 0, 0);
//ObjectSetText("Pivot", " PIVOT", fontsize, "Arial", Black);
ObjectCreate("Jual1", OBJ_TEXT, 0, 0, 0);
ObjectSetText("Jual1", " SELL AREA", fontsize, "Arial ", Lime);
ObjectCreate("Beli1", OBJ_TEXT, 0, 0, 0);
ObjectSetText("Beli1", " BUY AREA", fontsize, "Arial ", Lime);
ObjectCreate("Jual2", OBJ_TEXT, 0, 0, 0);
ObjectSetText("Jual2", " 1st SELL TARGET (take profit), BREAK LOW, ", fontsize, "Arial ", Lime);
ObjectCreate("Beli2", OBJ_TEXT, 0, 0, 0);
ObjectSetText("Beli2", " 1st BUY TARGET (take profit) BREAK HIGH", fontsize, "Arial ", Lime);
ObjectCreate("Jual3", OBJ_TEXT, 0, 0, 0);
ObjectSetText("Jual3", " 2nd TARGET", fontsize, "Arial ", Lime);
ObjectCreate("Beli3", OBJ_TEXT, 0, 0, 0);
ObjectSetText("Beli3", " 2nd TARGET", fontsize, "Arial ", Lime);
}
if(counted_bars < 0)
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--)
{
if(High[i+1] > LastHigh)
LastHigh = High[i+1];
//----
if(Low[i+1] < LastLow)
LastLow=Low[i+1];
if(TimeDay(Time[i]) != TimeDay(Time[i+1]))
{
Print(DoubleToStr(Close[i], Digits));
Print(DoubleToStr(High[0], Digits));
Print(DoubleToStr(Low[0], Digits));
//////////// Logic for determinate Momentum Break \\\\\\\\\\\\\\\\\\\\\
P = (LastHigh + LastLow + Close[i+1]) / 3; // Logic for determinating pivot
B1 = P + 20*Point; // Logic to determinate Buy Area (Can be change as you analize)
J1 = P - 20*Point; // Logic to determinate Sell Area (Can be change as you analize)
B2 = P + 40*Point; // Logic to determinate High Break Area (Can be change as you analize)
J2 = P - 40*Point; // Logic to determinate Low Break Area (Can be change as you analize)
B3 = P + 55*Point; // Logic to determinate High Target Area (Can be change as you analize)
J3 = P - 55*Point; // Logic to determinate Low Target Area (Can be change as you analize)
//Re2 = P + (LastHigh - LastLow); //This is the logic for R3
//Su2 = P - (LastHigh - LastLow); // This is the logic for S3
//Re3 = (2*P) + (LastHigh - (2*LastLow)); // This is the logic for R3
//Su3 = (2*P) - ((2* LastHigh) - LastLow); //This is the logic for S3
LastLow = Open[i];
LastHigh = Open[i];
//----
//ObjectMove("Pivot", 0, Time[i], P);
ObjectMove("Jual1", 0, Time[i], J1);
ObjectMove("Beli1", 0, Time[i], B1);
ObjectMove("Jual2", 0, Time[i], J2);
ObjectMove("Beli2", 0, Time[i], B2);
ObjectMove("Jual3", 0, Time[i], J3);
ObjectMove("Beli3", 0, Time[i], B3);
}
PBuffer[i] = P;
J1Buffer[i] = J1;
B1Buffer[i] = B1;
J2Buffer[i] = J2;
B2Buffer[i] = B2;
J3Buffer[i] = J3;
B3Buffer[i] = B3;
//----
double rates[1][6],yesterday_close,yesterday_high,yesterday_low;
ArrayCopyRates(rates, Symbol(), PERIOD_D1);
if(DayOfWeek() == 1)
{
if(TimeDayOfWeek(iTime(Symbol(),PERIOD_D1,1)) == 5)
{
yesterday_close = rates[1][4];
yesterday_high = rates[1][3];
yesterday_low = rates[1][2];
}
else
{
for(int d = 5;d>=0;d--)
{
if(TimeDayOfWeek(iTime(Symbol(),PERIOD_D1,d)) == 5)
{
yesterday_close = rates[d][4];
yesterday_high = rates[d][3];
yesterday_low = rates[d][2];
}
}
}
}
else
{
yesterday_close = rates[1][4];
yesterday_high = rates[1][3];
yesterday_low = rates[1][2];
}
if (pivotlines==true)
{
//---- Calculate Pivots
double R = yesterday_high - yesterday_low;//range
double p = (yesterday_high + yesterday_low + yesterday_close)/3;// Standard Pivot
double r3 = (2*p)+(yesterday_high-(2*yesterday_low));
double r2 = p+(yesterday_high - yesterday_low);
double r1 = (2*p)-yesterday_low;
double s1 = (2*p)-yesterday_high;
double s2 = p-(yesterday_high - yesterday_low);
double s3 = (2*p)-((2* yesterday_high)-yesterday_low);
//------ DRAWING LINES ------
ObjectDelete("p_Line");
ObjectCreate("p_Line", OBJ_HLINE,0, CurTime(),p);
ObjectSet("p_Line",OBJPROP_COLOR,DeepPink);
ObjectSet("p_Line",OBJPROP_STYLE,STYLE_SOLID);
ObjectDelete("r1_Line");
ObjectCreate("r1_Line", OBJ_HLINE,0, CurTime(),r1);
ObjectSet("r1_Line",OBJPROP_COLOR,Yellow);
ObjectSet("r1_Line",OBJPROP_STYLE,STYLE_SOLID);
ObjectDelete("r2_Line");
ObjectCreate("r2_Line", OBJ_HLINE,0, CurTime(),r2);
ObjectSet("r2_Line",OBJPROP_COLOR,Orange);
ObjectSet("r2_Line",OBJPROP_STYLE,STYLE_SOLID);
ObjectDelete("r3_Line");
ObjectCreate("r3_Line", OBJ_HLINE,0, CurTime(),r3);
ObjectSet("r3_Line",OBJPROP_COLOR,Red);
ObjectSet("r3_Line",OBJPROP_STYLE,STYLE_SOLID);
ObjectDelete("s1_Line");
ObjectCreate("s1_Line", OBJ_HLINE,0, CurTime(),s1);
ObjectSet("s1_Line",OBJPROP_COLOR,Yellow);
ObjectSet("s1_Line",OBJPROP_STYLE,STYLE_SOLID);
ObjectDelete("s2_Line");
ObjectCreate("s2_Line", OBJ_HLINE,0, CurTime(),s2);
ObjectSet("s2_Line",OBJPROP_COLOR,Orange);
ObjectSet("s2_Line",OBJPROP_STYLE,STYLE_SOLID);
ObjectDelete("s3_Line");
ObjectCreate("s3_Line", OBJ_HLINE,0, CurTime(),s3);
ObjectSet("s3_Line",OBJPROP_COLOR,Red);
ObjectSet("s3_Line",OBJPROP_STYLE,STYLE_SOLID);
ObjectsRedraw();
// --- Typing Labels
if(ObjectFind("R3 label") != 0)
{
ObjectCreate("R3 label", OBJ_TEXT, 0, Time[0], r3);
ObjectSetText("R3 label", " R3 ", 8, "Arial", Red);
}
else
{
ObjectMove("R3 label", 0, Time[0], r3);
}
if(ObjectFind("S3 label") != 0)
{
ObjectCreate("S3 label", OBJ_TEXT, 0, Time[0], s3);
ObjectSetText("S3 label", " S3 ", 8, "Arial", Red);
}
else
{
ObjectMove("S3 label", 0, Time[0], s3);
}
if(ObjectFind("R2 label") != 0)
{
ObjectCreate("R2 label", OBJ_TEXT, 0, Time[0], r2);
ObjectSetText("R2 label", " R2 ", 8, "Arial", Orange);
}
else
{
ObjectMove("R2 label", 0, Time[0], r2);
}
if(ObjectFind("S2 label") != 0)
{
ObjectCreate("S2 label", OBJ_TEXT, 0, Time[0], s2);
ObjectSetText("S2 label", " S2 ", 8, "Arial", Orange);
}
else
{
ObjectMove("S2 label", 0, Time[0], s2);
}
if(ObjectFind("R1 label") != 0)
{
ObjectCreate("R1 label", OBJ_TEXT, 0, Time[0], r1);
ObjectSetText("R1 label", " R1 ", 8, "Arial", Yellow);
}
else
{
ObjectMove("R1 label", 0, Time[0], r1);
}
if(ObjectFind("S1 label") != 0)
{
ObjectCreate("S1 label", OBJ_TEXT, 0, Time[0], s1);
ObjectSetText("S1 label", " S1 ", 8, "Arial", Yellow);
}
else
{
ObjectMove("S1 label", 0, Time[0], s1);
}
if(ObjectFind("P label") != 0)
{
ObjectCreate("P label", OBJ_TEXT, 0, Time[0], p);
ObjectSetText("P label", " Pivot ", 8, "Arial", DeepPink);
}
else
{
ObjectMove("P label", 0, Time[0], p);
}
}
Comment ("\n Dolly 0.2 ( BREAKOUT STRATEGY ) "
+"\n -------------------------------------------------------------------"
+"\n :::::::::::: DURING AROUND 2 BREAK :::::::::::"
+"\n -------------------------------------------------------------------"
+"\n BUY AREA (break) :"
+"\n # BUY STOP1 "+Symbol()+" TO "+(DoubleToStr (B1Buffer[i],Digits))
+"\n Set TP "+(DoubleToStr (B2Buffer[i],Digits))+" and SL TO "+(DoubleToStr(J1Buffer[i],Digits))
+"\n # BUY STOP2 "+Symbol()+" TO "+(DoubleToStr(B2Buffer[i],Digits))
+"\n Set TP "+(DoubleToStr ((B2Buffer[i]+(10*Point)),Digits))+" and SL TO "+(DoubleToStr (B1Buffer[i],Digits))
+"\n \n SELL AREA (break) :"
+"\n # SELL STOP "+Symbol()+" TO "+(DoubleToStr (J1Buffer[i],Digits))
+"\n Set TP "+(DoubleToStr (J2Buffer[i],Digits))+" and SL to "+(DoubleToStr (B1Buffer[i],Digits))
+"\n # SELL STOP2 "+Symbol()+" TO "+(DoubleToStr (J2Buffer[i],Digits))
+"\n Set TP "+(DoubleToStr ((J2Buffer[i]-(10*Point)),Digits))+" and SL TO "+(DoubleToStr(J1Buffer[i],Digits))
+"\n -------------------------------------------------------------------"
+"\n ::::: POSSIBLE REVERSAL TRADES (DO NOT USE) :::::"
+"\n -------------------------------------------------------------------"
+"\n LOWER CORRECTION :"
+"\n # BUY STOP "+Symbol()+" TO "+(DoubleToStr(J2Buffer[i],Digits))
+"\n Set TP "+(DoubleToStr(B1Buffer[i],Digits))+" and SL TO "+(DoubleToStr(J3Buffer[i],Digits))
+"\n \n UPPER CORRECTION :"
+"\n # SELL STOP "+Symbol()+" TO "+(DoubleToStr(B2Buffer[i],Digits))
+"\n Set TP "+(DoubleToStr(J1Buffer[i],Digits))+" and SL TO "+(DoubleToStr(B3Buffer[i],Digits))
+"\n -------------------------------------------------------------------");
//+"\n \n -------------------------------------------------------------------"
//+"\n :::::: SUPPORT & RESISTANCE TODAY :::::"
//+"\n -------------------------------------------------------------------"
//+"\n Resistance 3 :"+(DoubleToStr(r3,Digits))
//+"\n Resistance 2 :"+(DoubleToStr(r2,Digits))
//+"\n Resistance 1 :"+(DoubleToStr(r1,Digits))
//+"\n -------------------------------------------------------------------"
//+"\n \n Pivot level :"+(DoubleToStr(p,Digits))
//+"\n \n -------------------------------------------------------------------"
//+"\n Support 1 :"+(DoubleToStr(s1,Digits))
//+"\n Support 2 :"+(DoubleToStr(s2,Digits))
//+"\n Support 3 :"+(DoubleToStr(s3,Digits))
//+"\n -------------------------------------------------------------------");
//HOW TO MAKE THE PRICE LINE OF THE SUPPORT & RESISTANT APPEAR?
//WAITING FOR NEXT TIP & UP DATE
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments