k_chart_multiple 1.4.1  k_chart_multiple: ^1.4.1 copied to clipboard
k_chart_multiple: ^1.4.1 copied to clipboard
A Flutter K Chart support multiple secondary chart.
k_chart_multiple #
A production-ready Flutter candlestick charting library. Render multiple market charts on the same screen, combine dozens of indicators, and wire the output into trading overlays, callbacks, and custom UI.
Preview #
 
 
 
 
 
 
 

Feature Highlights #
- Manage multiple KChartWidgetinstances with custom sizing and scroll behavior.
- Built-in main chart overlays (MA, BOLL) and 50+ secondary indicators via List<SecondaryState>.
- Candlesticks, timeline view, trend-line drawing, market depth, and volume bars out of the box.
- Fine-grained appearance control with ChartStyle,ChartColors, localization, and time formatting.
- Probability engine, trading markers (TradeMark), and callbacks for strategy integration.
- Ships with a fully working example and local data so you can run it immediately.
Getting Started #
- 
Add the dependency dependencies: k_chart_multiple: ^1.1.0
- 
Import the package import 'package:k_chart_multiple/flutter_k_chart.dart';
- 
Prepare data final raw = await rootBundle.loadString('assets/chatData.json'); final List<dynamic> list = json.decode(raw)['data']; final datas = list .map((e) => KLineEntity.fromJson(e as Map<String, dynamic>)) .toList() .reversed .toList(); DataUtil.calculate(datas); // required: computes MA, indicators, probabilities, etc.
- 
Render a single chart final chart = KChartWidget( datas, ChartStyle(), ChartColors(), isTrendLine: false, mainState: MainState.MA, secondaryStates: const [SecondaryState.MACD, SecondaryState.RSI], volHidden: false, showNowPrice: true, timeFormat: TimeFormat.YEAR_MONTH_DAY_WITH_HOUR, translations: kChartTranslations, onLoadMore: (isRightEdge) { if (isRightEdge) fetchMore(); }, );
Multiple Charts on One Screen #
KChartWidget behaves like any other Flutter widget. Place it inside a ListView, GridView, or TabBarView. The sample below renders several indicator combinations in a grid:
class MultipleCharts extends StatelessWidget {
  final List<List<SecondaryState>> secondaryCombos;
  final List<KLineEntity> source;
  const MultipleCharts({
    super.key,
    required this.secondaryCombos,
    required this.source,
  });
  @override
  Widget build(BuildContext context) {
    return GridView.builder(
      padding: const EdgeInsets.all(12),
      gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
        crossAxisCount: 2,
        mainAxisSpacing: 12,
        crossAxisSpacing: 12,
        childAspectRatio: 0.75,
      ),
      itemCount: secondaryCombos.length,
      itemBuilder: (_, index) {
        return Card(
          color: Colors.black,
          child: KChartWidget(
            source,
            ChartStyle()
              ..childPadding = 8,
            ChartColors(),
            isTrendLine: false,
            mainState: MainState.MA,
            secondaryStates: secondaryCombos[index],
            volHidden: index.isEven,
            showNowPrice: true,
            fixedLength: 2,
            timeFormat: TimeFormat.YEAR_MONTH_DAY,
            mainHeight: 260,
            secondaryHeight: 90,
            onSecondaryTap: (i) {
              debugPrint('Tapped secondary chart $i of card $index');
            },
          ),
        );
      },
    );
  }
}
Tips:
- Sharing the same dataskeeps zoom and computations in sync across widgets; pass separate lists for independent data feeds.
- Use ValueNotifier, Provider, or your state manager of choice to toggle indicators, themes, or refresh data.
Configuration Overview #
- Main chart modes: MainState.MA,MainState.BOLL,MainState.NONE.
- Secondary indicators: combine any entries from SecondaryStateto render multiple panes.
- Line mode: isLine = trueswitches to timeline;isTrendLine = trueenables drawing tools.
- Volume & grid: toggle with volHiddenandhideGrid.
- Appearance: adjust point width, spacing, padding (ChartStyle) and all colors (ChartColors).
- Layout: control heights via mainHeightandsecondaryHeightor let the widget auto-balance.
- Localization & time: provide translationsand choose atimeFormat; default maps include English and Chinese out of the box.
- Interactions & loading:
- onLoadMore(bool isRightEdge)triggers when the view hits either edge.
- isOnDrag,- onSecondaryTapreport drag state and secondary chart taps.
- isTapShowInfoDialog,- showInfoDialog,- materialInfoDialogcontrol the info window behavior.
 
