مقدارها و نوعها
انواع مقداری که اسکریپت با آنها کار میکند: عدد، متن، درست و نادرست، رنگ، na، سری و تاریخچه، تاپل، آرایه، نگاشت، رکورد و enum.
هر عبارت یک مقدار دارد. این صفحه انواع مقدار و روش نوشتن آنها را فهرست میکند. نسخهٔ زبان (edition) 1 شما را مجبور نمیکند نوع را تعریف کنید: موتور خودش میفهمد مقدار چیست. اگر برای خواننده مفید باشد، میتوانید بعد از نام یک نوع بنویسید. در edition 1 نوعِ نوشتهشده فقط مستندات است: موتور آن را بررسی نمیکند، پس نوعی که با مقدار نخواند خطا نیست.
عدد، متن، درست و نادرست#
indicator "Plain values"
edition = 1
let count = 1_000
let ratio = 0.25
let big = 1.5e3
let name = "Gold"
let other = "single quotes work too"
let flag = close > open
plot(count + ratio + big, name = "Number")
plot(if flag then 1 else 0, name = "Flag")- عدد یک نوع است.
1،1.5،.5،1_000(زیرخط ارقام را گروهبندی میکند) و1.5e3همه عدد هستند، و7 / 2میشود3.5. تقسیم صحیح وجود ندارد؛ برای رسیدن به 3 ازmath.floor(7 / 2)استفاده کنید. - متن داخل گیومه دوتایی یا تکی نوشته میشود. متن میتواند گیومهِ نوع دیگر را در خود داشته باشد. سه گیومه چند خط را نگه میدارد. escapeها و متن قالبدار
f"..."در قالببندی متن و عدد آمده است. trueوfalseدو مقدار درستی هستند. نتیجهٔ هر مقایسه یکی از این دو است.
رنگها#
رنگ میتواند #rrggbb یا #rrggbbaa باشد (جفت آخر شفافیت است: ff یعنی کاملاً پررنگ و 00 یعنی نامرئی)، یا یک رنگ نامدار مثل color.red، یا رنگی که یک تابع بسازد:
indicator "Colours"
edition = 1
display = price
plot(close, name = "Named", color = color.orange)
plot(open, name = "Hex", color = #2962ff)
plot(high, name = "With transparency", color = #ff980080)
plot(low, name = "Made", color = color.fade(color.purple, 40))
plot(hl2, name = "From parts", color = color.rgb(0, 150, 136))color.fade(color, percent) شفافیتی از 0 (پررنگ) تا 100 (نامرئی) میگیرد. color.rgb(r, g, b) سه عدد از 0 تا 255 میگیرد.
عدد نیست: na#
na یعنی «بدون مقدار». این یک مقدار مجاز است، نه خطا: میانگین در کندلهای اول آن را دارد و close[5] در پنج کندل اول آن را دارد. محاسبه با na نتیجهٔ na میدهد. مقایسه با na هرگز درست نیست. na، خطاها و محاسبه دربارهٔ همین است.
سری: یک مقدار در هر کندل#
اسکریپت برای هر کندل یک بار اجرا میشود، پس هر نام در واقع یک سری است: یک مقدار برای هر کندل. مقدار کندل جاری را با نوشتن خود نام میخوانید و مقدار n کندل قبل را با نوشتن name[n]. با همین کندلی را با کندل قبلش مقایسه میکنید.
indicator "Change from the bar before"
edition = 1
let change = close - close[1]
let two_back = close[2]
let rising = change > 0 and change[1] > 0
plot(change, name = "Change", style = histogram)
plot(if rising then 1 else 0, name = "Two rising bars")bar.index شمارهٔ کندل است که از 0 شروع میشود. x[n] فقط برای تاریخچه است. n تعداد کندلهایی است که به عقب برمیگردید؛ میتواند یک ورودی یا هر عددی باشد. در n کندل اول چنین کندلی وجود ندارد و نتیجه na است. کروشه هرگز به معنی «عضو nام یک فهرست» نیست؛ برای فهرست از .at(n) استفاده کنید.
indicator "Not a list element"
edition = 1
let levels = [close, open, high]
plot(levels[1])تاپل#
یک تابع میتواند چند مقدار را با هم بهصورت تاپل برگرداند و شما آنها را با یک الگو از هم جدا میکنید. _ یک جایگاه را دور میاندازد.
indicator "Band"
edition = 1
display = price
fn band(length: int): (float, float)
let middle = tech.sma(close, length)
let spread = tech.stdev(close, length) * 2
return (middle + spread, middle - spread)
let (upper, lower) = band(20)
let (_, floor_only) = band(50)
plot(upper, name = "Upper", color = color.red)
plot(lower, name = "Lower", color = color.green)
plot(floor_only, name = "Lower, 50 bars", color = color.gray)آرایه و نگاشت#
آرایه فهرستی مرتب است و نگاشت (map) مقدارها را با کلید نگه میدارد. هر دو را میشود خالی یا از روی یک لیترال ساخت و با متدها خواند و تغییر داد.
indicator "Last closes"
edition = 1
state closes: array<float> = []
closes.push(close)
if closes.size() > 5
closes.shift()
let items = [high, low, close]
plot(closes.avg(), name = "Average of the last 5 closes")
plot(items.at(0) - items.at(1), name = "Range")[a, b, c] آرایهای از سه مقدار است؛ [0.0; 4] چهار نسخه از 0.0 است. متدهای کاربردی عبارتاند از .size()، .at(i)، .set(i, v)، .push(v)، .shift() (قدیمیترین را برمیدارد)، .first()، .last()، .avg()، .sum()، .min() و .max(). اندیسها از 0 شروع میشوند. روش پیمایش آرایه در انتخابها و حلقهها آمده است.
indicator "Streak counter"
edition = 1
state seen: map<int, int> = map<int, int>()
state run: int = 0
if close > close[1]
run += 1
else
if run > 0
seen.set(run, (seen.at(run) ?? 0) + 1)
run = 0
plot(run, name = "Current streak", style = histogram)
plot(seen.size(), name = "Different streak lengths seen")متدهای نگاشت .set(key, value)، .at(key) (اگر کلید نباشد na میدهد؛ ولی .at(i) آرایه بیرون از آرایه، اسکریپت را متوقف میکند)، .contains(key)، .keys()، .size() و .remove(key) هستند. اندازهٔ آرایه و نگاشت سقف دارد؛ سقفها و بودجهٔ اجرا را ببینید.
رکورد و enum#
type چند فیلد نامدار را کنار هم میگذارد. با نام بردن فیلدها یکی بسازید؛ فیلدی که = دارد مقدار پیشفرض دارد.
indicator "A record"
edition = 1
type Level
price: float
strength: int = 1
let level_ = Level(price = close, strength = 3)
plot(level_.price * level_.strength, name = "Weighted price")enum فهرست کوتاهی از نامهای ثابت است. آن را با match به کار ببرید تا همهٔ حالتها پوشش داده شود:
indicator "An enum"
edition = 1
enum Direction
up
down
let direction = if close > open then Direction.up else Direction.down
let sign = match direction
Direction.up => 1
Direction.down => -1
plot(sign, name = "Sign", style = histogram)میتوانید به هر عضو enum متنی بچسبانید (fast = "Fast") و enum را نوع یک ورودی کنید تا پنل تنظیمات یک فهرست کشویی نشان بدهد. ورودیها را ببینید.
نگاه کنید به: متغیرها، تابعها، نوعها و enumها، na، خطاها و محاسبه.