refactor:

This commit is contained in:
Toh4iem9
2025-08-30 13:49:52 +02:00
parent b9a5c1f7ef
commit 78ae5e79ed
@@ -5,62 +5,43 @@
The Linear Regression Channel is a technical analysis tool that consists of three parallel lines plotted on a price chart. It is a statistically-based indicator that uses the **linear regression** (or "least squares fit") method to determine the primary trend direction.
- The **Middle Line** is the actual linear regression trendline.
- The **Upper and Lower Channel Lines** are plotted one standard deviation above and below the middle line.
- The **Upper and Lower Channel Lines** are plotted based on the **maximum price deviation** from the middle line over the calculation period.
The indicator provides an objective, mathematical measure of a trend and its trading channel, helping traders to identify trend direction and dynamic support and resistance levels.
The indicator provides an objective, mathematical measure of a trend and its trading channel.
## 2. Mathematical Foundations and Calculation Logic
The indicator's core is the linear regression trendline, which is the straight line that best fits a series of data points (in this case, `Close` prices) over a specified period.
### Required Components
- **Period (N):** The lookback period for the regression calculation (e.g., 100).
- **Price Data (P):** The `Close` price series.
The indicator's core is the linear regression trendline, which is the straight line that best fits a series of `Close` prices over a specified period.
### Calculation Steps (Algorithm)
For the last `N` bars at any given point in time:
1. **Calculate the Linear Regression Line:** Using the method of least squares, find the straight line that best fits the `N` closing prices.
$\text{Regression Line}_t = a + b \times t$
2. **Calculate Maximum Deviation:** Find the largest vertical distance between any of the `N` closing prices and the calculated regression line.
3. **Calculate the Upper and Lower Channel Lines:** Shift the regression line up and down by the maximum deviation found in the previous step.
2. **Calculate the Standard Deviation:** Compute the standard deviation of the `N` closing prices from the calculated regression line.
$\sigma = \sqrt{\frac{\sum_{k=1}^{N} (P_k - \text{Regression Line}_k)^2}{N}}$
3. **Calculate the Upper and Lower Channel Lines:** Add and subtract **one** standard deviation from the regression line.
$\text{Upper Channel}_t = \text{Regression Line}_t + \sigma$
$\text{Lower Channel}_t = \text{Regression Line}_t - \sigma$
**Important Note on "Repainting":** The Linear Regression Channel is a "repainting" indicator by nature. Because the entire line is recalculated for the most recent `N` bars every time a new bar forms, its position in the recent past can change. This is not a bug but a fundamental characteristic of the statistical method.
**Important Note on "Repainting":** The Linear Regression Channel is a "repainting" indicator by nature. Because the entire line is recalculated for the most recent `N` bars every time a new bar forms, its position in the recent past can change.
## 3. MQL5 Implementation Details
Our MQL5 implementation is designed to be highly efficient and visually clean by leveraging MetaTrader 5's built-in graphical objects.
Our MQL5 implementation is designed to be highly efficient and visually clean by leveraging MetaTrader 5's built-in **`OBJ_REGRESSION`** graphical object.
- **Object-Based Plotting:** Instead of using indicator buffers, our indicator uses a single, built-in `OBJ_REGRESSION` graphical object. This object is managed by the MetaTrader terminal, which handles the complex regression and standard deviation calculations internally using highly optimized code.
- **Clean, Non-Continuous Display:** By default, the indicator only displays the **single, most current** regression channel calculated on the last `N` bars. This provides a clean, uncluttered view of the present market structure.
- **Efficient "On New Bar" Updates:** The indicator is designed to be extremely light on terminal resources. It uses a simple time-check within `OnCalculate`. The channel object is only updated **once per bar**, when a new candle forms, preventing unnecessary recalculations on every tick.
- **Automatic Cleanup (RAII):** The graphical object is given a unique name upon creation. The `OnDeinit` function ensures that this object is always deleted from the chart when the indicator is removed, leaving no visual artifacts behind.
- **Fixed Parameters:** To accurately reflect the behavior of the underlying `OBJ_REGRESSION` object, our implementation has the following fixed characteristics:
- **Applied Price:** The calculation always uses `PRICE_CLOSE`.
- **Deviations:** The channel width is always fixed at **one** standard deviation from the center line. These properties cannot be changed.
- **Object-Based Plotting:** The indicator uses a single, built-in `OBJ_REGRESSION` object. This object is managed by the MetaTrader terminal, which handles the complex regression and maximum deviation calculations internally using highly optimized code.
- **Clean, Non-Continuous Display:** By default, the indicator only displays the single, most current regression channel calculated on the last `N` bars.
- **Efficient "On New Bar" Updates:** The indicator is extremely light on terminal resources. The channel object is only updated **once per bar** when a new candle forms, preventing unnecessary recalculations on every tick.
- **Automatic Cleanup (RAII):** The graphical object is given a unique name and is always deleted from the chart when the indicator is removed.
## 4. Parameters
- **Regression Period (`InpRegressionPeriod`):** The number of bars to include in the regression calculation. A longer period creates a more stable, long-term trendline, while a shorter period is more responsive to recent price action. Default is `100`.
- **Regression Period (`InpRegressionPeriod`):** The number of bars to include in the regression calculation. Default is `100`.
- **Channel Color (`InpChannelColor`):** Allows the user to customize the color of the channel lines. Default is `clrRed`.
- **Channel Extensions:**
- **`InpRayRight`**: If `true`, the calculated channel will be extended indefinitely into the future. Default is `false`.
- **`InpRayLeft`**: If `true`, the channel will be extended indefinitely into the past. Default is `false`.
- **`InpRayRight`**: If `true`, the channel is extended indefinitely into the future. Default is `false`.
- **`InpRayLeft`**: If `true`, the channel is extended indefinitely into the past. Default is `false`.
## 5. Usage and Interpretation
- **Trend Identification:** The slope of the middle line indicates the direction of the trend.
- **Dynamic Support and Resistance:** The channel lines act as dynamic support and resistance levels.
- **Overbought/Oversold:** A move to the upper channel line can be considered overbought relative to the current trend, while a move to the lower line can be considered oversold.
- **Breakouts:** A strong close outside the channel can signal that the current trend is accelerating or that a reversal is imminent.
- **Caution:** Due to its repainting nature, signals should be interpreted with care. The indicator is best used for confirming the current market structure rather than for generating precise entry signals from past data.
- **Caution:** Due to its repainting nature, the indicator is best used for confirming the current market structure rather than for generating precise entry signals from past data.