millionchart
English

درس 13: پیدا کردن اشتباه با لاگ

وقتی اسکریپت اجرا می‌شود اما چیز اشتباهی رسم می‌کند: آن را عمداً با پیامی روشن متوقف کنید، خط لاگ بنویسید و مقدارها را با خط، علامت و برچسب ببینید.

درس 13 از 18. ویرایشگر اشتباه‌های متن را پیش از اجرای اسکریپت پیدا می‌کند (درس 18 نشان می‌دهد چطور آن‌ها را بخوانید). این درس دربارهٔ نوع دیگر است: اسکریپت اجرا می‌شود، اما یک عدد اشتباه است، یک علامت هیچ‌وقت ظاهر نمی‌شود، یا یک تنظیم معنا ندارد. اسکریپت را عمداً متوقف می‌کنید، خط لاگ می‌نویسید و مقدارها را جایی می‌گذارید که ببینید.

وقتی تنظیمی معنا ندارد، عمداً متوقف کنید#

Cuprel
indicator "Two averages, checked"
    edition = 1
    display = price

input fast_length: int = 10, name = "Fast length", min = 1
input slow_length: int = 30, name = "Slow length", min = 2
if fast_length >= slow_length
    log.abort("The fast length must be shorter than the slow length")
plot(tech.ema(close, fast_length), name = "Fast", color = color.green)
plot(tech.ema(close, slow_length), name = "Slow", color = color.red)

log.abort(message) اجرا را متوقف می‌کند. آن وقت ویرایشگر روی نمودار متوقف شد را با پیام شما نشان می‌دهد، تا هر کسی که تنظیمات را عوض کرده بداند چه چیزی را باید درست کند. اینجا مقدارهای پیش‌فرض درست‌اند و اسکریپت اجرا می‌شود. با پیش‌فرض‌هایی که قاعده را می‌شکنند، روی اولین کندل با کد E5637 و متن شما متوقف می‌شود:

Cuprel · خطا E5637
indicator "Two averages, wrong defaults"
    edition = 1
    display = price

input fast_length: int = 30, name = "Fast length", min = 1
input slow_length: int = 10, name = "Slow length", min = 2
if fast_length >= slow_length
    log.abort("The fast length must be shorter than the slow length")
plot(tech.ema(close, fast_length), name = "Fast", color = color.green)

یک توقف روشن به خواننده می‌گوید چه چیزی اشتباه است؛ نموداری که بی‌صدا چیز بی‌معنایی رسم می‌کند، نمی‌گوید.

خط‌های لاگ#

Cuprel
indicator "Logged crossings, short"
    edition = 1
    display = price

let fast = tech.ema(close, 10)
let slow = tech.ema(close, 30)
let up = tech.crosses_above(fast, slow)
if up
    log.info("Up cross on bar {0} at {1}", bar.index, close)
if close <= 0
    log.error("A price of zero or less on bar {0}", bar.index)
plot(fast, name = "Fast", color = color.green)
plot(slow, name = "Slow", color = color.red)
  • log.info، log.warning و log.error در سه سطح یک خط می‌نویسند. {0}، {1} و بقیه در متن با مقدارهای بعد از آن پر می‌شوند.
  • موتور برای هر کندل حداکثر 10 خط و برای یک اجرا 5,000 خط نگه می‌دارد، هر کدام تا 500 نویسه؛ خط‌هایی را که مجبور شده کنار بگذارد می‌شمارد (W-ENGINE-LOG-DROPPED).

مقدار را روی نمودار بگذارید#

سریع‌ترین راه نگاه کردن به یک عدد، رسم کردن آن است.

Cuprel
indicator "Look inside"
    edition = 1
    display = pane

