درس 10: تایمفریمها و نمادهای دیگر
در اسکریپتتان با data.series یک تایمفریم بالاتر را بخوانید، بدانید کدام کندل را میگیرید، از روزها و هفتههای قبل استفاده کنید و ببینید چرا نماد دیگر پذیرفته نمیشود.
درس 10 از 18. اسکریپت روی کندلهای نمودار خودش اجرا میشود، اما میتواند یک تایمفریم بلندتر را هم بخواند: سقف روزانه روی نمودار 5 دقیقهای، یا روند 4 ساعته زیر نمودار 15 دقیقهای. در این درس تایمفریمهای دیگر و روزهای قبل را میخوانید و یاد میگیرید موتور چه چیزهایی را نمیپذیرد.
مقداری از یک تایمفریم بلندتر#
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)، چون مقدار روی جدیدترین کندل تا بسته شدن آن کندل مدام تکان میخورد:
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: نتیجههایی که زیادی خوب به نظر میرسند توضیح میدهد چرا چنین خواندنهایی گمراه میکنند.
اندیکاتوری از یک تایمفریم بلندتر#
عبارت میتواند هر محاسبهای باشد. روی کندلهای خودِ تایمفریم بلندتر و با تاریخچهٔ خودشان اجرا میشود:
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.
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 اعلام شود؛ بدون آن اسکریپت پذیرفته نمیشود:
indicator "A symbol that is not declared"
edition = 1
plot(data.series("60", close, symbol = "BTCUSDT"))با اعلام، اسکریپت پذیرفته میشود، اما هنگام اجرا متوقف میشود، با خطایی که نام نماد را میبرد و میگوید نمودار فقط نماد خودش را میخواند:
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)استفاده کنید و میدانید به نمودار درونروزی نیاز دارند. - میدانید نماد دیگر در این نسخه پذیرفته نمیشود، و با چه کدهایی.