Author: Avery T. Horton, Jr. aka TheRumpledOne � 2008
$BBS

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 and iATR functions.
  • Squeeze Detection: The script checks if the calculated bbs value is less than 1. If it is, it sets upK and loK to 0, indicating a potential squeeze. Otherwise, it sets them to EMPTY_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, and ObjectDelete functions to create and manage graphical objects on the chart. It plots the upK, 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.

Indicators Used
Indicator of the average true rangeStandard Deviation indicatorMoving average indicator
Miscellaneous
Implements a curve of type %1
0 Views
0 Downloads
0 Favorites
$BBS
//+------------------------------------------------------------------+ 
//|    $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 supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---