درس 8: برچسبها، خطها و باکسها
برچسب، خط و باکس را در یک کندل و یک قیمت بگذارید، ترسیمی را که نگه داشتهاید جابهجا یا پاک کنید، فقط روی جدیدترین کندل رسم کنید و در سقف ترسیمها بمانید.
درس 8 از 18. خطِ رسمشده (plot) در هر کندل یک مقدار دارد. ترسیم یک شیء تکی است که هر جا بخواهید میگذاریدش: برچسبی با یک متن، خطی از یک نقطه تا نقطهٔ دیگر، یا یک باکس. جای آن را با شمارهٔ کندل (bar.index، که کندلها را از 0 در قدیمیترین کندل میشمارد) و یک قیمت تعیین میکنید.
برچسب جایی که چیزی رخ میدهد#
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 درست است:
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 کندل اخیر جابهجا میکند:
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) هم کار میکند. راه دیگر این است که ترسیم قبلی را پاک کنید و یکی تازه بسازید:
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)فقط جدیدترین سقف سوئینگ برچسب دارد: هر سقف تازه برچسب قبلی را پاک میکند. سوئینگ تازه پنج کندل بعد از رخ دادنش معلوم میشود، و به همین دلیل برچسب پنج کندل عقبتر گذاشته میشود.
باکس دور یک الگو#
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 این را میگوید. برچسب روی هر کندل نمونهٔ کلاسیک آن است:
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یعنی چه.