chartjs/chartjs-chart-financial

Candle border options

DaveSkender opened this issue · 3 comments

Enhancement recommendation: on a chart with many candles, I would like the red and green colors to be prevalent. With excess bars, the colors completely disappear. Recommend either 1) have border options, or 2) default to borderless candles where wicks, border, and body are one color.

Current:
4A57A580-7C16-4828-9CDB-9FDB26FB3D69

Preferred:
37ECC201-E02B-4615-AACF-261228B16EC8

You can already do something like that 😅

var defaultOpts = Chart.defaults.elements["candlestick"];
var chart = new Chart(ctx, {
	type: 'candlestick',
	data: {
		datasets: [{
			label: 'CHRT - Chart.js Corporation',
			data: barData,
			borderColor :{
				up: defaultOpts.color.up,
				down: defaultOpts.color.down,
				unchanged: defaultOpts.color.up
			}
		}]
	}})

Screenshot 2021-12-13 at 10 24 16

This probably works fine in straight JavaScript, but it's choking on the custom candlestick dataset type in Angular/Typescript.

var defaultOpts = Chart.defaults.elements["candlestick"];

myConfig.data = {
  datasets: [
    {
      type: 'candlestick',
      label: 'Price',
      data: price,
      borderColor: {
        up: defaultOpts.color.up,
        down: defaultOpts.color.down,
        unchanged: defaultOpts.color.up
      },
      yAxisID: 'yAxis'
    }
  ]
};
 node_modules/chart.js/types/index.esm.d.ts:1653:3
    1653   borderColor: Color;
           ~~~~~~~~~~~
The expected type comes from property 'borderColor' which is declared here on 
type 'ChartDataset<keyof ChartTypeRegistry, 
(number | ScatterDataPoint | BubbleDataPoint | FinancialDataPoint)[]>' 

WORKAROUND: for anyone using TypeScript, here's how I solved it:

// add new dataset options type for borderColor
type CandlestickDatasetOptions = BarControllerDatasetOptions & {
    borderColor: {
        up: string,
        down: string,
        unchanged: string
    };
}
// custom border colors
const candleOptions = Chart.defaults.elements["candlestick"];

// sets body color defaults
candleOptions.color.up = 'darkGreen';
candleOptions.color.down = 'darkRed';
candleOptions.color.unchanged = '#555555';

// define border and wicks color
// this should set the default, but still have to reapply in dataset (below)
candleOptions.borderColor = {
  up: candleOptions.color.up,
  down: candleOptions.color.down,
  unchanged: candleOptions.color.unchanged
};

// define base datasets
chartConfig.data = {
  datasets: [
    {
      type: 'candlestick',
      label: 'Price',
      data: price,
      yAxisID: 'yAxis',
      borderColor: candleOptions.borderColor // sets border and wicks color
    }
  ]
};

image

See PR (#115) for my suggestion on how to fix and use this in the main package.