millionchart
English

درس 8: برچسب‌ها، خط‌ها و باکس‌ها

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

درس 8 از 18. خطِ رسم‌شده (plot) در هر کندل یک مقدار دارد. ترسیم یک شیء تکی است که هر جا بخواهید می‌گذاریدش: برچسبی با یک متن، خطی از یک نقطه تا نقطهٔ دیگر، یا یک باکس. جای آن را با شمارهٔ کندل (bar.index، که کندل‌ها را از 0 در قدیمی‌ترین کندل می‌شمارد) و یک قیمت تعیین می‌کنید.

برچسب جایی که چیزی رخ می‌دهد#

Cuprel
indicator "Cross labels"
    edition = 1
    display = price
    max_labels = 200

let fast = tech.ema(close, 10)
let slow = tech.ema(close, 30)
let up = tech.crosses_above(fast, slow)
let down = tech.crosses_below(fast, slow)
if up
    label.new(bar.index, low, f"Up {close:price}", style = label_up, color = color.green)
if down
    label.new(bar.index, high, f"Down {close:price}", style = label_down, color = color.red)
plot(fast, name = "Fast", color = color.green)
plot(slow, name = "Slow", color = color.red)
  • label.new(x, y, text, ...) برچسبی در کندل x و قیمت y می‌گذارد. label_up از پایین رو به بالا به قیمت اشاره می‌کند و label_down از بالا رو به پایین.
  • f"Up {close:price}" متنی است که مقداری در آن آمده و با رقم‌های اعشار خود نماد نوشته می‌شود.
  • نمودار جدیدترین 50 برچسب یک اسکریپت را نگه می‌دارد، مگر سرآیند چیز دیگری بگوید؛ max_labels = 200 دویست برچسب نگه می‌دارد.

یک بار رسم کردن، روی جدیدترین کندل#

ترسیمی که در هر کندل ساخته شود، بارها و بارها ساخته می‌شود. وقتی یک دسته ترسیم می‌خواهید که نمودار را همان‌طور که حالا هست توصیف کند، فقط روی جدیدترین کندل رسم کنید، جایی که bar.is_last درست است:

Cuprel
indicator "Recent high and low"
    edition = 1
    display = price

input length: int = 50, name = "Bars", min = 2, max = 500
let top = tech.highest(high, length)
let bottom = tech.lowest(low, length)
if bar.is_last
    line.new(bar.index - length + 1, top, bar.index, top, color = color.green, extend = right)
    line.new(bar.index - length + 1, bottom, bar.index, bottom, color = color.red, extend = right)
    box.new(
        bar.index - length + 1,
        top,
        bar.index,
        bottom,
        border_color = color.gray,
        background = color.fade(color.gray, 92),
    )
plot(close, name = "Close", color = color.gray)

line.new(x1, y1, x2, y2, ...) دو نقطه را به هم وصل می‌کند؛ extend = right خط را تا سمت راست نمودار ادامه می‌دهد. box.new(left, top, right, bottom, ...) یک مستطیل رسم می‌کند.

نگه داشتن یک ترسیم و تغییر دادن آن#

ترسیم را می‌شود در یک نام state نگه داشت. آن وقت می‌توانید بعداً به جای ساختن ترسیم تازه، همان را تغییر دهید. این اسکریپت در اولین کندل یک خط می‌سازد و در هر کندل آن را به سقف 20 کندل اخیر جابه‌جا می‌کند:

Cuprel
indicator "Moving high line"
    edition = 1
    display = price

state high_line: line = na
let top = tech.highest(high, 20)
if bar.is_first
    high_line = line.new(bar.index, high, bar.index, high, color = color.orange, width = 2)
line.set_xy1(high_line, bar.index - 19, top)
line.set_xy2(high_line, bar.index, top)
plot(close, name = "Close", color = color.gray)

