Okay, here's a detailed explanation of the MQL4 script's logic, broken down into sections. I'm focusing on what it does, not how to improve it or fix it. I'm also avoiding pasting code snippets directly, as requested.
Overall Purpose
The script appears to be a custom indicator designed to generate a "squeeze" type signal. It combines elements of Bollinger Bands, linear regression, and standard deviation to identify periods of low volatility ("squeeze") and potential breakouts. The indicator aims to visually represent these conditions on a chart.
1. Preprocessing and Input Parameters
- Copyright and Link Properties: These lines define the copyright information and a link to a website (kreslik.com). They are primarily for attribution and informational purposes.
- Input Parameters: The script defines several input parameters that the user can adjust:
bolPrd
: The period used for calculating Bollinger Bands (likely related to the linear regression calculation).bolDev
: A deviation factor used in conjunction with standard deviation.keltPrd
: The period used for calculating Average True Range (ATR).keltFactor
: A multiplier applied to the ATR.
- Array Declarations: The script declares several arrays to store calculated values. These arrays are crucial for the indicator's calculations and plotting.
2. LinearRegressionValue
Function
- Purpose: This function calculates a linear regression value for a given period and shift. It appears to be a custom implementation of linear regression.
- Calculation: The function iterates through a specified number of bars (
Len
). For each bar, it finds the highest high and lowest low within the period. It then calculates a linear regression value based on the closing prices and the calculated highs and lows. - Return Value: The function returns the calculated linear regression value.
3. Start()
Function (Main Calculation Logic)
- Purpose: This function is the core of the indicator. It's called whenever the indicator needs to update its calculations.
- Iteration: The function iterates backward through the chart's history, starting from the most recent bar.
- Linear Regression Calculation: The
LinearRegressionValue
function is called within the loop to calculate a linear regression value for each bar. - Bollinger Band-like Logic: The script calculates values that resemble Bollinger Bands, but with custom calculations. It uses the
LinearRegressionValue
andiATR
functions. - Squeeze Detection: The script checks if the calculated
bbs
value is less than 1. If it is, it setsupK
andloK
to 0, indicating a potential squeeze. Otherwise, it sets them toEMPTY_VALUE
. - Array Population: The calculated values (
upK
,loK
,_Value
) are stored in arrays. These arrays are used for plotting the indicator on the chart.
4. OnCalculate()
Function (Plotting)
- Purpose: This function is responsible for plotting the calculated values on the chart.
- Plotting: The function uses the
ObjectCreate
,ObjectSet
, andObjectDelete
functions to create and manage graphical objects on the chart. It plots theupK
,loK
, and_Value
arrays as lines or other shapes.
Key Concepts and Techniques
- Linear Regression: The script uses a custom implementation of linear regression to identify trends and potential breakouts.
- Bollinger Bands Analogy: The script uses concepts similar to Bollinger Bands, but with custom calculations and parameters.
- ATR (Average True Range): The script uses ATR to measure volatility.
- Squeeze Detection: The script identifies periods of low volatility ("squeeze") based on the calculated values.
- Array-Based Calculations: The script relies heavily on arrays to store and manipulate calculated values.
- Custom Functions: The script uses custom functions to encapsulate specific calculations and logic.
In Summary
The script is a custom indicator that combines linear regression, ATR, and Bollinger Band-like concepts to identify periods of low volatility and potential breakouts. It calculates several values and plots them on the chart to provide visual cues to the trader. The script's logic is complex and relies on several custom functions and calculations.
//+------------------------------------------------------------------+
//| $BBS |
//| |
//| |
//| Copyright © 2008, Avery T. Horton, Jr. aka TheRumpledOne |
//| |
//| PO BOX 43575, TUCSON, AZ 85733 |
//| |
//| GIFT AND DONATIONS ACCEPTED |
//| |
//| therumpldone@gmail.com |
//+------------------------------------------------------------------+
//| |
//| go to www.kreslik.com for the latest indicator updates |
//+------------------------------------------------------------------+
//| |
//| Use www.efxgroup.com as your forex broker... |
//| ...tell them therumpledone sent you! |
//+------------------------------------------------------------------+
#property copyright "Avery T. Horton, Jr. aka TheRumpledOne © 2008"
#property link "www.kreslik.com"
//+------------------------------------------------------------------+
//| bbsqueeze.mq4 |
//| Copyright © 2005, Nick Bilak, beluck[AT]gmail.com |
//| enhanced a little bit by CJ Rivas, carlos[AT]vealo.com |
//+------------------------------------------------------------------+
//#property copyright "Copyright © 2005, Nick Bilak"
//#property link "http://metatrader.50webs.com/"
#property indicator_separate_window
#property indicator_buffers 1
//---- input parameters
extern int bolPrd=20;
extern double bolDev=2.0;
extern int keltPrd=20;
extern double keltFactor=1.5;
extern int momPrd=12;
//---- buffers
double upB[];
double upB2[];
double loB[];
double loB2[];
double upK[];
double loK[];
double _Value[];
int i,j,slippage=3;
double breakpoint=0.0;
double ema=0.0;
int peakf=0;
int peaks=0;
int valleyf=0;
int valleys=0, limit=0;
double ccis[61],ccif[61];
double delta=0;
double ugol=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
IndicatorBuffers(1);
SetIndexBuffer(0,_Value);
SetIndexStyle(0,DRAW_LINE);
return(0);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
int shift,limit;
double diff,d,dPrev, std,bbs;
if (counted_bars<0) return(-1);
if (counted_bars>0) counted_bars--;
limit=Bars-31;
if(counted_bars>=31) limit=Bars-counted_bars-1;
for (shift=limit;shift>=0;shift--) {
//d=iMomentum(NULL,0,momPrd,PRICE_CLOSE,shift);
d=LinearRegressionValue(bolPrd,shift);
dPrev=LinearRegressionValue(bolPrd,shift+1);
if(d>0) {
if ((dPrev>0) && (dPrev > d)){ upB2[shift]=d; upB[shift] = 0; } else { upB[shift]= d; upB2[shift] = 0; }
//upB[shift]=0;
loB[shift]=0;
loB2[shift]=0;
} else {
if ((dPrev<0) && (dPrev < d)){ loB2[shift]=d; loB[shift] = 0; } else { loB[shift]= d; loB2[shift] = 0; }
upB[shift]=0;
upB2[shift]=0;
//loB[shift]=d;
}
diff = iATR(NULL,0,keltPrd,shift)*keltFactor;
std = iStdDev(NULL,0,bolPrd,MODE_SMA,0,PRICE_CLOSE,shift);
bbs = bolDev * std / diff;
if(bbs<1) {
upK[shift]=0;
loK[shift]=EMPTY_VALUE;
_Value[shift] = -1;
} else {
loK[shift]=0;
upK[shift]=EMPTY_VALUE;
_Value[shift] = 1;
}
}
return(0);
}
//+------------------------------------------------------------------+
double LinearRegressionValue(int Len,int shift) {
double SumBars = 0;
double SumSqrBars = 0;
double SumY = 0;
double Sum1 = 0;
double Sum2 = 0;
double Slope = 0;
SumBars = Len * (Len-1) * 0.5;
SumSqrBars = (Len - 1) * Len * (2 * Len - 1)/6;
for (int x=0; x<=Len-1;x++) {
double HH = Low[x+shift];
double LL = High[x+shift];
for (int y=x; y<=(x+Len)-1; y++) {
HH = MathMax(HH, High[y+shift]);
LL = MathMin(LL, Low[y+shift]);
}
Sum1 += x* (Close[x+shift]-((HH+LL)/2 + iMA(NULL,0,Len,0,MODE_EMA,PRICE_CLOSE,x+shift))/2);
SumY += (Close[x+shift]-((HH+LL)/2 + iMA(NULL,0,Len,0,MODE_EMA,PRICE_CLOSE,x+shift))/2);
}
Sum2 = SumBars * SumY;
double Num1 = Len * Sum1 - Sum2;
double Num2 = SumBars * SumBars-Len * SumSqrBars;
if (Num2 != 0.0) {
Slope = Num1/Num2;
} else {
Slope = 0;
}
double Intercept = (SumY - Slope*SumBars) /Len;
double LinearRegValue = Intercept+Slope * (Len - 1);
return (LinearRegValue);
}
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---