millionchart
English

درس 10: تایم‌فریم‌ها و نمادهای دیگر

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

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

مقداری از یک تایم‌فریم بلندتر#

Cuprel
indicator "Daily range on any chart"
    edition = 1
    display = price

let (day_high, day_low) = data.series("1D", (high, low), symbol = symbol.id)
plot(day_high, name = "High of the last closed day", color = color.green, style = step_break)
plot(day_low, name = "Low of the last closed day", color = color.red, style = step_break)
  • data.series(timeframe, expression, symbol = symbol.id) عبارت را روی کندل‌های تایم‌فریم دیگر حساب می‌کند و نتیجه را روی هر کندل نمودار شما می‌دهد.
  • symbol.id نماد خودِ نمودار است.
  • عبارتِ اینجا یک جفت مقدار است، (high, low)، که با let (day_high, day_low) = ... از هم جدا می‌شود.
  • تایم‌فریم یک متن است: "60" یعنی 60 دقیقه، و "15m"، "4h"، "1D"، "1W" و "1M" یعنی 15 دقیقه، 4 ساعت، یک روز، یک هفته و یک ماه. تایم‌فریم باید از تایم‌فریم خود نمودار بلندتر باشد.

کدام کندل را می‌گیرید#

data.series به‌طور پیش‌فرض آخرین کندلِ بسته‌شدهٔ تایم‌فریم دیگر را می‌دهد. امروز روی نمودار 5 دقیقه‌ای، برنامهٔ بالا سقف و کف دیروز را نشان می‌دهد، نه امروز را: کندل روزانهٔ امروز هنوز تمام نشده و سقفش هنوز ممکن است عوض شود. این تنها خوانشی است که روی جدیدترین کندل و در تاریخچه یک خط یکسان می‌دهد، و برای همین پیش‌فرض است.

با live = true می‌توانید کندلی را بخواهید که هنوز در حال شکل‌گیری است. موتور آن را می‌پذیرد اما اخطار می‌دهد (W-LIVE-READ)، چون مقدار روی جدیدترین کندل تا بسته شدن آن کندل مدام تکان می‌خورد:

Cuprel · هشدار W-LIVE-READ
indicator "The forming day"
    edition = 1
    display = price

let forming_high = data.series("1D", high, symbol = symbol.id, live = true)
plot(forming_high, name = "High of the forming day", color = color.green)

future = true یک قدم جلوتر می‌رود: عدد نهایی هر کندل را از اولین کندل نمودارِ آن به بعد نشان می‌دهد. این یعنی نگاه به آینده، پس موتور اخطار می‌دهد (W-FUTURE-READ) و استراتژی اجازهٔ استفاده از آن را ندارد. صفحهٔ تایم‌فریم‌ها و نمادهای دیگر جزئیات را دارد و درس 16: نتیجه‌هایی که زیادی خوب به نظر می‌رسند توضیح می‌دهد چرا چنین خواندن‌هایی گمراه می‌کنند.

اندیکاتوری از یک تایم‌فریم بلندتر#

عبارت می‌تواند هر محاسبه‌ای باشد. روی کندل‌های خودِ تایم‌فریم بلندتر و با تاریخچهٔ خودشان اجرا می‌شود:

Cuprel
indicator "Higher timeframe trend"
    edition = 1
    display = price

input tf: tf = "240", name = "Higher timeframe"
input length: int = 50, name = "Length", min = 2
let slope = data.series(tf, tech.change(tech.ema(close, length)), symbol = symbol.id)
let average = data.series(tf, tech.ema(close, length), symbol = symbol.id)
let up = color.fade(color.green, 90)
let down = color.fade(color.red, 90)
chart.background(if is_na(slope) then na else if slope > 0 then up else down, name = "Trend")
plot(average, name = "Higher timeframe average", color = color.orange, width = 2)

tech.change(x) تفاوت x با مقدارش در یک کندل قبل است. وقتی روی کندل‌های 4 ساعته حساب شود، می‌گوید میانگین 4 ساعته در آخرین کندل 4 ساعتهٔ بسته‌شده بالا رفته یا نه. ورودی از نوع tf را می‌شود مستقیم به data.series داد.

روزها و هفته‌های قبل#

برای عددهای روزها و هفته‌های کامل راه کوتاه‌تری هست که از کندل‌های خود نمودار ساخته می‌شود: prior(day) آخرین روزی است که تمام شده، current(day) روزی که هنوز در حال شکل‌گیری است، و همین برای week و month.

Cuprel
indicator "Today against yesterday"
    edition = 1
    display = pane

let yesterday_range = prior(day).high - prior(day).low
let today_range = current(day).high - current(day).low
plot(
    100 * today_range / yesterday_range,
    name = "Today's range, % of yesterday's",
    color = color.purple,
)
level(100, name = "Yesterday's range", color = color.gray, style = dashed)

آن را روی نمودار درون‌روزی به کار ببرید: روی نمودار روزانه، prior(day) اسکریپت را با E-PERIOD-TF متوقف می‌کند.

نماد دیگر#

دادهٔ نمادی غیر از نماد نمودار در این نسخه در دسترس نیست. نمادی که در اسکریپت نوشته شود اول باید با uses اعلام شود؛ بدون آن اسکریپت پذیرفته نمی‌شود:

Cuprel · خطا E-REQ-UNDECLARED
indicator "A symbol that is not declared"
    edition = 1

plot(data.series("60", close, symbol = "BTCUSDT"))

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

Cuprel · خطا E4001
indicator "A symbol that has no data here"
    edition = 1

uses "BTCUSDT"
plot(data.series("60", close, symbol = "BTCUSDT"))

موتور هیچ‌وقت برای نمادی که نمی‌تواند بخواند یک سری خالیِ ساختگی نمی‌سازد: اسکریپت متوقف می‌شود، پس نتیجه هیچ‌وقت یک خلأ بی‌صدا نیست. فعلاً symbol = symbol.id بنویسید.

امتحان کنید#

  • در «Daily range on any chart»، "1D" را به "1W" تغییر دهید. حالا خط‌ها سقف و کف آخرین هفتهٔ بسته‌شده را نشان می‌دهند.
  • به همان فراخوانی live = true اضافه کنید و مقایسه کنید: روی جدیدترین کندل‌ها خط‌ها سقف و کف امروز را دنبال می‌کنند و ویرایشگر یادداشت W-LIVE-READ را فهرست می‌کند.
  • در «Higher timeframe trend»، روی نمودار 5 دقیقه‌ای تایم‌فریم را 60 بگذارید. رنگ پس‌زمینه بیشتر عوض می‌شود، چون میانگین ساعتی بیشتر جهت عوض می‌کند.
  • «Today against yesterday» را روی نمودار روزانه باز کنید و پیامی را که ویرایشگر نشان می‌دهد بخوانید.

نقطهٔ بررسی#

  • می‌توانید مقداری از یک تایم‌فریم بلندتر را با data.series و symbol = symbol.id بخوانید.
  • می‌توانید بگویید خوانش پیش‌فرض کدام کندل را می‌دهد و live = true و future = true چه چیزی را عوض می‌کنند.
  • می‌توانید از prior(day) و current(day) استفاده کنید و می‌دانید به نمودار درون‌روزی نیاز دارند.
  • می‌دانید نماد دیگر در این نسخه پذیرفته نمی‌شود، و با چه کدهایی.

بعدی: درس 11: هشدارهایی که چیزی می‌گویند