درس 13: پیدا کردن اشتباه با لاگ
وقتی اسکریپت اجرا میشود اما چیز اشتباهی رسم میکند: آن را عمداً با پیامی روشن متوقف کنید، خط لاگ بنویسید و مقدارها را با خط، علامت و برچسب ببینید.
درس 13 از 18. ویرایشگر اشتباههای متن را پیش از اجرای اسکریپت پیدا میکند (درس 18 نشان میدهد چطور آنها را بخوانید). این درس دربارهٔ نوع دیگر است: اسکریپت اجرا میشود، اما یک عدد اشتباه است، یک علامت هیچوقت ظاهر نمیشود، یا یک تنظیم معنا ندارد. اسکریپت را عمداً متوقف میکنید، خط لاگ مینویسید و مقدارها را جایی میگذارید که ببینید.
وقتی تنظیمی معنا ندارد، عمداً متوقف کنید#
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 و متن شما متوقف میشود:
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)یک توقف روشن به خواننده میگوید چه چیزی اشتباه است؛ نموداری که بیصدا چیز بیمعنایی رسم میکند، نمیگوید.
خطهای لاگ#
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).
مقدار را روی نمودار بگذارید#
سریعترین راه نگاه کردن به یک عدد، رسم کردن آن است.
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، کندل، حافظهٔ فراخوانی و کندل در حال شکلگیری.