millionchart
English

درس 18: خواندن پیام‌های ویرایشگر

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

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

پیام‌ها کجا هستند#

  • لحظه‌ای بعد از اینکه تایپ را متوقف کنید، ویرایشگر اسکریپت را بررسی می‌کند و زیر آن جا خط می‌کشد: خط موجدار قرمز برای مشکل و کهربایی برای یادداشت.
  • وضعیتی که کنار نام اسکریپت است، وقتی چیزی برای درست کردن نیست آماده می‌گوید، وقتی اسکریپت کار می‌کند ولی اخطارهایی برای خواندن دارد آماده · 2 یادداشت، و وقتی هنوز کامپایل نمی‌شود 1 مشکل.
  • فهرست مشکلات (یا یادداشت‌ها) کنار کد، شمارهٔ خط و کد پیام را می‌نویسد، مثل E3171. کدی که با E شروع شود خطاست: تا درست نشود اسکریپت اجرا نمی‌شود. کد W- اخطار است: اسکریپت اجرا می‌شود، ولی چیزی هست که ارزش دوباره نگاه کردن دارد.
  • جایی که اشتباه را بشود مکانیکی درست کرد، مورد فهرست Fix: ... را پیشنهاد می‌دهد. آن را بزنید تا تغییر اعمال شود.

اول مشکل اول را درست کنید. یک اشتباه اغلب باعث پیام‌های بعدی هم می‌شود و با درست شدنش آن‌ها هم از بین می‌روند.

نامی که اعلام نشده#

Cuprel · خطا E3171
indicator "Misspelled name"
    edition = 1
    display = price

let average = tech.sma(close, 20)
plot(averge, name = "SMA")

پیام می‌گوید averge اعلام نشده و، اگر بتواند، نامی را که احتمالاً منظورتان بوده می‌گوید. هر نامی باید پیش از استفاده اعلام شده باشد (با let، input، state و مانند آن‌ها) یا یکی از نام‌های داخلی زبان باشد. املای آن را بررسی کنید، و حروف بزرگ و کوچک را هم: Average و average دو نام متفاوت‌اند.

متنی که بسته نشده#

Cuprel · خطا E1001
indicator "Open quote"
    edition = 1

let label_text = "Close
plot(close)

متن با یک گیومهٔ دوتایی (") شروع می‌شود و در همان خط با گیومهٔ دوتایی تمام می‌شود. " پایانی را اضافه کنید.

دو دستور در یک خط#

Cuprel · خطا E2005
indicator "Two on a line"
    edition = 1

let a = 1; let b = 2
plot(a + b)

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

if که مقدار می‌دهد به else نیاز دارد#

Cuprel · خطا E2001
indicator "Missing else"
    edition = 1

let tint = if close > open then color.green
plot(close)

if ... then ... وقتی به‌عنوان مقدار به کار می‌رود، باید بگوید مقدار روی کندل‌هایی که شرط نادرست است چیست. else را اضافه کنید:

Cuprel
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 بنویسید.

آرگومانی که تابع ندارد#

Cuprel · خطا E3162
indicator "Wrong argument"
    edition = 1
    display = price

plot(close, title = "Close")

پیام نام تابع را می‌گوید و آرگومان‌هایی را که می‌پذیرد فهرست می‌کند. اینجا برچسب یک خط رسم‌شده name است، نه title: بنویسید plot(close, name = "Close").

مقایسه با na#

این یکی یادداشت است: اسکریپت اجرا می‌شود، ولی این آزمون هیچ‌وقت درست نیست.

Cuprel · هشدار W-NA-COMPARE
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) بپرسید:

Cuprel
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")

تابعی که حافظه دارد، داخل یک شرط#

Cuprel · خطا E3302
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 فقط وقتی اجرا می‌شود که سمت چپ درست باشد، پس میانگین بعضی کندل‌ها را جا می‌انداخت و عددهای غلط می‌داد؛ برای همین بررسی‌کننده آن را نمی‌پذیرد. اول مقدار را در خطی جداگانه حساب کنید و بعد از نامش استفاده کنید:

Cuprel
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 هم برقرار است.

وقتی اسکریپت روی نمودار متوقف می‌شود#

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

Cuprel · خطا E-LIMIT-OPS
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، خطاها و محاسبات عددی.

بعدی: دوره را تمام کرده‌اید. با برنامه‌های نمونه ادامه دهید.