Indicator Catalog #
Main Chart Overlays #
- MA (Moving Average): classic multi-period moving averages to smooth price action.
- BOLL (Bollinger Bands): middle moving average with upper/lower bands describing volatility.
- NONE: hide all primary overlays.
Secondary Indicators #
- MACD: EMA difference with histogram, highlighting momentum shifts.
- KDJ: stochastic oscillator variant with fast %K, slow%D, and%Jfor spike detection.
- RSI: relative strength index, measuring overbought/oversold momentum.
- WR (Williams %R): short-term reversal oscillator anchored at recent highs/lows.
- CCI: commodity channel index for mean reversion setups.
- DMI: directional movement lines (+DI/-DI) for trend confirmation.
- TRIX: triple-smoothed EMA to emphasize long-term momentum turns.
- PPO: percentage price oscillator, a normalized MACD variant.
- TSI: true strength index, smoothing momentum with double EMA.
- ICHIMOKU: five-line cloud with shaded spans for support/resistance and trend direction.
- SAR: parabolic stop-and-reverse, useful for trailing stops.
- AROON: up/down oscillators and optional Aroon oscillator to gauge trend maturity.
- VORTEX: +VI/-VI tracks actionable directional impulses.
- ATR: average true range for absolute volatility.
- HV: historical volatility based on log returns.
- VWAP: volume-weighted average price, often used as an intraday benchmark.
- OBV: on-balance volume with optional EMA smoothing.
- ADL: accumulation/distribution line approximating money flow.
- VIX: local volatility proxy derived from price data.
- ADX: strength component of DMI; higher values imply strong trends.
- STDDEV: rolling standard deviation to quantify price dispersion.
- STOCHASTIC: smoothed stochastic oscillator for range-bound trading.
- WPR: classic Williams %R implementation for quick reversals.
- DEMARKER: compares highs/lows to measure exhaustion and reversals.
- MOMENTUM: simple price difference as raw momentum.
- MFI: money flow index combining RSI logic with volume.
- ENVELOPES: fixed-percentage bands around a moving average.
- VOLATILITY (ATR / Close): ATR normalized by price, convenient for percentage-based measures.
- CMF: Chaikin money flow, assessing buy vs sell pressure.
- CHAIKIN_OSC: fast/slow EMA of ADL to reveal turning points.
- KLINGER: volume oscillator with signal line to capture long-term trends.
- VPT: volume price trend, cumulative volume adjusted by price change.
- FORCE: Elder's force index, combining price change with volume.
- ROC: rate of change with optional signal line smoothing.
- ULTIMATE: multi-timeframe momentum oscillator blending different windows.
- CONNORS_RSI: composite score using RSI, streak length, and percentile rank.
- STOCH_RSI: stochastic transformation of RSI to expose internal rhythms.
- RVI: relative vigor index with signal line, weighting close vs open.
- DPO: detrended price oscillator to isolate cyclical swings.
- KAMA: Kaufman adaptive moving average adjusting smoothness by efficiency ratio.
- HMA: Hull moving average, fast-reacting yet smooth.
- KELTNER: EMA midline with ATR-based upper/lower channels.
- DONCHIAN: rolling high/low channel used by turtle strategies.
- BOLL_BANDWIDTH: ratio of Bollinger band width to midline, useful for volatility squeezes.
- CHAIKIN_VOLATILITY: change rate of high-low range; highlights volatility expansion/contraction.
- HV_PERCENTILE: places current historical volatility within its rolling percentile.
- ATR_PERCENTILE: percentile ranking of ATR for relative comparison.
- ELDER_RAY: bull/bear power plotted against EMA for trend validation.
- ICHIMOKU_SPAN Δ: difference between Span A and Span B, illustrating cloud thickness.
- PIVOT: classic pivot points with multi-level support/resistance bands.
- GANN_FAN: normalized Gann fan ratios for angle/time analysis.
- SUPER_TREND: ATR-driven trailing channel that changes color with trend direction.
- STC (Schaff Trend Cycle): MACD and stochastic hybrid with faster turn detection.
- QQE (Quantitative Qualitative Estimation): double-smoothed RSI plus signal line for cleaner entries.
- WAVE_TREND: multi-smoothed typical price oscillator, popular in crypto for top/bottom spotting.
- CMO (Chande Momentum Oscillator): compares aggregated gains vs losses for agile momentum readings.
- EOM (Ease of Movement): blends price range with volume to show how easily price travels.
- PVI/NVI: positive/negative volume indexes that follow price when volume expands or contracts.
Trading Marks & Probability Callbacks #
- Use TradeMarkto annotate strategy events on the main chart:final trades = [ TradeMark(index: 50, price: 26800, side: TradeSide.long, action: TradeAction.entry, label: 'Entry'), TradeMark(index: 120, price: 28400, side: TradeSide.long, action: TradeAction.tp, label: 'TP1'), ]; KChartWidget( datas, ChartStyle(), ChartColors(), isTrendLine: false, tradeMarks: trades, showTradeMarks: true, onGoingUp: (prob) => debugPrint('Secondary chart up probability: $prob'), onMainGoingUp: (prob) => debugPrint('Main chart up probability: $prob'), onUpProbs: (report) => debugPrint(report.toString()), );
- DataUtil.calculatewrites composite probabilities into- KLineEntity.probabilityand feeds the- onGoingUp/- onGoingDown/- onUpProbscallbacks so you can bridge to your strategy engine.
Working with Signal Providers #
The lib/provider directory contains indicator-aware signal calculators (for example macd_signal_provider.dart, sar_signal_provider.dart). Typical workflow:
- Update KLineEntitywith your market feed.
- Call the relevant provider to compute buy/sell points or alerts.
- Render the outcome with TradeMarkor a custom overlay.
Example App #
- example/lib/main.dartshowcases full UI composition, indicator toggles, drawing tools, and the depth chart.
- Run the sample:
flutter pub get cd example flutter run
FAQ #
- Why are indicators empty? Ensure DataUtil.calculate(list)is called before rendering.
- Time axis is wrong. KLineEntity.timeexpects a millisecond timestamp. Convert seconds to milliseconds if needed.
- Need more locales? Extend translationsor supply your ownChartTranslationsimplementation.
Contributions are welcome—issues and PRs help grow the indicator set and customization options.