millionchart
English

قالب‌بندی متن و عدد

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

متن در برچسب‌ها، جدول‌ها، پیام هشدارها و عنوان خط‌ها دیده می‌شود. این صفحه نشان می‌دهد متن را چطور بنویسید، چطور عدد داخل آن بگذارید، و چطور ظاهر عدد را درست کنید.

گیومه و escape#

متن داخل گیومه دوتایی یا تکی نوشته می‌شود. هر نوع می‌تواند نوع دیگر را در خود جا بدهد. بک‌اسلش یک escape را شروع می‌کند:

بنویسیدیعنی
\nیک خط تازه
\tیک تب
\" \' \\خود گیومه یا بک‌اسلش
\u{1F600}نویسه‌ای با این کد (یک تا شش رقم هگزا)

سه گیومه پشت‌سرهم چند خط را با هر چیزی که داخلشان باشد نگه می‌دارند:

Cuprel
indicator "Text in labels"
    edition = 1
    display = price

if bar.is_last
    label.new(
        bar.index,
        high,
        """Last bar
Quotes "like this" and 'this' are fine""",
        style = label_down,
    )
plot(close)

متن‌ها را با + به هم بچسبانید. عددی که به متن چسبانده شود به متن ساده‌اش تبدیل می‌شود ("a" + 1 می‌شود a1)؛ برای انتخاب اعشار یا علامت از متن قالب‌دار استفاده کنید.

متن قالب‌دار#

f"..." متنی است که داخل آکولادهایش عبارت می‌گذارید. بعد از دونقطه می‌گویید مقدار چطور نوشته شود.

Cuprel
indicator "Formatted text"
    edition = 1
    display = price

let change = close - close[1]
let share = close / close[1] - 1
if bar.is_last
    let t = table.new(top_right, 2, 4)
    table.cell(t, 0, 0, "Close")
    table.cell(t, 1, 0, f"{close:price}")
    table.cell(t, 0, 1, "Change")
    table.cell(t, 1, 1, f"{change:+.2f}")
    table.cell(t, 0, 2, "Change %")
    table.cell(t, 1, 2, f"{share:+.2%}")
    table.cell(t, 0, 3, "Bar")
    table.cell(t, 1, 3, f"{bar.index:06}")
plot(close)
قالبمقدارنتیجه
{x:.2f}3.141593.14
{x:.0f}4318.084318
{x:,.2f}1234567.8911,234,567.89
{x:+.1f}0.5+0.5
{x:.1%}0.25625.6%
{x:03}7007
{x:price}یک قیمتقیمت با همان تعداد اعشار خود نماد
{x}هر مقدارمقدار به‌صورت متن ساده (true، 2999)

عدد غایب (na) همان na نوشته می‌شود. برای آن بعد از علامت سؤال یک جایگزین بگذارید:

قالبمقدارنتیجه
{x:.1f}nana
{x:.1f?'n/a'}nan/a

زمان با قالب time(...) نوشته می‌شود که یک الگو و یک منطقهٔ زمانی می‌گیرد:

Cuprel
indicator "Time in text"
    edition = 1
    display = price

input zone: text = "Asia/Tehran", name = "Clock zone"
if bar.is_last
    label.new(
        bar.index,
        high,
        f"{bar.time:time('HH:mm', zone)} {bar.time:time('yyyy-MM-dd', 'UTC')}",
    )
plot(close)

قالب ناشناخته خطاست و نام آن قالب را می‌آورد:

Cuprel · خطا E2021
indicator "Unknown format"
    edition = 1
if bar.is_last
    label.new(bar.index, high, f"{close:10.2f}")
plot(close)

برای نوشتن خود آکولاد، آن را دوبار بنویسید: f"{{x}}" متن {x} است. آکولادی که نه بسته شده باشد و نه دوبار نوشته شده باشد E1010 است.

متن با گیومه تکی یا دوتایی باید در همان خط بسته شود (E1001)؛ فقط متنی که با سه گیومه نوشته می‌شود می‌تواند چند خط باشد. گیومه از نوع دیگر می‌تواند داخل آکولادها بیاید: f"{'a'}".

جانگهدارهای هشدار متن قالب‌دار نیستند#

سرور هشدار واژه‌های داخل آکولاد دوتایی مثل {{ticker}} را در یک متن ساده پر می‌کند. (هشدار روی اسکریپت‌های خودتان در این نسخه خاموش است، ولی این قاعده برای متنی که می‌نویسید برقرار است.) داخل متن قالب‌دار، آکولاد دوتایی خود آن نویسه است، پس f"{{ticker}}" می‌شود {ticker}. بررسی‌کننده دربارهٔ آن اخطار می‌دهد:

