درس 11: هشدارهایی که چیزی میگویند
یک سیگنال را به هشداری با پیامی تبدیل کنید که نماد و قیمت را همراه دارد، و یاد بگیرید هشدار هر چند وقت یک بار میتواند به صدا دربیاید.
درس 11 از 18. فلشی که روی نمودار است، فقط وقتی نگاه کنید دیده میشود؛ هشدار قرار است هر جا که باشید به شما برسد. اسکریپت دو راه برای تعریف آن دارد: alert.when، که شرطی را برای پنجرهٔ هشدار نامگذاری میکند، و alert.send()، که با پیامی به صدا درمیآید که خود اسکریپت میسازد.
شرط همراه با پیام#
indicator "Cross alerts"
edition = 1
display = price
let fast = tech.sma(close, 10)
let slow = tech.sma(close, 30)
alert.when(
tech.crosses_above(fast, slow),
"Fast above slow",
message = "{{ticker}}: fast crossed above slow at {{close}}",
)
alert.when(
tech.crosses_below(fast, slow),
"Fast below slow",
message = "{{ticker}}: fast crossed below slow at {{close}}",
)
plot(fast, name = "Fast", color = color.blue)
plot(slow, name = "Slow", color = color.red)alert.when(condition, name, message) شرطی را تعریف میکند که پنجرهٔ هشدار میتواند با name آن را به کار ببرد. هشدار روی کندلی به صدا درمیآید که شرط درست میشود، نه روی هر کندلی که شرط درست میماند. اگر روی هر کندل میخواهید، on = "level" را اضافه کنید.
پیام یک متن ساده است. سرور وقتی هشداری به صدا درمیآید، کلمههای داخل آکولاد دوتایی را پر میکند (در این نسخه هشدار روی اسکریپت خودتان به صدا درنمیآید؛ هشدار بالای صفحه را ببینید):
| جانگهدار (placeholder) | با چه پر میشود |
|---|---|
{{ticker}} | نماد |
{{exchange}} | منبع قیمتی که از آن میآید |
{{interval}} | تایمفریم نمودار |
{{open}} {{high}} {{low}} {{close}} {{volume}} | کندلی که هشدار روی آن به صدا درآمد؛ قیمتها حداکثر با همان تعداد رقم اعشار خود نماد و بدون صفرهای آخر (4318.5) |
{{price}} | قیمت در لحظهای که هشدار به صدا درآمد |
{{time}} {{clock.now}} | زمان کندل و زمانی که هشدار به صدا درآمد، به وقت UTC |
{{alert_name}} | نامی که به هشدار دادهاید |
{{script_message}} | متنی که خود فراخوانی alert.send() اسکریپت داده است |
{{plot("Fast")}} | مقدار خطی که نامش "Fast" است، روی همان کندل |
جانگهداری که سرور نشناسد همانطور که نوشته شده میماند.
پیامی که خود اسکریپت میسازد#
وقتی پیام باید مقداری را همراه داشته باشد که اسکریپت حساب کرده، از alert.send() با یک متن قالبدار استفاده کنید. f"..." عبارتها را داخل آکولاد میگذارد؛ بعد از دونقطه میگویید عدد چطور نوشته شود.
indicator "Breakout alert"
edition = 1
display = price
input length: int = 20, name = "Lookback", min = 2
let top = tech.highest(high, length)[1]
if close > top
alert.send(
f"{symbol.ticker}: closed above the {length}-bar high {top:price}",
key = "breakout",
once = "bar_close",
)
plot(top, name = "High", color = color.orange)top:priceعدد را با همان تعداد رقم اعشار خود نماد مینویسد: 4318.50 برای طلا، 1.08215 برای یک جفتارز.tech.highest(high, length)[1]بالاترین مقدارhighدرlengthکندل آخر است که یک کندل عقبتر خوانده میشود، تا کندل فعلی با کندلهایی مقایسه شود که قبل از آن بودهاند.keyاین فراخوانیalertرا نام میدهد. دو فراخوانی باkeyمتفاوت دو هشدار هستند، حتی روی یک کندل. برای هر فراخوانیkeyای بگذارید که بشناسید.once = "bar_close"فقط روی کندلی به صدا درمیآید که بسته شده باشد. حالت پیشفرض،"bar"، ممکن است وقتی کندل هنوز در حال شکلگیری است به صدا دربیاید، یک بار برای هر کندل.
هر چند وقت یک بار میتواند به صدا دربیاید#
once میگوید یک key کی دوباره میتواند به صدا دربیاید، و cooldown بعد از آن مدتی انتظار اضافه میکند.
once | به صدا درمیآید |
|---|---|
"bar" | حداکثر یک بار برای هر کندل، چه بستهشده چه در حال شکلگیری (پیشفرض) |
"bar_close" | حداکثر یک بار برای هر کندل، و فقط بعد از بسته شدن آن |
"per_day" | حداکثر یک بار برای هر روز معاملاتی |
"on_change" | وقتی پیام با آخرین پیامی که این key فرستاده فرق داشته باشد |
"all" | در هر فراخوانی |
indicator "Cooled-down alert"
edition = 1
display = price
let move = math.abs(close - close[1])
if move > tech.atr(14) * 2
alert.send(f"Big move of {move:.2f}", key = "move", once = "bar_close", cooldown = 12)
plot(close, name = "Close")tech.atr(14) میانگین دامنهٔ واقعی (average true range) است، اندازهٔ معمول حرکت یک کندل در 14 کندل آخر. cooldown = 12 یعنی: این key میتواند روی یک کندل به صدا دربیاید و تا گذشتن 12 کندل دوباره به صدا درنمیآید.
جانگهدارها را در متن قالبدار (f-text) نگذارید#
{{ticker}} به متن سادهای تعلق دارد که سرور آن را پر میکند. داخل f"..." آکولاد دوتایی یعنی «خود آن نویسه»، پس f"{{ticker}}" همان متن {ticker} است. بررسیکننده وقتی این را ببیند اخطار میدهد (برای آنچه ویرایشگر فهرست میکند، ویرایشگر را ببینید).
indicator "Wrong placeholder"
edition = 1
display = price
if close > open
alert.send(f"{{ticker}} closed up at {close:price}", key = "up")
plot(close)جانگهدار را در متن ساده بنویسید و مقداری را که حساب کردهاید در متن قالبدار. آنها را با + به هم وصل کنید، یا دو هشدار بفرستید:
indicator "Right placeholder"
edition = 1
display = price
if close > open
alert.send("{{ticker}} closed up at " + text.of(close, tick), key = "up", once = "bar_close")
plot(close)امتحان کنید#
- در برنامهٔ «Cross alerts»، روی همان شرط یک علامت هم بگذارید،
mark.shape(tech.crosses_above(fast, slow), name = "Would ring", shape = triangle_up, place = below, color = color.green)، تا روی نمودار ببینید هشدار کجا به صدا درمیآمد. تقاطع را اول در خطی جدا بنویسید (let up = ...) و در هر دو فراخوانی ازupاستفاده کنید. - به پیام
alert.whenجانگهدارهای{{interval}}و{{plot("Fast")}}را اضافه کنید؛ ویرایشگر هر جانگهداری را در متن ساده میپذیرد. - در برنامهٔ «Breakout alert»،
once = "bar_close"را بهonce = "per_day"تغییر دهید و ذخیره کنید: ویرایشگر هیچ مشکلی نشان نمیدهد. - کلید را یک تنظیم کنید،
input k: text = "up", name = "Key"وkey = k، و مشکلی را که ویرایشگر گزارش میدهد بخوانید:E5102، کلید باید در خود اسکریپت نوشته شود.
نقطهٔ بررسی#
- میتوانید با
alert.whenشرطی با نام اعلام کنید و باalert.send()پیامی بسازید. - میتوانید با
onceوcooldownتعیین کنید هر کلید هر چند وقت یک بار به صدا درآید. - میدانید چرا جانگهداری مثل
{{ticker}}در متن ساده میآید، نه در f-text. - میدانید که در این نسخه هشدار روی اسکریپتهای خودتان به شما نمیرسد.
نگاه کنید به: کلیدها و گزینههای هشدار، قالببندی متن و عدد، خواندن پیامهای ویرایشگر.