درس 5: مقدارهایی که به یاد میمانند
کندلهای قبلی را با [n] بخوانید، مقداری را با state از کندلی به کندل بعد نگه دارید، آن را هر روز از نو شروع کنید و کندلهای پس از یک رویداد را بشمارید.
درس 5 از 18. اسکریپت برای هر کندل یک بار اجرا میشود، از بالای فایل تا پایین آن، و هر چه را حساب کرده با پایان کندل فراموش میکند. این درس دو راهی را نشان میدهد که اسکریپت با آنها چیزی را به یاد نگه میدارد: خواندن تاریخچهٔ یک مقدار، و نگه داشتن یک مقدار با state.
کندلهای قبلی#
close[1] قیمت بستهشدن کندل قبلی است و close[5] قیمت بستهشدن پنج کندل عقبتر. هر نامی همینطور کار میکند، حتی نامی که خودتان ساختهاید.
indicator "Change over a few bars"
edition = 1
display = pane
input back: int = 5, name = "Bars back", min = 1, max = 100
let change = close - close[back]
plot(
change,
name = "Change",
style = histogram,
color = if change >= 0 then color.green else color.red,
)
level(0, name = "Zero", color = color.gray)در back کندل اول، کندلی به آن فاصله در گذشته وجود ندارد؛ پس close[back] برابر na (بیمقدار) است، تغییر هم na میشود و آنجا چیزی رسم نمیشود. ورودی یک max دارد: موتور میخواهد بداند اسکریپت حداکثر چقدر به عقب میخواند.
مقداری که از کندلی به کندل بعد نگه داشته میشود#
نامی که با let ساخته شود، در هر کندل دوباره ساخته میشود. نامی که با state ساخته شود، یک بار، در اولین کندل، مقدار میگیرد و بعد نگه داشته میشود: هر کندل با همان مقداری شروع میکند که کندل قبلی با آن تمام کرد.
indicator "Up streak"
edition = 1
display = pane
state streak = 0
if close > close[1]
streak += 1
else
streak = 0
plot(streak, name = "Bars up in a row", style = columns, color = color.teal)streak += 1 یکی به مقدار نگهداشتهشده اضافه میکند. در اولین کندل close[1] برابر na است، مقایسه نادرست میشود و شمارش از 0 شروع میشود.
مقداری برای یک کندل، و مقداری برای یک روز#
mut نامی است که میتوانید مقدارش را عوض کنید، اما فقط در طول اجرای یک کندل: در کندل بعد از نو شروع میشود. state day مثل state نگه داشته میشود، اما در اولین کندل هر روز معاملاتی از نو شروع میشود.
indicator "Largest body today"
edition = 1
display = pane
mut body = close - open
if body < 0
body = -body
state day largest = 0.0
if body > largest
largest = body
plot(body, name = "Body", style = columns, color = color.gray)
plot(largest, name = "Largest body today", color = color.orange)body اندازهٔ بدنهٔ همین کندل است که در هر کندل دوباره حساب میشود. largest بزرگترین بدنهای را که امروز تا این لحظه دیده شده نگه میدارد و با شروع روز معاملاتی تازه به 0 برمیگردد. آن را روی نمودار درونروزی به کار ببرید؛ روی نمودار روزانه هر کندل یک روز تازه است.
کندلها از وقتی چیزی رخ داد#
مقدار نگهداشتهشده میتواند کندلهای بعد از یک رویداد را بشمارد. اینجا مقدار با na شروع میشود، پس تا اولین تقاطع چیزی رسم نمیشود:
indicator "Bars since the last cross"
edition = 1
display = pane
let fast = tech.ema(close, 10)
let slow = tech.ema(close, 30)
let up = tech.crosses_above(fast, slow)
let down = tech.crosses_below(fast, slow)
state since: int = na
if up or down
since = 0
else if not is_na(since)
since += 1
plot(since, name = "Bars since the last cross", style = columns, color = color.blue)دو آزمون تقاطع، هر کدام در یک خط جدا و در هر کندل حساب میشوند و فقط بعد از آن با or ترکیب میشوند. تابعی مثل tech.crosses_above کندلهایی را که دیده به یاد دارد؛ اگر مستقیم در سمت راست or نوشته شود، بعضی کندلها را از دست میدهد و بررسیکننده آن را نمیپذیرد (صفحهٔ خواندن پیامهای ویرایشگر این پیام را نشان میدهد).
امتحان کنید#
- در «Change over a few bars»، Bars back را روی 1 بگذارید: هیستوگرام تغییر هر کندل نسبت به کندل قبلی میشود.
- در «Up streak»، به جای
close > close[1]بنویسیدclose > open: حالا شمارش، کندلهای سبزِ پشت سر هم را میشمارد. - در «Largest body today»،
state dayرا بهstateتغییر دهید: خط نارنجی دیگر هیچوقت پایین نمیآید، چون بزرگترین بدنهٔ کل نمودار را نگه میدارد. - در «Bars since the last cross»،
or downرا حذف کنید: شمارش فقط با تقاطعهای رو به بالا از نو شروع میشود.
نقطهٔ بررسی#
- میتوانید مقدار یک نام را چند کندل عقبتر با
[n]بخوانید و میدانید که در آغاز نمودارnaاست. - میتوانید مقداری را با
stateاز کندلی به کندل بعد نگه دارید و باstate dayهر روز از نو شروعش کنید. - میدانید کی
let، کیmutو کیstateبه کار میرود. - میتوانید کندلهای پس از یک رویداد را بشمارید.
بعدی: درس 6: تابعهای خودتان