millionchart
English

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

یک سیگنال را به هشداری با پیامی تبدیل کنید که نماد و قیمت را همراه دارد، و یاد بگیرید هشدار هر چند وقت یک بار می‌تواند به صدا دربیاید.

درس 11 از 18. فلشی که روی نمودار است، فقط وقتی نگاه کنید دیده می‌شود؛ هشدار قرار است هر جا که باشید به شما برسد. اسکریپت دو راه برای تعریف آن دارد: alert.when، که شرطی را برای پنجرهٔ هشدار نام‌گذاری می‌کند، و alert.send()، که با پیامی به صدا درمی‌آید که خود اسکریپت می‌سازد.

شرط همراه با پیام#

Cuprel
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"..." عبارت‌ها را داخل آکولاد می‌گذارد؛ بعد از دونقطه می‌گویید عدد چطور نوشته شود.

Cuprel
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"در هر فراخوانی
Cuprel
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} است. بررسی‌کننده وقتی این را ببیند اخطار می‌دهد (برای آنچه ویرایشگر فهرست می‌کند، ویرایشگر را ببینید).

Cuprel · هشدار W-FTEXT-PLACEHOLDER
indicator "Wrong placeholder"
    edition = 1
    display = price

if close > open
    alert.send(f"{{ticker}} closed up at {close:price}", key = "up")
plot(close)

جانگهدار را در متن ساده بنویسید و مقداری را که حساب کرده‌اید در متن قالب‌دار. آن‌ها را با + به هم وصل کنید، یا دو هشدار بفرستید:

Cuprel
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.
  • می‌دانید که در این نسخه هشدار روی اسکریپت‌های خودتان به شما نمی‌رسد.

نگاه کنید به: کلیدها و گزینه‌های هشدار، قالب‌بندی متن و عدد، خواندن پیام‌های ویرایشگر.

بعدی: درس 12: ماژول‌هایی که دوباره به کار می‌برید