تایمفریمها و نمادهای دیگر
خواندن تایمفریم بالاتر از اسکریپت با data.series، معنی خواندن پیشفرض، تغییری که live و future میدهند، و دلیل رد شدن نماد دیگر.
گاهی اسکریپت به عددی از یک تایمفریم دیگر نیاز دارد: بالاترین قیمت روز روی نمودار 5 دقیقهای، یا روند ساعتی زیر نمودار یکدقیقهای. data.series آن را به کندلهای نمودار برمیگرداند.
data.series#
data.series(timeframe, expression, symbol = ...) عبارت را روی کندلهای تایمفریم دیگر اجرا میکند و نتیجه را روی هر کندل نمودار میدهد.
indicator "Hourly average on any chart"
edition = 1
display = price
input tf: tf = "60", name = "Timeframe"
input length: int = 20, name = "Length", min = 2
let other = data.series(tf, tech.ema(close, length), symbol = symbol.id)
plot(other, name = "Average on the other timeframe", color = color.orange)symbol.idنمادِ خودِ نمودار است.- تایمفریم یک متن است. عدد صحیح یعنی دقیقه:
"15"،"60"(یک ساعت)،"240"(چهار ساعت). تعداد و واحد هم کار میکند:"15m"پانزده دقیقه است (با m کوچک)،"1h"و"4h"ساعتاند،"1D"یک روز،"1W"یک هفته و"1M"یک ماه (با M بزرگ:"15M"پانزده ماه است)."D"،"W"و"M"بهتنهایی یک روز، یک هفته و یک ماهاند. ورودی از نوعtfرا میشود مستقیم بهdata.seriesداد. - عبارت هر چیزی است که اسکریپت بتواند حساب کند: یک قیمت، یک اندیکاتور، یک شرط. روی کندلهای تایمفریم دیگر و با تاریخچهٔ خودشان حساب میشود؛ پس
tech.ema(close, length)در بالا همان EMA ساعتی است. - عبارت میتواند تاپل باشد:
data.series("1D", (high, low), symbol = symbol.id)وlet (day_high, day_low) = ....
تایمفریم باید بالاتر از تایمفریم نمودار باشد#
تایمفریم باید از تایمفریم خودِ نمودار بلندتر باشد. تایمفریمی که بلندتر نباشد جلوی اسکریپت را نمیگیرد: کندلهای خودِ نمودار را میخواند و سری با سری نمودار برابر میشود، و موتور با یک اخطار این را میگوید (W-ENGINE-LOWER-TF). وقتی سرور بازار کندل هفتگی یا ماهانه ندارد، آنها از کندلهای خودِ نمودار ساخته میشوند، همراه با یک اخطار، و فقط تا همانجایی عقب میروند که نمودار میرود.
متنی که اصلاً تایمفریم نباشد اسکریپت را متوقف میکند و هرگز کندلهای خودِ نمودار را زیر نامی دیگر نمیدهد. متنی که در اسکریپت نوشته شده باشد هنگام بررسی اسکریپت رد میشود و خط را نشان میدهد؛ متنی که حساب شود یا از یک ورودی بیاید روی کندلی که خوانده میشود رد میشود:
indicator "A timeframe that does not exist"
edition = 1
plot(data.series("1hh", close, symbol = symbol.id))پیام میگوید نمودار چه چیزی را میشناسد: دقیقه بهصورت عدد، یا تعداد و واحد. bar.time_in، bar.close_time_in، tf.changed و tf.to_seconds هم از همین خوانش استفاده میکنند.
کدام کندل را میگیرید؟#
بهطور پیشفرض آخرین کندلِ بستهشدهٔ تایمفریم دیگر را میگیرید. روی کندل 5 دقیقهای که ساعت 10:35 باز میشود، مقدار ساعتی مربوط به کندل ساعتی است که ساعت 10:00 بسته شد. این تنها انتخابی است که همین حالا و در تاریخچه یک عدد میدهد؛ برای همین پیشفرض است و امن است.
| مینویسید | میگیرید |
|---|---|
| هیچچیز | آخرین کندل بستهشدهٔ تایمفریم دیگر |
live = true | روی جدیدترین کندل نمودار، کندل ساعتیِ در حال شکلگیری، پس مقدارش تا بسته شدن تکان میخورد؛ روی کندلهای تاریخچه همان نتیجهٔ پیشفرض را میدهد (اخطار W-LIVE-READ) |
future = true | عدد نهایی کندل از همان اولین کندل نمودار، یعنی نگاه به آینده (اخطار W-FUTURE-READ؛ در استراتژی رد میشود، E3132) |
indicator "The forming hour"
edition = 1
display = price
let forming = data.series("60", close, symbol = symbol.id, live = true)
plot(forming, name = "Close of the forming hour")future = true وقتی ضرر ندارد که مقدار از ابتدای کندل معلوم باشد، مثل قیمت بازشدن روز، یا به عقب منتقل شده باشد:
indicator "Open of today, known all day"
edition = 1
display = price
let day_open = data.series("1D", open, symbol = symbol.id, future = true)
plot(day_open, name = "Open of the day")قیمت بازشدن یک کندل وقتی کندل باز میشود معلوم است، پس خواندن قیمت بازشدن روز روی هر کندلِ همان روز اشکالی ندارد. نتیجههایی که زیادی خوب به نظر میرسند توضیح میدهد چرا بقیه خطرناکاند.
بازههای یک تایمفریم کجا هستند#
روی یک نمودار، یک تایمفریم یک مجموعه بازه دارد، هر طور که بخوانیدش. کندلهای ساعتی و چهارساعتی که سرور بازار میفرستد فاز خودِ بروکر را نگه میدارند (کندل چهارساعتی ساعت 00:00، 04:00 و و به همین ترتیب به وقت UTC باز میشود)، و کندلی که بعد از آخرین آنها در حال شکلگیری است هم همین فاز را دارد. روز، هفته و ماه از جایی شروع میشوند که روز معاملاتی نماد شروع میشود (روز معاملاتی و سشنها). پس close[1] با future = true و خواندن پیشفرض همان تایمفریم یک سری میدهند: عقب بردن نگاه به آینده بهاندازهٔ یک کندل دقیقاً همان کندل بستهشده است، بدون چند ساعت همپوشانی و بدون چیزی که زودتر دیده شود.
وقتی کندلی از سرور نباشد، موتور تایمفریم را از کندلهای خودِ نمودار میسازد، از شروع روز معاملاتی میشمارد، و با W-ENGINE-HTF-RESAMPLED این را میگوید.
چه چیزی در کل اجرا ثابت میماند#
نماد و تایمفریم یک درخواست باید روی هر کندل یکی باشد. ورودی، مقداری که در اسکریپت نوشته شده و ثابتهای خودِ نمودار (symbol.id، tf.id) این شرط را دارند. قیمت یا مقداری که از کندلی به کندل دیگر عوض میشود ندارد:
indicator "A timeframe that moves"
edition = 1
let other = data.series(if close > open then "60" else "240", close, symbol = symbol.id)
plot(other)تابع میتواند تایمفریم را بهعنوان پارامتر بگیرد، به شرط اینکه هر فراخوانی روی هر کندل همان یکی را بدهد:
indicator "A helper for another timeframe"
edition = 1
display = price
input tf: tf = "240", name = "Timeframe"
fn on_timeframe(frame: tf, value: float): float = data.series(frame, value, symbol = symbol.id)
plot(on_timeframe(tf, high), name = "High", color = color.green)
plot(on_timeframe(tf, low), name = "Low", color = color.red)هر درخواست برای هر جایی که از آن صدا زده میشود حافظهٔ خودش را دارد، پس نمیتواند داخل حلقه باشد. هر فراخوانی را جداگانه بنویسید، یا یک بار پیش از حلقه صدایش بزنید:
indicator "A request in a loop"
edition = 1
mut total = 0.0
for i in 0 to 2
total += data.series("60", close, symbol = symbol.id)
plot(total)اسکریپت حداکثر 20 جفت متفاوتِ نماد و تایمفریم میتواند به کار ببرد؛ 22 فراخوانی که یک تایمفریم را میخوانند یک جفتاند. بیشتر از آن E-REQ-LIMIT است.
نماد دیگر#
دادههای نمادی غیر از نماد نمودار در این انتشار در دسترس نیست. درخواست برای آن اسکریپت را با خطایی که نماد را نام میبرد متوقف میکند. اگر نماد را در اسکریپت بنویسید، باید با uses هم تعریفش کنید تا خواننده و پلتفرم بدانند اسکریپت چه میخواهد:
indicator "A symbol that is not declared"
edition = 1
plot(data.series("60", close, symbol = "EURUSD"))indicator "A symbol that has no data here"
edition = 1
uses "EURUSD"
plot(data.series("60", close, symbol = "EURUSD"))برای نمادی که داده ندارد هرگز یک سری خالیِ ساختگی ساخته نمیشود: اسکریپت متوقف میشود، پس نتیجه هیچوقت یک خلأ بیصدا نیست. ورودی از نوع symbol با مقدار پیشفرضش تعریف میشود، و اگر مقدارش نمادِ خودِ نمودار نباشد به همین شکل رد میشود.
نگاه کنید به: نتیجههایی که زیادی خوب به نظر میرسند، روز معاملاتی و سشنها، سقفها و بودجهٔ اجرا.