line.set_xy1 و line.set_xy2 دو سر خط را جابه‌جا می‌کنند. همین فکر برای برچسب‌ها (label.set_xy، label.set_text) و باکس‌ها (box.set_top، box.set_bottom، box.set_right) هم کار می‌کند. راه دیگر این است که ترسیم قبلی را پاک کنید و یکی تازه بسازید:

Cuprel
indicator "Latest swing high"
    edition = 1
    display = price

state marker: label = na
let swing = tech.pivot_high(high, 5, 5)
if not is_na(swing)
    label.delete(marker)
    marker = label.new(
        bar.index - 5,
        swing,
        f"{swing:price}",
        style = label_down,
        color = color.red,
    )
plot(close, name = "Close", color = color.gray)

فقط جدیدترین سقف سوئینگ برچسب دارد: هر سقف تازه برچسب قبلی را پاک می‌کند. سوئینگ تازه پنج کندل بعد از رخ دادنش معلوم می‌شود، و به همین دلیل برچسب پنج کندل عقب‌تر گذاشته می‌شود.

باکس دور یک الگو#

Cuprel
indicator "Inside bar boxes"
    edition = 1
    display = price
    max_boxes = 200

let inside = high < high[1] and low > low[1]
if inside
    box.new(
        bar.index - 1,
        high[1],
        bar.index,
        low[1],
        border_color = color.purple,
        background = color.fade(color.purple, 85),
    )
plot(close, name = "Close", color = color.gray)

کندل درونی (inside bar) سقفی پایین‌تر و کفی بالاتر از کندل قبلی دارد؛ باکس کندل قبلی و کندل درونی را می‌پوشاند.

وقتی تعداد زیاد می‌شود#

اسکریپتی که بیشتر از آنچه می‌تواند نگه دارد ترسیم بسازد، باز هم اجرا می‌شود، اما نمودار قدیمی‌ترین‌ها را کنار می‌گذارد و موتور با اخطار W-OBJECT-LIMIT این را می‌گوید. برچسب روی هر کندل نمونهٔ کلاسیک آن است:

Cuprel · هشدار W-OBJECT-LIMIT
indicator "A label on every bar"
    edition = 1
    display = price

label.new(bar.index, high, "bar")
plot(close)

عدد را در سرآیند بالا ببرید (max_labels، max_lines، max_boxes، حداکثر تا 500)، یا بهتر از آن، کمتر رسم کنید: فقط جایی که چیزی رخ می‌دهد، فقط روی جدیدترین کندل، یا یک ترسیم که جابه‌جایش می‌کنید. این اخطار از اجرا می‌آید، پس ویرایشگر در این نسخه آن را فهرست نمی‌کند؛ می‌بینید که ترسیم‌ها در سمت قدیمی نمودار تمام می‌شوند.

امتحان کنید#

  • در «Cross labels»، low را به low - (high - low) تغییر دهید: برچسب‌های رو به بالا کمی پایین‌تر و دورتر از کندل می‌نشینند.
  • در «Recent high and low»، if bar.is_last را حذف کنید و ترسیم‌ها را یک پله کمتر تو ببرید: نمودار پر از خط می‌شود و قدیمی‌ترین‌ها کنار گذاشته می‌شوند.
  • در «Moving high line»، به جای tech.highest(high, 20) بنویسید tech.lowest(low, 20) و رنگ را color.blue کنید: خط کف 20 کندل اخیر را دنبال می‌کند.
  • در «Inside bar boxes»، max_boxes = 10 بگذارید: فقط ده باکس جدیدتر می‌مانند.

نقطهٔ بررسی#

  • می‌توانید برچسب، خط و باکس را در یک شمارهٔ کندل و یک قیمت بگذارید.
  • می‌توانید فقط یک بار، روی جدیدترین کندل، با bar.is_last رسم کنید.
  • می‌توانید ترسیمی را در یک نام state نگه دارید و جابه‌جایش کنید، یا آن را پاک کنید و یکی تازه بکشید.
  • سقف ترسیم‌ها را می‌شناسید و می‌دانید W-OBJECT-LIMIT یعنی چه.

بعدی: درس 9: سشن‌ها و یک جدول کوچک