input length: int = 14, name = "Length", min = 2, max = 200
let rsi = tech.rsi(close, length)
let range = tech.atr(length)
let up = tech.crosses_above(rsi, 50)
plot(rsi, name = "RSI", color = color.purple)
mark.char(up, name = "Crossed 50", char = "x", place = above, color = color.orange)
if bar.is_last
    label.new(
        bar.index,
        rsi,
        f"RSI {rsi:.1f}, ATR {range:price}, bar {bar.index}",
        style = label_down,
    )
  • یک plot از مقدار، آن را روی هر کندل نشان می‌دهد؛ چیپ اندیکاتور در لجند هم مقدار را نشان می‌دهد (وقتی مقادیر در تنظیمات لجند روشن باشد).
  • یک mark.char یا mark.shape روی یک شرط، دقیقاً نشان می‌دهد شرط کجا درست است. اگر سیگنالی هیچ‌وقت ظاهر نمی‌شود، هر بخش شرط را جدا علامت بزنید و ببینید کدام بخش هیچ‌وقت درست نمی‌شود.
  • یک label.new روی آخرین کندل (bar.is_last) چند مقدار را یک‌جا می‌نویسد. f"..." مقدارها را در متن می‌گذارد؛ :.1f یک رقم اعشار می‌نویسد و :price از رقم‌های اعشار خود نماد استفاده می‌کند.

برای چند مقدار با هم، یک جدول کوچک خوب کار می‌کند: درس 9 یکی را نشان می‌دهد.

فهرستی برای وقتی نتیجه اشتباه به نظر می‌رسد#

  • آیا مقدار na است؟ مقداری که تاریخچهٔ کافی ندارد na است و خط رسم‌شده آنجا چیزی نمی‌کشد. آن را با is_na(x) بسنجید، هرگز با x == na.
  • روی کدام کندل هستم؟ اسکریپت برای هر کندل یک بار اجرا می‌شود، از قدیمی‌ترین. x[1] مقدار یک کندل قبل است، نه کندل بعد.
  • آیا فراخوانی حافظه نگه می‌دارد؟ فراخوانی tech.* که داخل یک شرط نوشته شود کندل‌هایی را جا می‌اندازد؛ ویرایشگر آن را نمی‌پذیرد (E3302) و راه‌حل این است که اول آن را در یک خط جدا حساب کنید.
  • کندل بسته‌شده است یا در حال شکل‌گیری؟ روی جدیدترین کندل، مقدارها تا بسته شدن کندل تکان می‌خورند. درس 16 توضیح می‌دهد این چه چیزی را عوض می‌کند.

امتحان کنید#

  • در «Two averages, checked»، در تنظیمات طول سریع را 40 بگذارید. ویرایشگر روی نمودار متوقف شد را با پیام شما نشان می‌دهد.
  • در «Look inside»، در تقاطع 50 را به 70 تغییر دهید. علامت‌های کمتری ظاهر می‌شوند.
  • bar.index را جای دیگری از برچسب اضافه کنید، یا با bar.index == 0 برچسب دومی روی اولین کندل بگذارید.
  • شرطی بنویسید که هیچ‌وقت درست نیست (close < 0) و آن را با mark.char علامت بزنید. هیچ علامتی ظاهر نمی‌شود: شرطی که یک بخشش هیچ‌وقت برقرار نیست همین شکل را دارد.

نقطهٔ بررسی#

  • می‌توانید اسکریپت را عمداً با log.abort و پیامی که می‌گوید چه چیزی را درست کنند متوقف کنید.
  • می‌توانید خط لاگ بنویسید و می‌دانید این نسخه آن‌ها را نگه می‌دارد اما نشان نمی‌دهد.
  • می‌توانید با یک خط رسم‌شده، یک علامت یا یک برچسب روی آخرین کندل به یک مقدار نگاه کنید.
  • می‌توانید چهار علت معمول نتیجهٔ اشتباه را بررسی کنید: na، کندل، حافظهٔ فراخوانی و کندل در حال شکل‌گیری.

بعدی: درس 14: اولین استراتژی شما