!!channel_breakout_atr_v1
Download scriptThis script is a specialized trading tool designed to identify specific price movements and automatically plot entry points based on the "Turtle Trading" methodology. It focuses on detecting when the market breaks out of established price channels while simultaneously calculating risk-based stop-loss levels.
Core Logic Overview
1. Dynamic Channel Detection The script constantly monitors the historical price action to establish two different types of "channels." These channels represent the highest highs and lowest lows over specific periods (set by the user as Range 2 and Range 3). By identifying these boundaries, the tool defines the current "trading range" of the market.
2. Breakout Identification The primary logic triggers when the current price moves outside of these established channels. Specifically:
- Upper Breakouts: If the price climbs above the highest high of the recent period.
- Lower Breakouts: If the price drops below the lowest low of the recent period.
When such a breach occurs, the script recognizes it as a potential trend reversal or continuation and prepares to mark the entry signals.
3. ATR-Based Positioning (Pyramiding) Unlike simple indicators that only show one signal, this tool calculates three distinct entry points (referred to as 2nd, 3rd, and 4th positions). It uses a volatility metric known as the Average True Range (ATR) to determine these distances.
- Volatility Adjustment: Because markets move differently depending on their volatility, the script scales the distance of each entry point based on the ATR. This ensures that during high-volatility periods, the entries are wider, and during low-volatility periods, they are tighter.
- Pyramiding: The three entry points are calculated as multipliers. For every breakout detected, the script plots three specific prices where a trader can "add" to their position (pyramid) as the trend confirms itself.
4. Risk Management Calculation To help manage risk, the script calculates a dynamic stop-loss value based on the volatility of the market. It takes the current ATR and applies a multiplier factor to determine how much "room" a trade should have to breathe before it is considered a failure. For sell positions (lower breakouts), it also accounts for the "spread"—the difference between the asking and bidding price—to ensure the stop-loss is placed accurately in real-market conditions.
Summary of Visual Output
On the chart, the script identifies these moments by placing specific visual markers (arrows) at the calculated prices. This allows a trader to see exactly where they should consider entering their secondary, tertiary, and quaternary positions based on the rules of the Turtle Trading system, while automatically adjusting for current market volatility.
//+------------------------------------------------------------------+
//| channel_breakout_atr.mq4 |
//| with ATR Stop Loss calculation |
//| use this one for drawing 2nd, 3rd and 4th entry point |
//| as described in the turtle trading rules |
//+------------------------------------------------------------------+
#property copyright "darmasdt"
#property link "http://indotraders.org"
#property indicator_chart_window
#property indicator_buffers 8
#property indicator_color1 DarkGray
#property indicator_color2 DarkGray
#property indicator_color3 Blue
#property indicator_color4 Blue
#property indicator_color5 DarkOrange
#property indicator_color6 Green
#property indicator_color7 Plum
#property indicator_color8 Plum
//---- input parameters
//extern int Range1=10;
extern int Range2=20;
extern int Range3=55;
extern double atr_factor=2;
extern int atr_range=14;
extern double add_atr_factor=0.5;
extern double spread=5;
//---- buffers
double RISK_NxATR[];
double UpBuffer2[];
double DnBuffer2[];
double UpBuffer3[];
double DnBuffer3[];
double add_atr1[];
double add_atr2[];
double add_atr3[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
//---- indicator line
SetIndexStyle(0,DRAW_NONE,1);
SetIndexStyle(1,DRAW_NONE,1);
SetIndexStyle(2,DRAW_NONE,1);
SetIndexStyle(3,DRAW_NONE,1);
SetIndexStyle(4,DRAW_ARROW);
SetIndexArrow(4,159);
SetIndexStyle(5,DRAW_ARROW);
SetIndexArrow(5,159);
SetIndexStyle(6,DRAW_ARROW);
SetIndexArrow(6,159);
SetIndexStyle(7,DRAW_NONE,1);
SetIndexBuffer(0,UpBuffer2);
SetIndexLabel(0,"");
SetIndexBuffer(1,DnBuffer2);
SetIndexLabel(1,"");
SetIndexBuffer(2,UpBuffer3);
SetIndexLabel(2,"");
SetIndexBuffer(3,DnBuffer3);
SetIndexLabel(3,"");
SetIndexBuffer(4,add_atr1);
SetIndexLabel(4,"2nd pos");
SetIndexBuffer(5,add_atr2);
SetIndexLabel(5,"3rd pos");
SetIndexBuffer(6,add_atr3);
SetIndexLabel(6,"4th pos");
SetIndexBuffer(7,RISK_NxATR);
SetIndexLabel(7,"RISK_NxATR");
//---- name for DataWindow and indicator subwindow label
short_name="CBO_atr("+Range2+","+Range3+")";
IndicatorShortName(short_name);
//----
SetIndexDrawBegin(0,0);
SetIndexDrawBegin(1,0);
SetIndexDrawBegin(2,0);
SetIndexDrawBegin(3,0);
SetIndexDrawBegin(4,0);
SetIndexDrawBegin(5,0);
SetIndexDrawBegin(6,0);
SetIndexDrawBegin(7,0);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Channel Trend System |
//+------------------------------------------------------------------+
int start()
{
int i;
//----
for(i=Bars-1;i>=0;i--)
{
//Calculating Channel
//-------------------
UpBuffer2[i]=High[Highest(NULL,0,MODE_HIGH,Range2,i+1)];
DnBuffer2[i]=Low[Lowest(NULL,0,MODE_LOW,Range2,i+1)];
UpBuffer3[i]=High[Highest(NULL,0,MODE_HIGH,Range3,i+1)];
DnBuffer3[i]=Low[Lowest(NULL,0,MODE_LOW,Range3,i+1)];
//Calculating ATR PYramiding
//---------------------
RISK_NxATR[i]=atr_factor*(iATR(NULL,0,atr_range,i+1))/Point;
if(High[i+1]<=UpBuffer2[i+1] && High[i]>UpBuffer2[i])
{
add_atr1[i]= UpBuffer2[i] + (iATR(NULL,0,atr_range,i+1)*add_atr_factor);
add_atr2[i]= UpBuffer2[i] + (iATR(NULL,0,atr_range,i+1)*add_atr_factor*2);
add_atr3[i]= UpBuffer2[i] + (iATR(NULL,0,atr_range,i+1)*add_atr_factor*3);
}
if(High[i+1]<=UpBuffer3[i+1] && High[i]>UpBuffer3[i])
{
add_atr1[i]= UpBuffer3[i] + (iATR(NULL,0,atr_range,i+1)*add_atr_factor);
add_atr2[i]= UpBuffer3[i] + (iATR(NULL,0,atr_range,i+1)*add_atr_factor*2);
add_atr3[i]= UpBuffer3[i] + (iATR(NULL,0,atr_range,i+1)*add_atr_factor*3);
}
if(Low[i+1]>=DnBuffer2[i+1] && Low[i]<DnBuffer2[i])
{
add_atr1[i]= DnBuffer2[i] - (iATR(NULL,0,atr_range,i+1)*add_atr_factor)+(spread*Point);
add_atr2[i]= DnBuffer2[i] - (iATR(NULL,0,atr_range,i+1)*add_atr_factor*2)+(spread*Point);
add_atr3[i]= DnBuffer2[i] - (iATR(NULL,0,atr_range,i+1)*add_atr_factor*3)+(spread*Point);
}
if(Low[i+1]>=DnBuffer3[i+1] && Low[i]<DnBuffer3[i])
{
add_atr1[i]= DnBuffer3[i] - (iATR(NULL,0,atr_range,i+1)*add_atr_factor)+(spread*Point);
add_atr2[i]= DnBuffer3[i] - (iATR(NULL,0,atr_range,i+1)*add_atr_factor*2)+(spread*Point);
add_atr3[i]= DnBuffer3[i] - (iATR(NULL,0,atr_range,i+1)*add_atr_factor*3)+(spread*Point);
}
}
return(0);
}
//+------------------------------------------------------------------+
Comments