millionchart
English

خط‌ها و ترسیم‌ها

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

اسکریپت نتیجه‌اش را به دو شکل نشان می‌دهد. خط‌ها (plot) از روی یک سری رسم می‌شوند، به ازای هر کندل یک مقدار: یک خط، یک هیستوگرام، یک علامت زیر کندل. ترسیم‌ها (drawing) اشیای تکی‌اند که در یک قیمت و یک کندل می‌گذارید، مثل یک خط روند، یک باکس دور یک محدوده یا یک برچسب متنی.

خط‌ها#

plot(series) یک خط رسم می‌کند. گزینه‌هایی که بیشتر به کار می‌برید name، color، width و style هستند.

Cuprel
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ضخامت خط به پیکسل
styleline (پیش‌فرض)، 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 است:

Cuprel
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 بدهید؛ در درس سیگنال‌ها یک نمونه هست.

علامت‌ها، نویسه‌ها و پیکان‌ها#

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

Cuprel
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) کندل‌های خودتان را رسم می‌کند، مثلاً یک نسخهٔ هموارشدهٔ قیمت.

Cuprel
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)

رنگی که از یک ورودی پیروی می‌کند#

رنگی که به یک ورودی بستگی دارد از آن ورودی پیروی می‌کند: ورودی را عوض کنید، رنگ در اجرای بعدی عوض می‌شود. این برای هر رنگی درست است که در اسکریپت به‌صورت رنگ ثابت نوشته نشده باشد؛ پس کلیدی که پس‌زمینه را روشن و خاموش می‌کند همان کاری را می‌کند که می‌گوید:

Cuprel
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) و یک قیمت جا می‌دهید.

Cuprel
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 نگه دارید و پیش از رسم جایگزینش آن را حذف کنید:

Cuprel
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). اسکریپتی که از عددش بگذرد اجرا می‌شود، و موتور می‌گوید چند تا را کنار گذاشته:

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

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

راه‌حل معمولاً این است که کمتر رسم کنید: فقط در نقطه‌های چرخش، فقط روی کندل‌های آخر، یا یک شیء تکی که آن را جابه‌جا می‌کنید.

Cuprel
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 نویسه بریده می‌شود. جدول‌ها در جدول‌ها آمده‌اند.

نگاه کنید به: جدول‌ها، شناسه‌ها، سقف‌ها و بودجهٔ اجرا.