خطها و ترسیمها
هر چیزی که اسکریپت میتواند روی نمودار بگذارد: خط، سطح، علامت و پسزمینه از روی سری، و خط، برچسب و باکس که با قیمت و شمارهٔ کندل جا میگیرند.
اسکریپت نتیجهاش را به دو شکل نشان میدهد. خطها (plot) از روی یک سری رسم میشوند، به ازای هر کندل یک مقدار: یک خط، یک هیستوگرام، یک علامت زیر کندل. ترسیمها (drawing) اشیای تکیاند که در یک قیمت و یک کندل میگذارید، مثل یک خط روند، یک باکس دور یک محدوده یا یک برچسب متنی.
خطها#
plot(series) یک خط رسم میکند. گزینههایی که بیشتر به کار میبرید name، color، width و style هستند.
indicator "Plot styles"
edition = 1
let change = close - open
plot(
change,
name = "Body",
style = histogram,
color = if change >= 0 then color.green else color.red,
)
plot(tech.sma(change, 10), name = "Average body", width = 2, color = color.orange)
plot(0, name = "Zero", color = color.gray, display = none)| گزینه | مقدارها |
|---|---|
name | نامی که در تنظیمات و لجند نشان داده میشود |
color | یک رنگ، یا عبارتی که در هر کندل یک رنگ میدهد |
width | ضخامت خط به پیکسل |
style | line (پیشفرض)، line_break، step، step_break، step_diamond، histogram، columns، area، area_break، circles، cross |
display | جایی که مقدار نشان داده میشود: all، pane، price_scale، status_line، data_window؛ none خط را پنهان میکند |
چون خط از روی یک سری رسم میشود، فراخوانی plot همیشه در بالاترین سطح اسکریپت است، هرگز داخل if، حلقه یا تابع نیست. موتور آن را آنجا نمیپذیرد: plot(…) must be called on the top level of the script. اگر میخواهید خط فقط گاهی رسم شود، مقداری را رسم کنید که در بقیهٔ کندلها na است:
indicator "Plot sometimes"
edition = 1
display = price
let average_volume = tech.sma(volume, 20)
let strong = close > open and volume > average_volume
plot(if strong then low else na, name = "Strong bars", style = circles, width = 3)سطحها و رنگآمیزی بین دو خط#
level(price) یک سطح افقی است. shade(a, b) بین دو خط یا دو سطح را رنگ میکند. نتیجهٔ plot یا level را در یک نام نگه دارید تا بتوانید آن را به shade بدهید؛ در درس سیگنالها یک نمونه هست.
علامتها، نویسهها و پیکانها#
اینها روی کندلهایی که شرط در آنها برقرار است یک علامت میگذارند، یا پیکانی که اندازهاش از یک مقدار پیروی میکند.
indicator "Marks on bars"
edition = 1
display = price
let up = close > open and close > close[1]
let down = close < open and close < close[1]
mark.shape(up, name = "Up", shape = triangle_up, place = below, color = color.green)
mark.char(down, name = "Down", char = "x", place = above, color = color.red)
mark.arrow(
close - open,
name = "Body",
up_color = color.fade(color.green, 70),
down_color = color.fade(color.red, 70),
)place یکی از above، below، top، bottom یا absolute است (در قیمتی که خودتان میدهید).
پسزمینه و کندل#
chart.background(color) پسزمینهٔ یک کندل را رنگ میکند و chart.candles(color) خودِ کندل نمودار را. رنگِ na کندل را دستنخورده میگذارد. plot_candles(open, high, low, close) کندلهای خودتان را رسم میکند، مثلاً یک نسخهٔ هموارشدهٔ قیمت.
indicator "Candles and backgrounds"
edition = 1
display = price
let smooth_open = tech.ema(open, 5)
let smooth_high = tech.ema(high, 5)
let smooth_low = tech.ema(low, 5)
let smooth_close = tech.ema(close, 5)
chart.candles(
if smooth_close > smooth_open then color.fade(color.green, 40) else color.fade(color.red, 40),
)
plot_candles(
open = smooth_open,
high = smooth_high,
low = smooth_low,
close = smooth_close,
name = "Smoothed",
)
chart.background(if smooth_close > tech.sma(close, 50) then color.fade(color.green, 94) else na)رنگی که از یک ورودی پیروی میکند#
رنگی که به یک ورودی بستگی دارد از آن ورودی پیروی میکند: ورودی را عوض کنید، رنگ در اجرای بعدی عوض میشود. این برای هر رنگی درست است که در اسکریپت بهصورت رنگ ثابت نوشته نشده باشد؛ پس کلیدی که پسزمینه را روشن و خاموش میکند همان کاری را میکند که میگوید:
indicator "A background you can switch"
edition = 1
display = price
input show_zone: bool = false, name = "Colour the strong bars"
let strong = close > tech.sma(close, 20) + tech.atr(14)
let zone = if strong then color.fade(color.green, 85) else na
chart.background(if show_zone then zone else na, name = "Strong bars")وقتی show_zone خاموش است هیچ کندلی رنگ نمیشود؛ روشنش کنید تا کندلهایی که strong در آنها برقرار است رنگ شوند. رنگی که در خود اسکریپت نوشته شده (color.red) برای کل اجرا یک رنگ است. رنگی که فقط از ورودیها و ثابتها ساخته شده (color.fade(my_colour, 80) از یک ورودی رنگ، یا if show then color.red else na) هم برای کل اجرا یک رنگ است، و تنظیمات آن را با مقدارهای عضو دوباره استایل میکنند. رنگی که کندلها را هم میخواند، مثل zone در بالا، روی هر کندل حساب میشود. در chart.background، chart.candles، plot_candles و plot_bars رنگ همان چیزی است که کندل نشان میدهد؛ پس رنگی که به هر شکلی یک ورودی را میخواند روی هر کندل حساب میشود.
ترسیمها: خط، برچسب، باکس#
ترسیم را تابعی میسازد که آن را برمیگرداند: line.new، label.new، box.new. آن را با یک شمارهٔ کندل (bar.index) و یک قیمت جا میدهید.
indicator "Range of the last 20 bars"
edition = 1
display = price
let top = tech.highest(high, 20)
let bottom = tech.lowest(low, 20)
if bar.is_last
box.new(
bar.index - 19,
top,
bar.index,
bottom,
border_color = color.blue,
background = color.fade(color.blue, 88),
)
line.new(
bar.index - 19,
close,
bar.index,
close,
extend = right,
style = dashed,
color = color.orange,
)
label.new(bar.index, top, f"High {top:price}", style = label_down)
plot(close, name = "Close")bar.is_last فقط روی جدیدترین کندل درست است، برای همین اینها یک بار رسم میشوند. بدون آن، اسکریپت روی هر کندل یک دستهٔ تازه رسم میکرد.
ترسیمها بعد از ساخته شدن قابل تغییر و حذفاند. یکی را در یک نام state نگه دارید و پیش از رسم جایگزینش آن را حذف کنید:
indicator "Latest high"
edition = 1
display = price
state marker: line = na
let top = tech.highest(high, 50)
if bar.is_last
line.delete(marker)
marker = line.new(bar.index - 49, top, bar.index, top, color = color.red)
plot(close, name = "Close")گزینههای سرآیند اندیکاتور#
سرآیند خط اول اسکریپت و خطهای تورفتهٔ زیر آن است. display = price روی نمودار قیمت رسم میکند و display = pane (پیشفرض) در پنلی جداگانه. max_lines، max_labels، max_boxes و max_polylines میگویند چند ترسیم نگه داشته میشود (در ادامه). short_name نامی کوتاهتر برای لجند است، و format و precision میگویند مقدارها چطور نوشته شوند. edition نسخهٔ زبان (edition) است. تنظیمی برای اینکه اسکریپت تا کجا به عقب بخواند وجود ندارد: نمودار تاریخچهای را که اسکریپت میخواند خودش نگه میدارد.
چند ترسیم نگه داشته میشود#
نمودار جدیدترین 50 خط، برچسب و باکسی را که یک اسکریپت میسازد نگه میدارد و قدیمیترینها را کنار میگذارد. این عدد را در سرآیند بالا ببرید: max_lines، max_labels، max_boxes، تا 500 در این نمودار (100 برای max_polylines). اسکریپتی که از عددش بگذرد اجرا میشود، و موتور میگوید چند تا را کنار گذاشته:
indicator "A label on every bar"
edition = 1
display = price
label.new(bar.index, high, "bar")
plot(close)راهحل معمولاً این است که کمتر رسم کنید: فقط در نقطههای چرخش، فقط روی کندلهای آخر، یا یک شیء تکی که آن را جابهجا میکنید.
indicator "Labels at pivots"
edition = 1
display = price
max_labels = 500
let pivot = tech.pivot_high(high, 5, 5)
if not is_na(pivot)
label.new(bar.index - 5, pivot, f"{pivot:price}", style = label_down)
plot(close, name = "Close")پیوت پنج کندل بعد از وقوعش شناخته میشود، برای همین برچسب پنج کندل عقبتر، روی خودِ پیوت، گذاشته میشود. ببینید این برای یک سیگنال چه معنایی دارد: نتیجههایی که زیادی خوب به نظر میرسند.
متن داخل ترسیم در 2,000 نویسه بریده میشود. جدولها در جدولها آمدهاند.
نگاه کنید به: جدولها، شناسهها، سقفها و بودجهٔ اجرا.