3

введите сюда описание изображения

Необходимо будет сделать подобную вещь в своей программе на c# Windows Forms, возможно и WPF. Из чего лучше всего сделать такой график? На нем нужно будет и многое другое вырисовывать, но главное это основные свечи(красные, зеленые). Как мысль, самая банальная, сделать координаты и рисовать по ним прямоугольники с линиями сверху и снизу. А при масштабировании вырисовывать другие, более мелкие или большие. Но, может быть, есть более лаконичное решение данной задачи?

Fresto
  • 1,158
  • На WPF ну расположите линии и прямоугольники на канвасе, делов-то. Специальных контролов под вашу задачу я не знаю, слишком они специализированные. Впрочем, может быть, есть готовые библиотеки. – VladD Nov 21 '17 at 09:57
  • @VladD я вас понял, я думал, что тут должно быть что-то волшебное, а по сути, отрисовка по координатам. Спасибо) – Fresto Nov 21 '17 at 10:00
  • Магии нет :-) Или грязная работа спрятана в библиотеки, и выглядит как магия. – VladD Nov 21 '17 at 10:01
  • 2
    @Fresto, Вроде как есть уже готовые решения: https://stackoverflow.com/questions/5834144/for-wpf-free-candlestick-example https://stackoverflow.com/questions/2650119/how-to-draw-candle-charts-in-c-sharp – trydex Nov 21 '17 at 10:01
  • К сожалению, при текущих правилах so ваш вопрос является оффтопиком: вопрос сформулирован так, что "невозможно дать объективно верный ответ". Библиотек много (их поиск тоже оффтопик, кстати) и какой вариант ответа подойдёт вам больше невозможно определить исходя из формулировки ответа. – A K Nov 21 '17 at 10:10
  • @maxwell может быть и есть готовые, но тут я делаю полностью под себя и поэтому я буду писать всё с 0 сам. Поэтому готовые коды я вряд ли буду использовать) Думал, что именно отрисовка прямоугольников есть в более лаконичном варианте уже с системой координат и т п) – Fresto Nov 21 '17 at 10:28
  • @AK Да, я не знал, как написать название темы. По сути, мне нужно 1 в 1 нарисовать то, что на картинке, не использую готового. Вот и спросил, каким образом можно это сделать, ну и привел свои мысли по этому поводу, чтобы не казалось, что сам ничего не хочу делать – Fresto Nov 21 '17 at 10:29
  • Мы понимаем, что вы не халявщик, иначе бы к голосам на закрытие ещё и минусы посыпались. Просто -- ну не формат. Такое можно попробовать в чате спрашивать. – A K Nov 21 '17 at 10:51
  • @AK хорошо, спасибо за объяснения, впредь, постараюсь обдумывать вопросы, прежде чем задавать – Fresto Nov 21 '17 at 11:04
  • по-моему хороший вопрос, разве что нужно определиться с платформой - WPF или WinForms –  Nov 21 '17 at 12:05
  • @FoggyFinder WPF в итоге, для разнообразия возможностей. Буду постепенно учиться вырисовывать прямоугольники нужной длины и в нужных координатах. Затем масштабирование и т п. – Fresto Nov 21 '17 at 12:09

1 Answers1

5

Ваш рисунок очень похож на Candlestick chart, название которого иногда переводят как японские свечи.

Практически в каждой библиотеки для построения графиков такой тип тоже реализован, поэтому в первую очередь стоит рассмотреть готовые варианты прежде чем изобретать собственный велосипед.

Пример того, как может выглядеть такой график нарисованный при помощи библиотеки OxyPlot

введите сюда описание изображения

Подчеркну, что кроме цвета фона использовались настройки по умолчанию, так как не ставил перед собой цели добиться соответствия с приведенным изображением.

Данные получены случайным образом, по примеру из репозитория.

Не буду копировать оттуда пример, но переведу его реализацию на F# для более наглядной демонстрации типов и методов библиотеки

let candleStickSeries() = 
    let model = PlotModel(Title = "", LegendSymbolLength = 24.0 )
    let s1 = new CandleStickSeries(Title = "", Color = OxyColors.Black)
    let r = Random()

    Seq.initInfinite (fun _ -> r.NextDouble())
    |> Seq.scan(fun price a -> price + a + 0.1) 100.0
    |> Seq.indexed
    |> Seq.map
        (fun (i, price) ->
            let high = price + 10.0 + (r.NextDouble() * 10.0)
            let low = price - (10.0 + (r.NextDouble() * 10.0))
            let open' = low + (r.NextDouble() * (high - low))
            let close = low + (r.NextDouble() * (high - low))
            new HighLowItem(float i, high, low, open', close))
    |> Seq.take 30
    |> Seq.iter s1.Items.Add

    model.Series.Add(s1)
    model.Axes.Add(new LinearAxis(Position = AxisPosition.Left, MaximumPadding = 0.3, MinimumPadding = 0.3 ))
    model.Axes.Add(new LinearAxis(Position = AxisPosition.Bottom, MaximumPadding = 0.03, MinimumPadding = 0.03 ))

    model

Если хотите добиться полного (или почти полного совпадения), то советую разбить вопросы на несколько небольших и задать их по метке выбранной библиотеки.