Реализация инструмента для отображения расстояния на финансовом графике с использованием Delphi и Pascal: как нарисовать линию и прямоугольник для точек данных.
В этой статье мы рассмотрим, как реализовать инструмент для отображения расстояния на финансовом графике в Delphi, опираясь на обсуждение в форуме Lazarus/FreePascal. Задача состоит в том, чтобы расширить стандартный инструмент измерения расстояния (ChartToolset1DataPointDistanceTool) для отображения не только расстояния от начальной точки, но и прямоугольника, охватывающего начальную и конечную точки, с отображением процентного изменения цены (Y-ось) и времени (X-ось) на соответствующих сторонах прямоугольника.
Постановка задачи:
Изначально стандартный инструмент измерения расстояния в TChart показывает только линию, соединяющую начальную и конечную точки. Пользователь хочет расширить функциональность, добавив:
Прямоугольник, очерчивающий начальную и конечную точки.
Отображение процентного изменения цены на верхней стороне прямоугольника.
Отображение изменения времени на левой стороне прямоугольника.
Возможность отображения нескольких линий и прямоугольников.
Обсуждение и предложенные решения:
Обсуждение в форуме выявило несколько подходов к решению этой задачи.
Использование стандартного инструмента Distance Tool: Первоначальная идея заключалась в использовании существующего инструмента Distance Tool и переопределении его поведения. Однако, это может быть сложнее, так как инструмент уже имеет определенную структуру и логику.
Использование UserDefined Tool: Альтернативным подходом является создание собственного UserDefined Tool. Это дает больше гибкости в реализации нужной функциональности. В этом случае необходимо будет определить переменные для хранения начальной и конечной точки, а также реализовать логику обновления этих переменных при перетаскивании мыши.
Рекомендации wp: wp предложил использовать UserDefined Tool и предоставил пример модифицированного демо-проекта "financial" в TAChart, где реализована отрисовка линии с аннотацией процентного изменения цены, а также отрисовка закрашенного прямоугольника с такой же аннотацией. Он также отметил возможность настройки DataPointModeStart и End для избежания привязки к точкам данных, а также использование свойств Marks или обработчика OnGetDistanceText для отображения текста на линии.
Рекомендации Thaddy: Thaddy подчеркнул важность использования принципов "сэмплирования" (хотя chucky оспаривал это определение в контексте его задачи), то есть разделения логики сбора данных и логики отображения. Он предложил хранить данные в памяти и представлять их как текущую выборку, а не пытаться отображать данные в реальном времени.
Решение: UserDefined Tool с использованием принципов сэмплирования
Основываясь на обсуждении, наиболее подходящим решением является создание UserDefined Tool, реализующего следующие шаги:
Определение переменных:
StartX, StartY: Координаты начальной точки.
EndX, EndY: Координаты конечной точки.
PriceChange: Изменение цены в процентах.
TimeChange: Изменение времени.
Обработчик начала перетаскивания мыши (Mouse Drag):
Записать начальные координаты (StartX, StartY) в переменные хранения.
Начать отслеживать координаты мыши.
Обработчик перемещения мыши (Mouse Move):
Обновить координаты конечной точки (EndX, EndY) на основе текущего положения мыши.
Вычислить PriceChange и TimeChange на основе StartY, EndY, StartX и EndX. (Формулы расчета зависят от структуры данных графика и используемой шкалы).
Перерисовать прямоугольник и линии с новыми координатами и значениями.
Обработчик окончания перетаскивания мыши (Mouse Up):
Завершить отслеживание мыши.
Сохранить окончательные координаты и значения.
Пример кода Object Pascal (Delphi):
unit MyDistanceTool;
interface
uses
Classes,
SysUtils,
Chart,
Vcl.Controls,
Vcl.Graphics;
type
TMyDistanceTool = class(TChartTool)
private
StartX, StartY, EndX, EndY: Double;
PriceChange, TimeChange: Double;
protected
procedure MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure MouseMove(Sender: TObject; X, Y: Integer; MouseButtons: TMouseButtons); override;
public
constructor Create(AChart: TChart); override;
end;
implementation
uses
Math;
constructor TMyDistanceTool.Create(AChart: TChart);
begin
inherited Create(AChart);
Name := 'MyDistanceTool';
end;
procedure TMyDistanceTool.MouseMove(Sender: TObject; X, Y: Integer; MouseButtons: TMouseButtons);
begin
if MouseButtons = mbLeft and Chart.MouseButtons = mbLeft then
begin
EndX := X;
EndY := Y;
// Calculate Price Change and Time Change (replace with your actual formulas)
PriceChange := (EndY - StartY) / StartY * 100;
TimeChange := EndX - StartX;
Chart.Repaint; // Force Chart to redraw
end;
end;
procedure TMyDistanceTool.MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
begin
EndX := X;
EndY := Y;
// Calculate Price Change and Time Change (replace with your actual formulas)
PriceChange := (EndY - StartY) / StartY * 100;
TimeChange := EndX - StartX;
Chart.Repaint; // Force Chart to redraw
end;
end;
end.
Альтернативные решения:
Использование событий Chart.OnMouseMove и Chart.OnMouseUp: Вместо переопределения MouseMove и MouseUp в классе TChartTool, можно использовать события Chart.OnMouseMove и Chart.OnMouseUp для обработки логики перетаскивания. Это может упростить код и сделать его более читаемым.
Использование графических примитивов: Для отрисовки прямоугольника и линий можно использовать графические примитивы Delphi, такие как Canvas.Rectangle и Canvas.Line. Это дает больше контроля над внешним видом графических элементов.
Заключение:
Создание UserDefined Tool является наиболее гибким подходом к реализации требуемой функциональности. Применяя принципы сэмплирования и используя графические примитивы Delphi, можно создать эффективный и наглядный инструмент для анализа финансовых данных на графике. Приведенный пример кода демонстрирует базовую структуру UserDefined Tool, которую можно адаптировать и расширить в соответствии с конкретными требованиями. Важно помнить о необходимости правильного расчета PriceChange и TimeChange на основе структуры данных графика и используемой шкалы.
Context — это расширение стандартного инструмента измерения расстояния в TChart для отображения прямоугольника с процентным изменением цены и времени на финансовом графике.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.