Tra nhanh
- 🇻🇳 Tiếng Việt
- 🇬🇧 English
- 🇰🇷 한국어
- 🇨🇳 中文
Một trang gom mọi thứ hay dùng. Chi tiết từng mục ở Tham chiếu.
Khung script
indicator({
name: "Tên", // bắt buộc
pane: "price", // "price" trên giá | "new" ngăn riêng
params: { len: param.int(14, { min: 2, max: 100, label: "Chu kỳ" }) },
plot: (d, p) => ({ "Đường": line(ta.ema(d.close, p.len)) }),
alerts: (d, p) => ({ "Giá cắt lên": d.close.crossAbove(ta.ema(d.close, p.len)) }),
});
strategy({
name: "Tên",
params: { len: param.int(20, { min: 5, max: 100, label: "Chu kỳ" }) },
signals: (d, p) => ({ entry: d.close.crossAbove(ta.sma(d.close, p.len)), exit: d.close.crossBelow(ta.sma(d.close, p.len)) }),
risk: { stopLoss: 0.07, takeProfit: 0.2, trailingStop: 0.1, maxHoldBars: 40 },
});
indicator({
name: "Theo từng nến",
series: (d) => ({ ema: ta.ema(d.close, 20) }),
state: () => ({ dem: 0 }),
onBar: (ctx, s) => {
s.dem = ctx.close > ctx.v.ema ? s.dem + 1 : 0;
return { dem: s.dem };
},
plot: (d, p, o) => ({ "Số nến trên EMA": columns(o.dem) }),
});
Dữ liệu d
d.open d.high d.low d.close d.volume · d.hl2 d.hlc3 d.ohlc4 · d.time d.index d.value d.ret · d.source("close") · d.const(5) · d.tf("1W") d.tf("1D", { forming: true }) · d.ltf("1") → .sum / mean / max / min / first / last / count / std / at · d.session.first / last / minute / weekday / day · d.info.symbol d.resolution · d.symbol("VNINDEX") d.bench · d.flow().delta / cvd d.footprint().poc (Chuyên nghiệp) · chỉ khi lọc rổ / Studio: d.fin("ROE") d.macro("cpi_yoy") d.foreignNet…
Phép của chuỗi
| Nhóm | Phép |
|---|---|
| Số học | add sub mul div pow min max neg abs log exp sqrt sign round(n) clip(lo, hi) |
| So sánh | gt gte lt lte eq neq between(a, b) |
| Logic | and or not where(dk, khac) isNaN notNaN fillna(v) ffill(n) |
| Thời gian | shift(n) diff(n) pct(n) cumsum cumprod cummax cummin ewm(n) highest(n) lowest(n) |
| Sự kiện | crossAbove(x) crossBelow(x) cross(x) barsSince() hold(n) valueWhen(dk, k) |
| Cửa sổ | rolling(n).sum / mean / std / var / min / max / count / rank / zscore / median / quantile(q) |
| Tự viết | map((x, i) => …) zip(b, (x, y) => …) combine([a, b], (vs) => …) named("tên") |
ta.*
sma ema wma hma rma rsi roc slope (chuỗi, n) · macd(x, 12, 26, 9) → macd signal hist · bb(x, 20, 2) → upper mid lower pctB width · atr(d, 14) · adx(d, 14) → adx plusDI minusDI · stoch(d, 14, 3, 3) → k d · cci(d, 20) mfi(d, 14) williamsR(d, 14) obv(d) vwap(d, 20) · donchian(d, 20) keltner(d, 20, 2, 10) → upper mid lower · supertrend(d, 10, 3) → line dir · psar(d, 0.02, 0.2) · ichimoku(d, 9, 26, 52) → tenkan kijun spanA spanB · patterns(d, opts) · ta.run("id", { … }, nguon?) — 162 chỉ báo
Tham số
param.int(14, { min, max, step, label }) · param.num(2.5, …) · param.pct(0.07, …) · param.bool(true, { label }) · param.choice("EMA", ["SMA", "EMA"], { label }) · param.enum("ema", { ema: "Hàm mũ", sma: "Đơn giản" }) · param.price(null) · param.time(null) · param.symbol("VNINDEX")
Đầu ra
line(x, { color, width, dash, step, points, offset }) · hist(x, { up, down, base }) · columns(x) · area(x, { base }) · band(tren, duoi, { fill }) · fill("A", "B", { color, below }) · hline(70, { dash }) · shape(dk, { at: "above" | "below" | "value" | "top" | "bottom", shape, char, text, size, value }) · bgcolor(dk, { color, opacity }) · barcolor(dk, { color }) · candles({ open, high, low, close }, { up, down, wick, when })
Chung: pane, opacity, format, hidden, colors: [{ when, color }]. Màu: up down accent ref ceil floor ai text textMuted palette.0…palette.5 #RRGGBB(AA).
onBar — ctx
ctx.open/high/low/close/volume/time · ctx.i ctx.closed ctx.realtime ctx.warmup ctx.symbol ctx.resolution · ctx.v.x ctx.prev("x", k) ctx.bar(k) · ctx.ta.sma/ema/rma/wma/rsi/stdev/sum/slope/highest/lowest/prev/change/cum/barsSince/crossAbove/crossBelow/cross/valueWhen/atr · ctx.track("x", v).at(k) · ctx.persist("k", () => ({})) · ctx.draw.line/box/label/polyline/remove/clear · ctx.table(ten, { position, header, rows }) · ctx.log(…) · ctx.alert(ten, loi) · ctx.ltf("x") (mảng nến nhỏ của d.ltf)
Thư viện
library({ name, exports: { ham: (d, n) => …, HANG: 3 } }) · const lib = use("<id>@<phiên bản>") — Thư viện
Chiến lược
signals → { entry, exit, limit, stop, short } · filter · risk { stopLoss, takeProfit, trailingStop, maxHoldBars, stopMode } · portfolio { capital, sizing, pyramiding } · execution { at, delay, validBars } · costs { fees, sellTax, slippage, impact } · rules { settlement, lotSize, priceLimit, limitLock, maxAdvPct, … } · Studio: universe, optimize, rank / select, weights · lệnh giấy trong onBar: ctx.buy ctx.sell ctx.order ctx.exit ctx.closePosition ctx.cancel · ctx.position ctx.orders ctx.equity ctx.cash
Đổi từ cách nghĩ thông thường
| Muốn | Viết |
|---|---|
| Giá trên MA | d.close.gt(ta.sma(d.close, 50)) |
| Hai điều kiện | a.and(b) |
| Hôm qua | x.shift(1) |
| Cắt lên | a.crossAbove(b) |
| Đỉnh n nến trước (để bứt phá) | d.high.highest(n).shift(1) |
| Chỉ lần đầu đúng | dk.and(dk.shift(1).fillna(0).not()) |
| Nếu – thì – không thì | a.where(dk, b) |
| % thay đổi n nến | d.close.pct(n) (tỷ lệ) · ta.roc(d.close, n) (%) |
| Vẽ một số | hline(70) · line(d.const(x)) |
| Nhớ qua các nến | state + onBar |
Lỗi hay gặp
> / && với chuỗi → dùng .gt() / .and() · shift(-1) → nhìn trước · giá trị onBar không vẽ → đưa qua o · ctx.ta trong if → gọi trước hoặc truyền khoá · d.tf khung nhỏ hơn biểu đồ → d.ltf · rank / topN chỉ ở Studio · use(…) sai id / phiên bản — Lỗi thường gặp
One page that gathers everything you use often. Details of each item are in the Reference.
Script skeleton
indicator({
name: "Tên", // bắt buộc
pane: "price", // "price" trên giá | "new" ngăn riêng
params: { len: param.int(14, { min: 2, max: 100, label: "Chu kỳ" }) },
plot: (d, p) => ({ "Đường": line(ta.ema(d.close, p.len)) }),
alerts: (d, p) => ({ "Giá cắt lên": d.close.crossAbove(ta.ema(d.close, p.len)) }),
});
strategy({
name: "Tên",
params: { len: param.int(20, { min: 5, max: 100, label: "Chu kỳ" }) },
signals: (d, p) => ({ entry: d.close.crossAbove(ta.sma(d.close, p.len)), exit: d.close.crossBelow(ta.sma(d.close, p.len)) }),
risk: { stopLoss: 0.07, takeProfit: 0.2, trailingStop: 0.1, maxHoldBars: 40 },
});
indicator({
name: "Theo từng nến",
series: (d) => ({ ema: ta.ema(d.close, 20) }),
state: () => ({ dem: 0 }),
onBar: (ctx, s) => {
s.dem = ctx.close > ctx.v.ema ? s.dem + 1 : 0;
return { dem: s.dem };
},
plot: (d, p, o) => ({ "Số nến trên EMA": columns(o.dem) }),
});
Data d
d.open d.high d.low d.close d.volume · d.hl2 d.hlc3 d.ohlc4 · d.time d.index d.value d.ret · d.source("close") · d.const(5) · d.tf("1W") d.tf("1D", { forming: true }) · d.ltf("1") → .sum / mean / max / min / first / last / count / std / at · d.session.first / last / minute / weekday / day · d.info.symbol d.resolution · d.symbol("VNINDEX") d.bench · d.flow().delta / cvd d.footprint().poc (Professional) · only in basket screening / Studio: d.fin("ROE") d.macro("cpi_yoy") d.foreignNet…
Series operations
| Group | Operations |
|---|---|
| Arithmetic | add sub mul div pow min max neg abs log exp sqrt sign round(n) clip(lo, hi) |
| Comparison | gt gte lt lte eq neq between(a, b) |
| Logic | and or not where(dk, khac) isNaN notNaN fillna(v) ffill(n) |
| Time | shift(n) diff(n) pct(n) cumsum cumprod cummax cummin ewm(n) highest(n) lowest(n) |
| Events | crossAbove(x) crossBelow(x) cross(x) barsSince() hold(n) valueWhen(dk, k) |
| Windows | rolling(n).sum / mean / std / var / min / max / count / rank / zscore / median / quantile(q) |
| Custom | map((x, i) => …) zip(b, (x, y) => …) combine([a, b], (vs) => …) named("tên") |
ta.*
sma ema wma hma rma rsi roc slope (series, n) · macd(x, 12, 26, 9) → macd signal hist · bb(x, 20, 2) → upper mid lower pctB width · atr(d, 14) · adx(d, 14) → adx plusDI minusDI · stoch(d, 14, 3, 3) → k d · cci(d, 20) mfi(d, 14) williamsR(d, 14) obv(d) vwap(d, 20) · donchian(d, 20) keltner(d, 20, 2, 10) → upper mid lower · supertrend(d, 10, 3) → line dir · psar(d, 0.02, 0.2) · ichimoku(d, 9, 26, 52) → tenkan kijun spanA spanB · patterns(d, opts) · ta.run("id", { … }, nguon?) — 162 indicators
Parameters
param.int(14, { min, max, step, label }) · param.num(2.5, …) · param.pct(0.07, …) · param.bool(true, { label }) · param.choice("EMA", ["SMA", "EMA"], { label }) · param.enum("ema", { ema: "Hàm mũ", sma: "Đơn giản" }) · param.price(null) · param.time(null) · param.symbol("VNINDEX")
Outputs
line(x, { color, width, dash, step, points, offset }) · hist(x, { up, down, base }) · columns(x) · area(x, { base }) · band(tren, duoi, { fill }) · fill("A", "B", { color, below }) · hline(70, { dash }) · shape(dk, { at: "above" | "below" | "value" | "top" | "bottom", shape, char, text, size, value }) · bgcolor(dk, { color, opacity }) · barcolor(dk, { color }) · candles({ open, high, low, close }, { up, down, wick, when })
Shared: pane, opacity, format, hidden, colors: [{ when, color }]. Colors: up down accent ref ceil floor ai text textMuted palette.0…palette.5 #RRGGBB(AA).
onBar — ctx
ctx.open/high/low/close/volume/time · ctx.i ctx.closed ctx.realtime ctx.warmup ctx.symbol ctx.resolution · ctx.v.x ctx.prev("x", k) ctx.bar(k) · ctx.ta.sma/ema/rma/wma/rsi/stdev/sum/slope/highest/lowest/prev/change/cum/barsSince/crossAbove/crossBelow/cross/valueWhen/atr · ctx.track("x", v).at(k) · ctx.persist("k", () => ({})) · ctx.draw.line/box/label/polyline/remove/clear · ctx.table(ten, { position, header, rows }) · ctx.log(…) · ctx.alert(ten, loi) · ctx.ltf("x") (array of lower-timeframe bars from d.ltf)
Libraries
library({ name, exports: { ham: (d, n) => …, HANG: 3 } }) · const lib = use("<id>@<phiên bản>") — Libraries
Strategies
signals → { entry, exit, limit, stop, short } · filter · risk { stopLoss, takeProfit, trailingStop, maxHoldBars, stopMode } · portfolio { capital, sizing, pyramiding } · execution { at, delay, validBars } · costs { fees, sellTax, slippage, impact } · rules { settlement, lotSize, priceLimit, limitLock, maxAdvPct, … } · Studio: universe, optimize, rank / select, weights · paper orders in onBar: ctx.buy ctx.sell ctx.order ctx.exit ctx.closePosition ctx.cancel · ctx.position ctx.orders ctx.equity ctx.cash
Translating everyday thinking into code
| You want | Write |
|---|---|
| Price above the MA | d.close.gt(ta.sma(d.close, 50)) |
| Two conditions | a.and(b) |
| Yesterday | x.shift(1) |
| Crosses above | a.crossAbove(b) |
| High of the previous n bars (for breakouts) | d.high.highest(n).shift(1) |
| Only the first time it is true | dk.and(dk.shift(1).fillna(0).not()) |
| If – then – else | a.where(dk, b) |
| % change over n bars | d.close.pct(n) (ratio) · ta.roc(d.close, n) (%) |
| Plot a number | hline(70) · line(d.const(x)) |
| Remember across bars | state + onBar |
Common mistakes
> / && with series → use .gt() / .and() · shift(-1) → looks ahead · onBar value not plotted → pass it through o · ctx.ta inside if → call it beforehand or pass a key · d.tf with a timeframe smaller than the chart → d.ltf · rank / topN only in Studio · use(…) with a wrong id / version — Common errors
자주 쓰는 내용을 한 페이지에 모았습니다. 항목별 자세한 내용은 레퍼런스에 있습니다.
스크립트 골격
indicator({
name: "Tên", // bắt buộc
pane: "price", // "price" trên giá | "new" ngăn riêng
params: { len: param.int(14, { min: 2, max: 100, label: "Chu kỳ" }) },
plot: (d, p) => ({ "Đường": line(ta.ema(d.close, p.len)) }),
alerts: (d, p) => ({ "Giá cắt lên": d.close.crossAbove(ta.ema(d.close, p.len)) }),
});
strategy({
name: "Tên",
params: { len: param.int(20, { min: 5, max: 100, label: "Chu kỳ" }) },
signals: (d, p) => ({ entry: d.close.crossAbove(ta.sma(d.close, p.len)), exit: d.close.crossBelow(ta.sma(d.close, p.len)) }),
risk: { stopLoss: 0.07, takeProfit: 0.2, trailingStop: 0.1, maxHoldBars: 40 },
});
indicator({
name: "Theo từng nến",
series: (d) => ({ ema: ta.ema(d.close, 20) }),
state: () => ({ dem: 0 }),
onBar: (ctx, s) => {
s.dem = ctx.close > ctx.v.ema ? s.dem + 1 : 0;
return { dem: s.dem };
},
plot: (d, p, o) => ({ "Số nến trên EMA": columns(o.dem) }),
});
데이터 d
d.open d.high d.low d.close d.volume · d.hl2 d.hlc3 d.ohlc4 · d.time d.index d.value d.ret · d.source("close") · d.const(5) · d.tf("1W") d.tf("1D", { forming: true }) · d.ltf("1") → .sum / mean / max / min / first / last / count / std / at · d.session.first / last / minute / weekday / day · d.info.symbol d.resolution · d.symbol("VNINDEX") d.bench · d.flow().delta / cvd d.footprint().poc(Professional) · 바스켓 필터 / Studio 전용: d.fin("ROE") d.macro("cpi_yoy") d.foreignNet…
시리즈 연산
| 그룹 | 연산 |
|---|---|
| 산술 | add sub mul div pow min max neg abs log exp sqrt sign round(n) clip(lo, hi) |
| 비교 | gt gte lt lte eq neq between(a, b) |
| 논리 | and or not where(dk, khac) isNaN notNaN fillna(v) ffill(n) |
| 시간 | shift(n) diff(n) pct(n) cumsum cumprod cummax cummin ewm(n) highest(n) lowest(n) |
| 이벤트 | crossAbove(x) crossBelow(x) cross(x) barsSince() hold(n) valueWhen(dk, k) |
| 윈도우 | rolling(n).sum / mean / std / var / min / max / count / rank / zscore / median / quantile(q) |
| 직접 작성 | map((x, i) => …) zip(b, (x, y) => …) combine([a, b], (vs) => …) named("tên") |
ta.*
sma ema wma hma rma rsi roc slope(시리즈, n) · macd(x, 12, 26, 9) → macd signal hist · bb(x, 20, 2) → upper mid lower pctB width · atr(d, 14) · adx(d, 14) → adx plusDI minusDI · stoch(d, 14, 3, 3) → k d · cci(d, 20) mfi(d, 14) williamsR(d, 14) obv(d) vwap(d, 20) · donchian(d, 20) keltner(d, 20, 2, 10) → upper mid lower · supertrend(d, 10, 3) → line dir · psar(d, 0.02, 0.2) · ichimoku(d, 9, 26, 52) → tenkan kijun spanA spanB · patterns(d, opts) · ta.run("id", { … }, nguon?) — 162개 지표
매개변수
param.int(14, { min, max, step, label }) · param.num(2.5, …) · param.pct(0.07, …) · param.bool(true, { label }) · param.choice("EMA", ["SMA", "EMA"], { label }) · param.enum("ema", { ema: "Hàm mũ", sma: "Đơn giản" }) · param.price(null) · param.time(null) · param.symbol("VNINDEX")
출력
line(x, { color, width, dash, step, points, offset }) · hist(x, { up, down, base }) · columns(x) · area(x, { base }) · band(tren, duoi, { fill }) · fill("A", "B", { color, below }) · hline(70, { dash }) · shape(dk, { at: "above" | "below" | "value" | "top" | "bottom", shape, char, text, size, value }) · bgcolor(dk, { color, opacity }) · barcolor(dk, { color }) · candles({ open, high, low, close }, { up, down, wick, when })
공통: pane, opacity, format, hidden, colors: [{ when, color }]. 색상: up down accent ref ceil floor ai text textMuted palette.0…palette.5 #RRGGBB(AA).
onBar — ctx
ctx.open/high/low/close/volume/time · ctx.i ctx.closed ctx.realtime ctx.warmup ctx.symbol ctx.resolution · ctx.v.x ctx.prev("x", k) ctx.bar(k) · ctx.ta.sma/ema/rma/wma/rsi/stdev/sum/slope/highest/lowest/prev/change/cum/barsSince/crossAbove/crossBelow/cross/valueWhen/atr · ctx.track("x", v).at(k) · ctx.persist("k", () => ({})) · ctx.draw.line/box/label/polyline/remove/clear · ctx.table(ten, { position, header, rows }) · ctx.log(…) · ctx.alert(ten, loi) · ctx.ltf("x")(d.ltf의 하위 봉 배열)
라이브러리
library({ name, exports: { ham: (d, n) => …, HANG: 3 } }) · const lib = use("<id>@<phiên bản>") — 라이브러리
전략
signals → { entry, exit, limit, stop, short } · filter · risk { stopLoss, takeProfit, trailingStop, maxHoldBars, stopMode } · portfolio { capital, sizing, pyramiding } · execution { at, delay, validBars } · costs { fees, sellTax, slippage, impact } · rules { settlement, lotSize, priceLimit, limitLock, maxAdvPct, … } · Studio: universe, optimize, rank / select, weights · onBar 안의 모의 주문: ctx.buy ctx.sell ctx.order ctx.exit ctx.closePosition ctx.cancel · ctx.position ctx.orders ctx.equity ctx.cash
일반적인 생각을 코드로 바꾸기
| 원하는 것 | 작성법 |
|---|---|
| 가격이 MA 위 | d.close.gt(ta.sma(d.close, 50)) |
| 두 조건 | a.and(b) |
| 어제 | x.shift(1) |
| 상향 교차 | a.crossAbove(b) |
| 이전 n개 봉의 고점(돌파용) | d.high.highest(n).shift(1) |
| 처음 참이 될 때만 | dk.and(dk.shift(1).fillna(0).not()) |
| 만약 – 그러면 – 아니면 | a.where(dk, b) |
| n개 봉 변화율 | d.close.pct(n)(비율) · ta.roc(d.close, n)(%) |
| 숫자 하나 그리기 | hline(70) · line(d.const(x)) |
| 봉 사이에 기억 | state + onBar |
자주 하는 실수
시리즈에 > / && 사용 → .gt() / .and() 사용 · shift(-1) → 미래 참조 · onBar 값이 그려지지 않음 → o로 전달 · if 안의 ctx.ta → 먼저 호출하거나 키 전달 · 차트보다 작은 시간 단위의 d.tf → d.ltf · rank / topN은 Studio 전용 · use(…)의 id / 버전 오류 — 자주 발생하는 오류
一页汇总所有常用内容。各项详情见参考。
脚本框架
indicator({
name: "Tên", // bắt buộc
pane: "price", // "price" trên giá | "new" ngăn riêng
params: { len: param.int(14, { min: 2, max: 100, label: "Chu kỳ" }) },
plot: (d, p) => ({ "Đường": line(ta.ema(d.close, p.len)) }),
alerts: (d, p) => ({ "Giá cắt lên": d.close.crossAbove(ta.ema(d.close, p.len)) }),
});
strategy({
name: "Tên",
params: { len: param.int(20, { min: 5, max: 100, label: "Chu kỳ" }) },
signals: (d, p) => ({ entry: d.close.crossAbove(ta.sma(d.close, p.len)), exit: d.close.crossBelow(ta.sma(d.close, p.len)) }),
risk: { stopLoss: 0.07, takeProfit: 0.2, trailingStop: 0.1, maxHoldBars: 40 },
});
indicator({
name: "Theo từng nến",
series: (d) => ({ ema: ta.ema(d.close, 20) }),
state: () => ({ dem: 0 }),
onBar: (ctx, s) => {
s.dem = ctx.close > ctx.v.ema ? s.dem + 1 : 0;
return { dem: s.dem };
},
plot: (d, p, o) => ({ "Số nến trên EMA": columns(o.dem) }),
});
数据 d
d.open d.high d.low d.close d.volume · d.hl2 d.hlc3 d.ohlc4 · d.time d.index d.value d.ret · d.source("close") · d.const(5) · d.tf("1W") d.tf("1D", { forming: true }) · d.ltf("1") → .sum / mean / max / min / first / last / count / std / at · d.session.first / last / minute / weekday / day · d.info.symbol d.resolution · d.symbol("VNINDEX") d.bench · d.flow().delta / cvd d.footprint().poc(Professional)· 仅限股票池筛选 / Studio:d.fin("ROE") d.macro("cpi_yoy") d.foreignNet…
序列运算
| 类别 | 运算 |
|---|---|
| 算术 | add sub mul div pow min max neg abs log exp sqrt sign round(n) clip(lo, hi) |
| 比较 | gt gte lt lte eq neq between(a, b) |
| 逻辑 | and or not where(dk, khac) isNaN notNaN fillna(v) ffill(n) |
| 时间 | shift(n) diff(n) pct(n) cumsum cumprod cummax cummin ewm(n) highest(n) lowest(n) |
| 事件 | crossAbove(x) crossBelow(x) cross(x) barsSince() hold(n) valueWhen(dk, k) |
| 窗口 | rolling(n).sum / mean / std / var / min / max / count / rank / zscore / median / quantile(q) |
| 自定义 | map((x, i) => …) zip(b, (x, y) => …) combine([a, b], (vs) => …) named("tên") |
ta.*
sma ema wma hma rma rsi roc slope(序列, n)· macd(x, 12, 26, 9) → macd signal hist · bb(x, 20, 2) → upper mid lower pctB width · atr(d, 14) · adx(d, 14) → adx plusDI minusDI · stoch(d, 14, 3, 3) → k d · cci(d, 20) mfi(d, 14) williamsR(d, 14) obv(d) vwap(d, 20) · donchian(d, 20) keltner(d, 20, 2, 10) → upper mid lower · supertrend(d, 10, 3) → line dir · psar(d, 0.02, 0.2) · ichimoku(d, 9, 26, 52) → tenkan kijun spanA spanB · patterns(d, opts) · ta.run("id", { … }, nguon?) ——162 个指标
参数
param.int(14, { min, max, step, label }) · param.num(2.5, …) · param.pct(0.07, …) · param.bool(true, { label }) · param.choice("EMA", ["SMA", "EMA"], { label }) · param.enum("ema", { ema: "Hàm mũ", sma: "Đơn giản" }) · param.price(null) · param.time(null) · param.symbol("VNINDEX")
输出
line(x, { color, width, dash, step, points, offset }) · hist(x, { up, down, base }) · columns(x) · area(x, { base }) · band(tren, duoi, { fill }) · fill("A", "B", { color, below }) · hline(70, { dash }) · shape(dk, { at: "above" | "below" | "value" | "top" | "bottom", shape, char, text, size, value }) · bgcolor(dk, { color, opacity }) · barcolor(dk, { color }) · candles({ open, high, low, close }, { up, down, wick, when })
通用:pane、opacity、format、hidden、colors: [{ when, color }]。颜色:up down accent ref ceil floor ai text textMuted palette.0…palette.5 #RRGGBB(AA)。
onBar — ctx
ctx.open/high/low/close/volume/time · ctx.i ctx.closed ctx.realtime ctx.warmup ctx.symbol ctx.resolution · ctx.v.x ctx.prev("x", k) ctx.bar(k) · ctx.ta.sma/ema/rma/wma/rsi/stdev/sum/slope/highest/lowest/prev/change/cum/barsSince/crossAbove/crossBelow/cross/valueWhen/atr · ctx.track("x", v).at(k) · ctx.persist("k", () => ({})) · ctx.draw.line/box/label/polyline/remove/clear · ctx.table(ten, { position, header, rows }) · ctx.log(…) · ctx.alert(ten, loi) · ctx.ltf("x")(d.ltf 的小周期 K 线数组)
库
library({ name, exports: { ham: (d, n) => …, HANG: 3 } }) · const lib = use("<id>@<phiên bản>") ——库
策略
signals → { entry, exit, limit, stop, short } · filter · risk { stopLoss, takeProfit, trailingStop, maxHoldBars, stopMode } · portfolio { capital, sizing, pyramiding } · execution { at, delay, validBars } · costs { fees, sellTax, slippage, impact } · rules { settlement, lotSize, priceLimit, limitLock, maxAdvPct, … } · Studio:universe、optimize、rank / select、weights · onBar 中的模拟委托:ctx.buy ctx.sell ctx.order ctx.exit ctx.closePosition ctx.cancel · ctx.position ctx.orders ctx.equity ctx.cash
从常规思路转换
| 想要 | 写法 |
|---|---|
| 价格在 MA 之上 | d.close.gt(ta.sma(d.close, 50)) |
| 两个条件 | a.and(b) |
| 昨天 | x.shift(1) |
| 上穿 | a.crossAbove(b) |
| n 根 K 线前的高点(用于突破) | d.high.highest(n).shift(1) |
| 仅首次成立 | dk.and(dk.shift(1).fillna(0).not()) |
| 如果 – 则 – 否则 | a.where(dk, b) |
| n 根 K 线的变化百分比 | d.close.pct(n)(比例)· ta.roc(d.close, n)(%) |
| 绘制一个数值 | hline(70) · line(d.const(x)) |
| 跨 K 线记忆 | state + onBar |