درس 18: خواندن پیامهای ویرایشگر
وقتی اسکریپت اشتباه دارد ویرایشگر چه میگوید، و رایجترین اشتباههای تازهکارها، هر کدام با پیام، علت و راهحل.
درس 18 از 18. همه اسکریپتهایی با اشتباه مینویسند. ویرایشگر بیشتر این اشتباهها را همان موقع که تایپ میکنید پیدا میکند، پیش از آنکه اسکریپت حتی یک بار اجرا شود. این درس نشان میدهد پیامهای آن را چطور بخوانید، و بعد رایجترین اشتباهها را یکییکی مرور میکند.
پیامها کجا هستند#
- لحظهای بعد از اینکه تایپ را متوقف کنید، ویرایشگر اسکریپت را بررسی میکند و زیر آن جا خط میکشد: خط موجدار قرمز برای مشکل و کهربایی برای یادداشت.
- وضعیتی که کنار نام اسکریپت است، وقتی چیزی برای درست کردن نیست آماده میگوید، وقتی اسکریپت کار میکند ولی اخطارهایی برای خواندن دارد آماده · 2 یادداشت، و وقتی هنوز کامپایل نمیشود 1 مشکل.
- فهرست مشکلات (یا یادداشتها) کنار کد، شمارهٔ خط و کد پیام را مینویسد، مثل
E3171. کدی که باEشروع شود خطاست: تا درست نشود اسکریپت اجرا نمیشود. کدW-اخطار است: اسکریپت اجرا میشود، ولی چیزی هست که ارزش دوباره نگاه کردن دارد. - جایی که اشتباه را بشود مکانیکی درست کرد، مورد فهرست Fix: ... را پیشنهاد میدهد. آن را بزنید تا تغییر اعمال شود.
اول مشکل اول را درست کنید. یک اشتباه اغلب باعث پیامهای بعدی هم میشود و با درست شدنش آنها هم از بین میروند.
نامی که اعلام نشده#
indicator "Misspelled name"
edition = 1
display = price
let average = tech.sma(close, 20)
plot(averge, name = "SMA")پیام میگوید averge اعلام نشده و، اگر بتواند، نامی را که احتمالاً منظورتان بوده میگوید. هر نامی باید پیش از استفاده اعلام شده باشد (با let، input، state و مانند آنها) یا یکی از نامهای داخلی زبان باشد. املای آن را بررسی کنید، و حروف بزرگ و کوچک را هم: Average و average دو نام متفاوتاند.
متنی که بسته نشده#
indicator "Open quote"
edition = 1
let label_text = "Close
plot(close)متن با یک گیومهٔ دوتایی (") شروع میشود و در همان خط با گیومهٔ دوتایی تمام میشود. " پایانی را اضافه کنید.
دو دستور در یک خط#
indicator "Two on a line"
edition = 1
let a = 1; let b = 2
plot(a + b)هر دستور خط مخصوص خودش را دارد؛ بین دستورها ; گذاشته نمیشود. یک دستور بلند وقتی خط با یک عملگر یا یک ویرگول تمام شود، یا داخل پرانتز و کروشه، میتواند در چند خط ادامه پیدا کند.
if که مقدار میدهد به else نیاز دارد#
indicator "Missing else"
edition = 1
let tint = if close > open then color.green
plot(close)if ... then ... وقتی بهعنوان مقدار به کار میرود، باید بگوید مقدار روی کندلهایی که شرط نادرست است چیست. else را اضافه کنید:
indicator "Else added"
edition = 1
display = price
let tint = if close > open then color.green else color.red
plot(close, name = "Close", color = tint)وقتی روی آن کندلها نباید چیزی باشد، else na بنویسید.
آرگومانی که تابع ندارد#
indicator "Wrong argument"
edition = 1
display = price
plot(close, title = "Close")پیام نام تابع را میگوید و آرگومانهایی را که میپذیرد فهرست میکند. اینجا برچسب یک خط رسمشده name است، نه title: بنویسید plot(close, name = "Close").
مقایسه با na#
این یکی یادداشت است: اسکریپت اجرا میشود، ولی این آزمون هیچوقت درست نیست.
indicator "Compare with na"
edition = 1
display = pane
let average = tech.sma(close, 20)
plot(if average == na then 1 else 0, name = "Missing")na یعنی «بدون مقدار» و با هیچ چیز برابر نیست، حتی با خودش. بهجایش از is_na(x) بپرسید:
indicator "Test for na"
edition = 1
display = pane
let average = tech.sma(close, 20)
plot(if is_na(average) then 1 else 0, name = "Missing")تابعی که حافظه دارد، داخل یک شرط#
indicator "Stateful call in an operand"
edition = 1
display = price
let rising = close > open
let strong = rising and close > tech.sma(close, 20)
plot(if strong then close else na, name = "Strong bars", style = circles)تابعهایی مثل tech.sma، tech.ema یا tech.crosses_above کندلهایی را که دیدهاند به خاطر میسپارند. سمت راست and فقط وقتی اجرا میشود که سمت چپ درست باشد، پس میانگین بعضی کندلها را جا میانداخت و عددهای غلط میداد؛ برای همین بررسیکننده آن را نمیپذیرد. اول مقدار را در خطی جداگانه حساب کنید و بعد از نامش استفاده کنید:
indicator "Stateful call bound first"
edition = 1
display = price
let average = tech.sma(close, 20)
let rising = close > open
let strong = rising and close > average
plot(if strong then close else na, name = "Strong bars", style = circles)همین قاعده برای سمت راست or، برای ?? و برای دو شاخهٔ if ... then ... else هم برقرار است.
وقتی اسکریپت روی نمودار متوقف میشود#
اسکریپتی که کامپایل میشود هم ممکن است هنگام اجرا متوقف شود، و آنوقت ویرایشگر روی نمودار متوقف شد را با پیام موتور نشان میدهد که کندل را نام میبرد. هر کندل فقط مقدار محدودی کار میتواند انجام دهد، پس حلقهای که هیچوقت تمام نمیشود متوقف میشود:
indicator "Endless loop"
edition = 1
display = pane
mut n = 0
while true
n += 1
plot(n)مطمئن شوید هر حلقهٔ while شرطی دارد که بالاخره نادرست میشود. یک توقف رایج دیگر: prior(day) (مقدارهای دیروز) به نموداری با کندلهای کوتاهتر از یک روز نیاز دارد، پس اسکریپتی که آن را میخواند روی نمودار روزانه با E-PERIOD-TF متوقف میشود؛ آن را روی یک نمودار درونروزی، مثلاً 15 دقیقه یا 1 ساعت، باز کنید. سقفها و بودجهٔ اجرا فهرست چیزهایی است که موتور محدود میکند.
امتحان کنید#
- برنامهٔ «Misspelled name» را در یک اسکریپت جدید کپی کنید و ردیف آن را در فهرست مشکلات پیدا کنید: شمارهٔ خط و کد را میگوید. املا را درست کنید و ببینید وضعیت به آماده تغییر میکند.
- در یک اسکریپت
plot(close, title = "Close")بنویسید و فهرست آرگومانهایی را که پیام میدهد بخوانید؛ بعدtitleرا بهnameتغییر دهید. - در برنامهٔ «Compare with na»،
average == naرا باis_na(average)عوض کنید و ببینید یادداشت از فهرست یادداشتها بیرون میرود. - یکی از کدهایی را که در این درس دیدید در تشخیصها پیدا کنید؛ آن صفحه هر کد را با علت و راهحلش توضیح میدهد.
نقطهٔ بررسی#
- میتوانید وضعیت، فهرستهای مشکلات و یادداشتها و کدی مثل
E3171را بخوانید. - میتوانید خطا (
E) را از اخطار (W-) تشخیص دهید و اول مشکل اول را درست میکنید. - میتوانید رایجترین اشتباههای تازهکارها را درست کنید: نام غلطنوشته، متن بستهنشده،
elseجاافتاده، آرگومان نادرست، مقایسه باnaو فراخوانی حالتدار درون یک شرط. - میدانید روی نمودار متوقف شد یعنی چه و سقفها کجا فهرست شدهاند.
ببینید هم: ویرایشگر، na، خطاها و محاسبات عددی.
بعدی: دوره را تمام کردهاید. با برنامههای نمونه ادامه دهید.