millionchart
English

مقدارها و نوع‌ها

انواع مقداری که اسکریپت با آن‌ها کار می‌کند: عدد، متن، درست و نادرست، رنگ، na، سری و تاریخچه، تاپل، آرایه، نگاشت، رکورد و enum.

هر عبارت یک مقدار دارد. این صفحه انواع مقدار و روش نوشتن آن‌ها را فهرست می‌کند. نسخهٔ زبان (edition) 1 شما را مجبور نمی‌کند نوع را تعریف کنید: موتور خودش می‌فهمد مقدار چیست. اگر برای خواننده مفید باشد، می‌توانید بعد از نام یک نوع بنویسید. در edition 1 نوعِ نوشته‌شده فقط مستندات است: موتور آن را بررسی نمی‌کند، پس نوعی که با مقدار نخواند خطا نیست.

عدد، متن، درست و نادرست#

Cuprel
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، یا رنگی که یک تابع بسازد:

Cuprel
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]. با همین کندلی را با کندل قبلش مقایسه می‌کنید.

Cuprel
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) استفاده کنید.

Cuprel · خطا E3173
indicator "Not a list element"
    edition = 1

let levels = [close, open, high]
plot(levels[1])

تاپل#

یک تابع می‌تواند چند مقدار را با هم به‌صورت تاپل برگرداند و شما آن‌ها را با یک الگو از هم جدا می‌کنید. _ یک جایگاه را دور می‌اندازد.

Cuprel
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) مقدارها را با کلید نگه می‌دارد. هر دو را می‌شود خالی یا از روی یک لیترال ساخت و با متدها خواند و تغییر داد.

Cuprel
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 شروع می‌شوند. روش پیمایش آرایه در انتخاب‌ها و حلقه‌ها آمده است.

Cuprel
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 چند فیلد نام‌دار را کنار هم می‌گذارد. با نام بردن فیلدها یکی بسازید؛ فیلدی که = دارد مقدار پیش‌فرض دارد.

Cuprel
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 به کار ببرید تا همهٔ حالت‌ها پوشش داده شود:

Cuprel
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، خطاها و محاسبه.