برگهٔ خلاصه
نحو زبان در یک صفحه: سرآیند، نامها، ورودیها، عملگرها، انتخابها و حلقهها، تابعها، قالبها، رسم، زمان و سفارشها.
کل زبان در یک نگاه. هر شکلی که اینجا آمده روی نمودار کامپایل میشود؛ برای قاعدهها پیوندها را دنبال کنید.
یک اندیکاتور کامل#
// One program that uses most of the syntax on one page.
indicator "Cheat sheet"
edition = 1
display = price
enum Kind
sma = "SMA"
ema = "EMA"
type Band
upper: float
lower: float
group "Average"
/// How many bars the average reads
input length: int = 20, name = "Length", min = 2, max = 500
input kind: Kind = Kind.ema, name = "Kind"
input src: source = close, name = "Source"
input width: float = 2.0, name = "Width", min = 0.1, step = 0.1
input band_color: color = #2962ff, name = "Band colour"
session london = 08:00 .. 16:30 @ "Europe/London"
fn band_of(middle: float, size: float): Band = Band(upper = middle + size, lower = middle - size)
let sma = tech.sma(src, length)
let ema = tech.ema(src, length)
let middle = match kind
Kind.sma => sma
Kind.ema => ema
let b = band_of(middle, width * tech.atr(length))
state above_count = 0
mut last_three = 0.0
for i in 0 until 3
last_three += close[i]
if close > b.upper
above_count += 1
let crossed = tech.crosses_above(close, middle)
let top = plot(b.upper, name = "Upper", color = band_color)
let bottom = plot(b.lower, name = "Lower", color = band_color)
shade(top, bottom, color = color.fade(band_color, 90), name = "Band")
plot(middle, name = "Middle", color = color.gray, width = 2)
plot(last_three / 3, name = "Mean of 3 closes", display = none)
mark.shape(crossed, name = "Cross up", shape = triangle_up, place = below, color = color.green)
chart.background(if london.active then color.fade(color.blue, 94) else na, name = "London")
let yesterday_high = prior(day).high
plot(yesterday_high, name = "Yesterday's high", style = step_break, color = color.orange)
if bar.is_last
label.new(
bar.index,
b.upper,
f"{above_count} closes above, last {close:price}",
style = label_down,
)شکل یک اسکریپت#
| بنویسید | یعنی |
|---|---|
indicator "Name" | سرآیند یک اندیکاتور؛ تنظیماتش زیر آن تورفته میآیند |
strategy "Name" | سرآیند یک استراتژی (سفارشهای شبیهسازیشده) |
module Name | سرآیند ماژولی که اسکریپتهای دیگر وارد میکنند |
edition = 1 | نسخهٔ زبانی که اسکریپت برایش نوشته شده است |
display = price | روی نمودار قیمت رسم کن؛ بدون آن اسکریپت پنل خودش را میگیرد |
// text | توضیح، تا آخر خط |
/// text | بالای یک input: راهنمای کوچک آن |
| چهار فاصله | یک سطح از یک بلوک (if، for، fn، group …)؛ تب خطاست |
هر خط یک دستور. دستور بلند وقتی خط با یک عملگر یا ویرگول تمام شود، یا درون پرانتز، ادامه پیدا میکند. نگاه کنید به نحو و چیدمان.
نامها و مقدارها#
| بنویسید | یعنی |
|---|---|
let x = close - open | نامی که در هر کندل یک بار تعیین میشود و هرگز تغییر نمیکند |
mut n = 0 | مقداری که در هر کندل از نو شروع میشود و میتواند تغییر کند: n += 1، -=، *=، /= |
state count = 0 | مقداری که از کندلی به کندل بعد نگه داشته میشود؛ state day در هر روز معاملاتی از نو شروع میشود |
close[1] | مقدار یک کندل قبل (تاریخچه) |
na، is_na(x)، x ?? 0 | بیمقدار؛ آزمونش؛ یک جایگزین |
20، 2.5، "text"، true | عدد صحیح، عدد، متن، مقدار درست/نادرست |
#2962ff، color.red، color.fade(c, 80) | رنگها: یک کد، یک نام، شفافتر |
08:30، @2026-01-01T00:00Z، 15m، 0.5% | ساعتی از روز، یک لحظه، یک مدت، یک درصد |
[1, 2, 3]، [0.0; 4] | یک آرایه؛ چهار نسخه از 0.0 |
map<int, float>() | نگاشتی خالی از عدد صحیح به عدد |
نگاه کنید به let، mut و state، مقدارها و نوعها، واحدها و لیترالها.
ورودیها#
| بنویسید | نشان میدهد |
|---|---|
input length: int = 20, name = "Length", min = 1, max = 500 | عدد صحیح با حد پایین و بالا |
input mult: float = 2.0, name = "Width", step = 0.1 | یک عدد؛ step گام فیلد است |
input on: bool = true, name = "Show" | یک کلید روشن/خاموش |
input src: source = close, name = "Source" | قیمتی که اسکریپت میخواند |
input c: color = color.blue, name = "Colour" | انتخابگر رنگ |
input tf: tf = "60", name = "Timeframe" | یک تایمفریم |
input kind: text = "EMA", name = "Kind", options = ["EMA", "SMA"] | یک فهرست کشویی |
input mode: Mode = Mode.fast, name = "Mode" | فهرست کشوییِ یک enum |
group "Name" | ورودیهای تورفتهٔ زیر آن یک عنوان مشترک میگیرند |
نگاه کنید به ورودیها.
عملگرها، از سست به محکم#
| عملگرها | نکته |
|---|---|
if c then a else b | مقداری که با یک شرط انتخاب میشود؛ else لازم است |
or | سمت راست فقط وقتی اجرا میشود که سمت چپ نادرست باشد |
and | سمت راست فقط وقتی اجرا میشود که سمت چپ درست باشد |
not | سستتر از مقایسه: not a == b یعنی not (a == b) |
== != < <= > >= | زنجیره نمیشوند: a < b < c خطاست |
?? | سمت راست وقتی سمت چپ na باشد |
+ - | جمع، تفریق (+ متنها را هم به هم میچسباند) |
* / % | ضرب، تقسیم، باقیمانده |
-x | منفی |
x[1]، f(x)، a.b | تاریخچه، فراخوانی، عضو |
عملگر توان وجود ندارد: بنویسید math.pow(x, 2). فراخوانیای که کندلهای قبلی را به یاد دارد (tech.*، data.series) نمیتواند سمت راست and، or، ?? یا در یکی از شاخههای if ... then ... else بنشیند (E3302): به آن یک خط جدا بدهید. نگاه کنید به عملگرهای تنبل.
انتخابها و حلقهها#
| بنویسید | کارش |
|---|---|
if cond با یک بلوک تورفته، else | وقتی شرط درست است بلوک را اجرا میکند |
let v = if cond then a else b | یک مقدار را انتخاب میکند |
match x و سپس خطهای "a" => 1 و _ => 0 | بر اساس مقدار انتخاب میکند؛ match بدون موضوع بر اساس شرط انتخاب میکند |
for i in 0 to 3 | 0، 1، 2، 3 (until 3 عدد 3 را کنار میگذارد؛ by 2 گام را تعیین میکند) |
for x in items، for (i, x) in items | هر عضو یک آرایه، همراه جایگاهش |
while cond | تا وقتی شرط برقرار است تکرار میکند |
break، continue | از حلقه بیرون برو؛ به دور بعدیاش برو |
حلقه نمیتواند فراخوانیای داشته باشد که کندلهای قبلی را به یاد دارد (E3301). نگاه کنید به انتخابها و حلقهها.
تابعها، نوعها و enumها#
| بنویسید | یعنی |
|---|---|
fn mid(a: float, b: float): float = (a + b) / 2 | تابعی یکخطی |
fn f(x: float) با یک بلوک تورفته و return | تابعی با بلوک |
fn scaled(x: float, k: float = 2.0): float | پارامتری با مقدار پیشفرض؛ صدا زدن با scaled(close, k = 0.5) |
let (a, b) = pair() | جدا کردن یک تاپل (_ یک مقدار را رد میکند) |
type Band با فیلدهای تورفته مثل upper: float | یک رکورد؛ ساختنش با Band(upper = 1.0, lower = 0.0) |
fn Band.width(self): float = self.upper - self.lower | یک متد، که با b.width() صدا زده میشود |
enum Mode با fast = "Fast" تورفته | فهرست بستهای از نامها |
import Me/Name@1 as alias | یکی از ماژولهای خودتان |
تابع نمیتواند خودش را صدا بزند (E3310). نگاه کنید به تابعها، نوعها و enumها، ماژولها و کتابخانهها.
متن و قالبها#
| بنویسید | میدهد |
|---|---|
f"Close {close:price}" | قیمت بستهشدن با تعداد اعشار خود نماد |
{x:.2f}، {x:,.2f}، {x:+.1f} | دو رقم اعشار؛ با جداکنندهٔ هزارگان؛ با علامت |
{x:.1%}، {x:03} | یک درصد؛ با صفرهای پیشین |
{x:.1f?'n/a'} | تا وقتی x برابر na است، n/a |
text.fmt(x, ".2f")، text.length(s)، text.split(s, ",") | تابعهای متن |
نگاه کنید به قالببندی متن و عدد.
رسم روی نمودار#
| بنویسید | رسم میکند |
|---|---|
plot(x, name = "A", color = color.blue, width = 2, style = histogram) | یک سری روی هر کندل |
level(70, name = "Top", style = dashed) | یک خط افقی |
shade(top, bottom, color = color.fade(color.purple, 90)) | فضای میان دو خط رسمشده یا دو سطحِ نگهداشته در نام |
mark.shape(cond, shape = triangle_up, place = below) | شکلی جایی که شرط درست است |
mark.char(cond, char = "x", place = above)، mark.arrow(x) | یک حرف؛ فلشی رو به بالا یا پایین بر اساس علامت |
chart.background(if cond then color.fade(color.green, 90) else na) | پسزمینهٔ یک کندل |
chart.candles(color) | کندلهای نمودار را دوباره رنگ میکند |
label.new(bar.index, high, "text")، line.new(x1, y1, x2, y2)، box.new(left, top, right, bottom) | ترسیمهایی که با کندل و قیمت جای داده میشوند |
table.new(top_right, 2, 2)، table.cell(t, 0, 0, "A") | جدولی در یک گوشه |
log.info("close {0}", close) | یک خط در لاگ اسکریپت |
سبکهای خط: line، line_break، step، step_break، step_diamond، histogram، columns، area، area_break، circles، cross. نگاه کنید به خطها و ترسیمها، جدولها.
زمان و تایمفریمهای دیگر#
| بنویسید | میدهد |
|---|---|
bar.index، bar.time، bar.is_last | شمارهٔ کندل، زمانش، روی جدیدترین کندل درست |
data.series("240", tech.ema(close, 20), symbol = symbol.id) | یک عبارت روی تایمفریم دیگر، آخرین کندل بستهشده |
prior(day).high، current(week).open | بالاترین قیمت دیروز؛ قیمت بازشدن این هفته (نمودارهای درونروزی) |
session london = 08:00 .. 16:30 @ "Europe/London" | یک سشن نامدار: london.active، .start، .end، .high، .low |
clock.hour_of(bar.time, zone = "UTC") | ساعتِ یک زمان در یک منطقهٔ زمانی |
نگاه کنید به تایمفریمها و نمادهای دیگر، روز معاملاتی و سشنها.
نامهای داخلی پرکاربرد#
| گروه | چند نام از آن |
|---|---|
| قیمتها | open high low close volume hl2 hlc3 ohlc4 |
tech | tech.sma tech.ema tech.rma tech.rsi tech.atr tech.stdev tech.highest tech.lowest tech.crosses_above tech.crosses_below tech.pivot_high tech.macd |
math | math.abs math.max math.min math.round math.floor math.sqrt math.pow math.sign |
symbol | symbol.id symbol.tick symbol.pip |
color | color.rgb color.fade color.gradient و رنگهای نامدار |
فهرست توابع هر نام را با پارامترهایش فهرست میکند و مرجع توابع هر کدام را توضیح میدهد.
استراتژیها#
| بنویسید | کارش |
|---|---|
orders.enter("Long", side.long) | یک معاملهٔ خرید شبیهسازیشده با کلید "Long" باز میکند (side.short برای فروش) |
orders.close("Long") | آن را میبندد |
orders.exit("Exit", "Long", stop = s, limit = t) | حد ضرر و هدف برای معاملهٔ "Long" |
orders.cancel("Key")، orders.close_all() | یک سفارش را لغو میکند؛ همه را میبندد |
position.size، position.avg_price | اندازهٔ باز (برای خرید مثبت)؛ قیمتش |
setup: با capital، size = sizing.lots(0.1)، fees = fee.per_lot(3.5) | سرمایه، اندازه و کمیسیون |
execution: با spread = 20 ticks، slippage = 2 ticks | هزینههای پر شدن |
// A strategy: orders with a key, a stop and a target, size and costs in the header.
strategy "Cheat sheet strategy"
edition = 1
display = price
setup:
capital = 10000
size = sizing.lots(0.1)
fees = fee.per_lot(3.5)
execution:
spread = 20 ticks
slippage = 2 ticks
let fast = tech.ema(close, 10)
let slow = tech.ema(close, 30)
if tech.crosses_above(fast, slow)
orders.enter("Long", side.long)
if position.size > 0
orders.exit("Exit", "Long", stop = position.avg_price * 0.99, limit = position.avg_price * 1.02)
if tech.crosses_below(fast, slow)
orders.close("Long")
plot(fast, name = "Fast", color = color.green)
plot(slow, name = "Slow", color = color.red)نگاه کنید به اولین استراتژی شما، استراتژیها و سرآیند.