187 lines
No EOL
6.8 KiB
Markdown
187 lines
No EOL
6.8 KiB
Markdown
Article-22233-Tools-Palette-Part-32-Crosshair-Magnifier
|
|
|
|
This repository is an article-derived reference project based on the original MQL5 article. It does not claim to reproduce the full original source code unless files are explicitly attached.
|
|
|
|
## Overview
|
|
|
|
This project references MQL5 article **Part 32** of a Tools Palette series. The article extends a previously built interactive chart sidebar with a dedicated crosshair subsystem that adds:
|
|
|
|
- reticle tick-mark overlays
|
|
- full-chart vertical and horizontal crosshair lines
|
|
- dynamic price and time axis labels
|
|
- a circular magnifier lens for zoomed candle inspection
|
|
- a double-click measurement mode with anchor, diagonal line, bar count, pip distance, and raw price difference
|
|
|
|
The implementation described in the article is centered around canvas-based rendering and chart event handling.
|
|
|
|
## Original Article
|
|
|
|
- **Article ID:** 22233
|
|
- **Author:** Allan Munene Mutiiria
|
|
- **Publication date:** 2026.05.21
|
|
- **Category:** MQL5 GUI / Chart objects
|
|
- **URL:** https://www.mql5.com/en/articles/22233
|
|
|
|
## Repository Purpose
|
|
|
|
This repository should be treated as a **reference/reconstruction project** for the article’s described architecture and code fragments.
|
|
|
|
Its purpose is to document and preserve the article’s main implementation ideas for:
|
|
|
|
- custom chart navigation overlays in MQL5
|
|
- layered bitmap-label canvas rendering
|
|
- magnifier lens rendering on live chart data
|
|
- measurement tooling integrated into a sidebar-driven UI
|
|
- event-driven crosshair interaction and cleanup logic
|
|
|
|
## Key Concepts
|
|
|
|
- Custom crosshair rendering beyond the default MetaTrader crosshair
|
|
- Reticle overlay with configurable offset, tick length, and thickness
|
|
- Magnifier lens with configurable diameter, zoom factor, and cursor offset
|
|
- Axis label rendering using chart foreground/background colors
|
|
- Canvas layer expansion from basic sidebar/flyout rendering to multiple overlay surfaces
|
|
- Bresenham line drawing for measure diagonals
|
|
- Double-click detection using microsecond timing
|
|
- Conversion between chart coordinates and screen coordinates
|
|
- Theme-aware redraw behavior
|
|
- Automatic hiding of crosshair elements over sidebar and flyout regions
|
|
|
|
## Algorithm / Architecture Summary
|
|
|
|
The article describes the following architecture:
|
|
|
|
1. **New input parameters**
|
|
- `ReticleOffset`
|
|
- `ReticleTickLen`
|
|
- `ReticleThickness`
|
|
- `MagDiameter`
|
|
- `MagZoom`
|
|
- `MagOffset`
|
|
- `AxisLabelFontSize`
|
|
- `AxisLabelFont`
|
|
|
|
2. **Primitive extension**
|
|
- `CCanvasPrimitives` is extended with `DrawBresenhamLine(...)` for pixel-level diagonal rendering with alpha blending.
|
|
|
|
3. **Canvas layer expansion**
|
|
- `CCanvasLayer` grows from four canvases to fifteen total surfaces.
|
|
- Added canvases include reticle, magnifier, crosshair lines, crosshair labels, measure anchor lines, measure labels, and a full-screen diagonal line canvas.
|
|
- Helper methods prefill 1-pixel-wide or 1-pixel-tall line canvases using chart foreground colors.
|
|
|
|
4. **Dedicated manager class**
|
|
- A new `CCrosshairManager` class is introduced between sidebar rendering and chart event handling.
|
|
- It tracks visibility flags, measurement state, anchor coordinates, double-click timing, and cached magnifier cursor position.
|
|
|
|
5. **Rendering responsibilities**
|
|
- Draw reticle tick marks on a transparent square canvas.
|
|
- Show/hide and reposition vertical/horizontal crosshair lines.
|
|
- Render and place price/time axis labels.
|
|
- Render a circular magnifier lens with:
|
|
- candle bodies and wicks
|
|
- bid/ask lines
|
|
- circular clipping
|
|
- anti-aliased lens border
|
|
- center guide marks
|
|
- current price label
|
|
|
|
6. **Measurement mode**
|
|
- Double-click toggles measurement anchor mode.
|
|
- Anchor time/price and pixel coordinates are stored.
|
|
- Vertical/horizontal anchor lines and axis labels are shown.
|
|
- A diagonal line is drawn from anchor to current cursor.
|
|
- A floating chart label shows bars, pips, and absolute price difference.
|
|
|
|
7. **Top-level integration**
|
|
- Cleanup method removes crosshair and measurement state on tool switch.
|
|
- Mouse-move handler coordinates all real-time updates when the crosshair tool is active.
|
|
|
|
## Mentioned or Attached Files
|
|
|
|
### Explicitly attached files
|
|
|
|
No attached source files were available in the processed input.
|
|
|
|
### Files mentioned in the article text
|
|
|
|
- `Tools Palette Part 4.mq5`
|
|
|
|
### Classes mentioned in the article
|
|
|
|
- `CCanvasPrimitives`
|
|
- `CCanvasLayer`
|
|
- `CCrosshairManager`
|
|
- `CToolsSidebar`
|
|
|
|
### Methods specifically shown or discussed
|
|
|
|
- `DrawBresenhamLine`
|
|
- `CreateAllCanvases`
|
|
- `DestroyAllCanvases`
|
|
- `DrawCrossVerticalLinePixels`
|
|
- `DrawCrossHorizontalLinePixels`
|
|
- `DrawMeasureVerticalLinePixels`
|
|
- `DrawMeasureHorizontalLinePixels`
|
|
- `DrawReticleTickMarks`
|
|
- `ShowReticle`
|
|
- `HideReticle`
|
|
- `UpdateReticlePosition`
|
|
- `ShowCrossVertical`
|
|
- `HideCrossVertical`
|
|
- `UpdateCrossVerticalPosition`
|
|
- `ShowCrossHorizontal`
|
|
- `HideCrossHorizontal`
|
|
- `UpdateCrossHorizontalPosition`
|
|
- `ShowCrossPriceLabel`
|
|
- `HideCrossPriceLabel`
|
|
- `ShowCrossTimeLabel`
|
|
- `HideCrossTimeLabel`
|
|
- `DrawAndPositionAxisLabel`
|
|
- `UpdateCrosshairAxisLabels`
|
|
- `ShowMeasureLines`
|
|
- `HideMeasureLines`
|
|
- `UpdateMeasureVerticalPosition`
|
|
- `UpdateMeasureHorizontalPosition`
|
|
- `UpdateMeasureAnchorLabels`
|
|
- `ShowMagnifier`
|
|
- `HideMagnifier`
|
|
- `UpdateMagnifierPosition`
|
|
- `DrawMagnifierLensContent`
|
|
- `UpdateMeasureDiagonalLine`
|
|
- `UpdateMeasurementInfoLabel`
|
|
- `HideAllCrosshairElements`
|
|
- `ShowAllCrosshairElements`
|
|
- `HandleCrosshairDoubleClick`
|
|
- `DeleteAllMeasureObjects`
|
|
- `CleanupCrosshairOnToolSwitch`
|
|
- `HandleCrosshairMouseMove`
|
|
|
|
## Statistics
|
|
|
|
- **Inputs added:** 8
|
|
- **New canvas layers added:** 11
|
|
- **Total canvases after expansion:** 15
|
|
- **New manager class introduced:** 1
|
|
- **Protected member variables in `CCrosshairManager` described by the article:** 20
|
|
- **Protected methods in `CCrosshairManager` declared in the article:** 30
|
|
|
|
## Tags
|
|
|
|
`mql5` `metatrader-5` `canvas` `crosshair` `magnifier` `chart-ui` `sidebar` `measurement-tool` `bresenham-line` `interactive-tools`
|
|
|
|
## Difficulty
|
|
|
|
Intermediate to Advanced
|
|
|
|
## Limitations
|
|
|
|
- The full original project source code is **not available** in the provided input.
|
|
- Only article text and embedded code excerpts were provided, so this repository should not be presented as a complete drop-in reproduction.
|
|
- The article depends on earlier parts of the Tools Palette series, especially prior sidebar, renderer, event-routing, and tool-registry infrastructure.
|
|
- Some referenced base classes and existing methods are not fully included in the provided material.
|
|
- Backtesting visuals are described, but no packaged test assets or complete runnable project structure were attached in the processed input.
|
|
|
|
|
|
## Reference
|
|
|
|
Original article: [Tools Palette Part 32](https://www.mql5.com/en/articles/22233) by Allan Munene Mutiiria. |