Cuprel · هشدار W-FTEXT-PLACEHOLDER
indicator "Placeholder in an f-text"
    edition = 1
    display = price

alert.when(close > open, "Up", message = f"{{ticker}} closed up")
plot(close)

جانگهدار را در متن ساده بنویسید: "{{ticker}} closed up". فهرست جانگهدارها در کلیدها و گزینه‌های هشدار آمده است.

تابع‌های متنی#

گروه text کمک‌تابع‌های معمول را دارد. بیشتر آن‌ها را می‌شود با نقطه هم نوشت.

Cuprel
indicator "Text functions"
    edition = 1
    display = price

let clock = "10:30"
let parts = clock.split(":")
let hours = text.to_number(parts.at(0))
let minutes = text.to_number(parts.at(1))
plot(hours * 60 + minutes, name = "Minutes since midnight")
if bar.is_last
    label.new(bar.index, high, text.upper("done") + " " + text.of(close, tick))
تابعچه می‌دهد
text.length(s)تعداد نویسه‌ها
text.upper(s) text.lower(s)متن با حروف بزرگ یا کوچک
text.contains(s, part)اگر part در s باشد true
text.replace(s, from, to)s با جایگزین شدن اولین from
text.slice(s, start, end)نویسه‌ها از start تا end، بدون خود end
text.split(s, separator)آرایه‌ای از تکه‌ها
text.match(s, pattern)اولین بخشی از s که با الگو جور درمی‌آید، یا متن خالی (بخش الگوها را پایین‌تر ببینید)
text.to_number(s)عددی که در s نوشته شده، یا na
text.fmt(x, format)عدد نوشته‌شده با یک قالب مثل ".2f" یا ",.2f"؛ قالب ناشناخته E-FMT-SPEC است
text.of(x, format)عدد به‌صورت متن، با الگویی مثل "#.##" یا tick

متنی که یک فراخوانی می‌سازد حداکثر می‌تواند 1,000,000 نویسه داشته باشد.

الگوها#

text.match(s, pattern) در s دنبال اولین بخشی می‌گردد که با یک الگو جور درمی‌آید و آن بخش را به‌صورت متن می‌دهد. اگر چیزی جور درنیاید، متن خالی می‌دهد. الگویی که فقط یک واژه باشد، مثل "USD"، جست‌وجوی ساده است.

Cuprel
indicator "A pattern"
    edition = 1

let digits = text.match("order-2048-x", "[0-9]+")
plot(text.to_number(digits), name = "The number in the text")

الگوخوانِ نمودار (بخشی از موتور که الگو را می‌خواند) این‌ها را می‌شناسد:

  • نویسه‌های معمولی، و . برای هر نویسه به‌جز پایان خط؛
  • کلاس‌هایی مثل [a-z] و [^0-9]، و میانبرهای \d، \w، \s و معکوس‌هایشان \D، \W، \S؛
  • ^ و $ برای آغاز و پایان متن، و \b و \B برای مرز واژه؛
  • گروه‌های ( ) و (?: ) که فقط گروه می‌کنند: فراخوانی همیشه کل تطبیق را می‌دهد؛
  • | برای انتخاب، و تکرارهای *، +، ?، {n}، {n,} و {n,m}، که پس از هرکدام می‌شود ? گذاشت تا کمترین مقدار ممکن را بردارد.

ارجاع به گروه قبلی، نگاه به جلو، نگاه به عقب، گروه‌های نام‌دار، \p{…} و \cX را نمی‌خواند؛ الگویی که یکی از آن‌ها را به کار ببرد E-REGEX-FEATURE است. الگویی که از حدهای نوشته‌شده در سقف‌ها و بودجهٔ اجرا بگذرد E-LIMIT-REGEX است. الگویی که فقط نادرست نوشته شده، مثلاً کروشهٔ بسته‌نشده، متن خالی می‌دهد. هر گام الگوخوان جزو گام‌های کندل شمرده می‌شود؛ پس الگو روی یک متن بسیار بلند با E-LIMIT-OPS تمام می‌شود و هرگز نمی‌تواند اسکریپت را بیشتر از بودجه‌اش مشغول نگه دارد.

نگاه کنید به: کلیدها و گزینه‌های هشدار، جدول‌ها، واحدها و لیترال‌ها.