채널 — Keltner · Donchian
같은 형틀, 다른 수학의 채널 둘 — Keltner(EMA ± ATR×2, 변동성 채널)와 Donchian(창 극값, 돌파 채널)을 겹쳐 성격을 비교한다. 조용한 구간에서 Keltner가 좁아지고, Donchian은 신고가·신저가가 나올 때만 계단으로 움직인다. 채우기는 둘 다 zIndex −1이다.
소스
apps/examples/src/cases/channels.ts — CI가 타입체크하는 실물이다.
ts
import { PlotBuilder, browserDeps } from "@finchart/dom";
import type { OHLC } from "@finchart/core";
import { candleSeries, priceFormat, timeTicks } from "@finchart/core";
import { legend } from "@finchart/dom";
import {
attachDonchianChannels,
attachKeltnerChannels,
} from "@finchart/indicators";
import { fixtureCandles } from "./fixture";
import { chartHost } from "./stage";
export const title = "채널 — Keltner · Donchian";
export const description =
"같은 형틀, 다른 수학의 채널 둘 — Keltner(EMA ± ATR×2, 변동성 채널)와 Donchian(창 극값, 돌파 채널)을 겹쳐 성격을 비교한다. " +
"조용한 구간에서 Keltner가 좁아지고, Donchian은 신고가·신저가가 나올 때만 계단으로 움직인다. 채우기는 둘 다 zIndex −1이다.";
export function mount(container: HTMLElement): () => void {
const host = chartHost(container, 480);
const plot = PlotBuilder.create<OHLC>(browserDeps({ autoSize: true }))
.setSize(container.clientWidth || 900, 480)
.setAxis({
x: { ticks: timeTicks({ timeZone: "UTC", locale: "ko" }) },
y: { position: "right", format: priceFormat({ compact: true, locale: "ko" }) },
})
.build(host);
const price = plot.mainPane.addSeries({
series: candleSeries(),
data: fixtureCandles(),
name: "가격",
});
plot.mainPane.use(
attachKeltnerChannels({ source: price, colors: { middle: "#0ea5e9", edges: "#0ea5e9" } }),
);
plot.mainPane.use(
attachDonchianChannels({ source: price, colors: { middle: "#f59e0b", edges: "#f59e0b" } }),
);
plot.use(legend({}));
return Object.assign(
() => {
plot.destroy();
host.remove();
},
{ requestRender: () => plot.requestRender() },
);
}