millionchart
English

درس 17: ماندن در محدودهٔ سقف‌ها

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

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

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

هر دور حلقه، هر پنجره، هر ترسیم و هر تکه متن گام هزینه دارد. یک کندل می‌تواند 500,000 گام و کل یک اجرا 600,000,000 گام خرج کند. شمارش بر حسب گام است نه ثانیه، پس اسکریپت روی هر دستگاهی در همان نقطه متوقف می‌شود. بعد از این سقف اسکریپت با E-LIMIT-OPS متوقف می‌شود و پیام، کندل را نام می‌برد.

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

Cuprel
indicator "Average with a loop"
    edition = 1
    display = price

input length: int = 50, name = "Length", min = 1, max = 500
mut total = 0.0
for i in 0 until length
    total += close[i]
plot(total / length, name = "Average", color = color.orange)

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

Cuprel
indicator "Average without a loop"
    edition = 1
    display = price

input length: int = 50, name = "Length", min = 1, max = 500
plot(tech.sma(close, length), name = "Average", color = color.orange)

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

تاریخچه: اسکریپت تا کجا عقب را می‌خواند#

x[n] و هر پنجره‌ای مثل tech.sma(x, n) تا n کندل عقب را می‌خوانند. هیچ خواندنی نمی‌تواند بیش از 8,192 کندل عقب برود. عددی بزرگ‌تر از این که در اسکریپت نوشته شده باشد، پیش از اجرای اسکریپت رد می‌شود:

Cuprel · خطا E-LIMIT-HISTORY-STATIC
indicator "Too far back"
    edition = 1

plot(close[9000])

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

Cuprel · هشدار W-ENGINE-HISTORY-OPEN
indicator "An input without a max"
    edition = 1

input back: int = 10, name = "Bars back", min = 1
plot(close - close[back], name = "Change")

max = 500 (یا هر عددی که لازم دارید) را به ورودی اضافه کنید تا اخطار برود.

ترسیم‌ها#

خط‌ها، برچسب‌ها و باکس‌ها تا تعداد مشخصی نگه داشته می‌شوند: وقتی سرآیند چیزی نگوید از هر نوع 50 عدد، و وقتی با max_lines، max_labels یا max_boxes در سرآیند بیشتر بخواهید حداکثر 500 عدد. اسکریپتی که بیشتر از این ترسیم بسازد جدیدترین‌ها را نگه می‌دارد و قدیمی‌ترین‌ها را کنار می‌گذارد، با اخطار W-OBJECT-LIMIT:

Cuprel · هشدار W-OBJECT-LIMIT
indicator "A line on every bar"
    edition = 1
    display = price

line.new(bar.index - 1, close[1], bar.index, close, color = color.blue)

برای مقداری روی هر کندل، ابزار درست plot است: یک سری است، نه هزاران شیء. ترسیم‌ها را برای چیزهایی نگه دارید که گاه‌به‌گاه اتفاق می‌افتند (یک سوئینگ، یک سشن، یک شکست)، یا با if bar.is_last یک بار روی آخرین کندل رسم کنید. جدول‌ها هم سقف دارند: 100 ستون، 500 ردیف و 10,000 خانه.

حافظه، درخواست‌ها و زمان#

  • حافظه. اسکریپت می‌تواند در هر لحظه حدود 134,217,728 بایت نگه دارد و در طول یک اجرا 2,147,483,648 بایت بسازد؛ بیشتر از هر کدام، E-LIMIT-MEMORY. علت معمول آرایه‌ای است که روی هر کندل بزرگ می‌شود و هیچ‌وقت کوتاه نمی‌شود: وقتی پنجره پر شد آن را با shift() کوتاه نگه دارید، همان‌طور که درس 7 نشان می‌دهد.
  • مجموعه‌ها و متن. آرایه، نگاشت (map) یا ماتریس حداکثر 100,000 عضو دارد (E-LIMIT-ITEMS)؛ متنی که یک فراخوانی می‌سازد حداکثر 1,000,000 نویسه دارد (E-LIMIT-TEXT).
  • درخواست‌ها. اسکریپت می‌تواند با data.series حداکثر 20 تایم‌فریم مختلف از نماد خودش را بخواند؛ بیشتر از آن E-REQ-LIMIT است. چند فراخوانی که یک تایم‌فریم را می‌خوانند یک بار شمرده می‌شوند، پس هر تایم‌فریم را یک بار بخوانید و نتیجه را در یک نام نگه دارید.
  • زمان. یک اجرا روی نمودار حداکثر 5,000 میلی‌ثانیه زمان ساعت می‌تواند طول بکشد (E-LIMIT-TIME).

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

  1. به جای حلقه روی کندل‌های گذشته، از تابع‌های داخلی tech.* استفاده کنید.
  2. به هر ورودی‌ای که طول یا تعداد کندل‌های عقب را تعیین می‌کند max بدهید.
  3. برای مقدارهای روی هر کندل با plot، mark.* و level رسم کنید؛ خط‌ها، برچسب‌ها و باکس‌ها را برای رویدادهای کم‌تکرار یا آخرین کندل نگه دارید.
  4. مجموعه‌هایی را که بزرگ می‌شوند کوتاه کنید و متن‌های بلند را فقط روی آخرین کندل بسازید.
  5. هر تایم‌فریم دیگر را یک بار بخوانید و نتیجه را در یک let نگه دارید.

صفحهٔ سقف‌ها و بودجهٔ اجرا همهٔ سقف‌ها را با کدشان فهرست می‌کند.

امتحان کنید#

  • در «Average with a loop»، در تنظیمات طول را 500 بگذارید. خط با میانگین داخلی یکی است، با هزینهٔ بیشتر برای هر کندل.
  • در «An input without a max»، به ورودی max = 200 اضافه کنید. یادداشت W-ENGINE-HISTORY-OPEN می‌رود.
  • در «A line on every bar»، زیر display = price خط max_lines = 500 را اضافه کنید. خط‌های بیشتری نگه داشته می‌شوند و روی نمودار بلند، قدیمی‌ترین‌ها باز هم کنار گذاشته می‌شوند.
  • «A line on every bar» را به شکل یک plot(close) بازنویسی کنید: یک خط، بدون اخطار.

نقطهٔ بررسی#

  • می‌توانید سقف‌هایی را که اسکریپت بیشتر از همه به آن‌ها برمی‌خورد نام ببرید: گام‌ها، تاریخچه، ترسیم‌ها، حافظه و درخواست‌ها.
  • می‌توانید حلقه‌ای روی کندل‌های گذشته را با یک تابع tech.* جایگزین کنید.
  • می‌توانید با دادن max به یک ورودی، W-ENGINE-HISTORY-OPEN را از بین ببرید.
  • می‌دانید کی از خط رسم‌شده و کی از ترسیم استفاده کنید.

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