درس 17: ماندن در محدودهٔ سقفها
هر اسکریپت در بودجهای از کار، تاریخچه، حافظه و ترسیم اجرا میشود. یاد بگیرید سقفها چه هستند، در هر کدام چه میشود و چطور اسکریپت را کمهزینهتر کنید.
درس 17 از 18. اسکریپت روی همهٔ کندلهای نمودار و در مرورگر شما اجرا میشود، پس موتور سقفهایی میگذارد که اسکریپت نمیتواند بالا ببرد. بیشتر اسکریپتها هرگز به آنها نزدیک نمیشوند. این درس سقفهایی را نشان میدهد که به احتمال زیاد به آنها برمیخورید، میگوید موتور در هر کدام چه میکند و نشان میدهد همان کار را چطور کمهزینهتر بنویسید. عددهای پایین از خود موتور پر میشوند.
گامها: کاری که اسکریپت انجام میدهد#
هر دور حلقه، هر پنجره، هر ترسیم و هر تکه متن گام هزینه دارد. یک کندل میتواند 500,000 گام و کل یک اجرا 600,000,000 گام خرج کند. شمارش بر حسب گام است نه ثانیه، پس اسکریپت روی هر دستگاهی در همان نقطه متوقف میشود. بعد از این سقف اسکریپت با E-LIMIT-OPS متوقف میشود و پیام، کندل را نام میبرد.
این میانگین، بستهشدنهای اخیر را روی هر کندل در یک حلقه جمع میزند:
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 دور کار میکند. تابع داخلی همان میانگین را میدهد و یک جمع جاری نگه میدارد، پس هر کندل، هر طولی که باشد، چند گام کار میکند:
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 کندل عقب برود. عددی بزرگتر از این که در اسکریپت نوشته شده باشد، پیش از اجرای اسکریپت رد میشود:
indicator "Too far back"
edition = 1
plot(close[9000])وقتی عدد از یک ورودی میآید، به ورودی max بدهید. بدون آن موتور نمیتواند بفهمد اسکریپت تا کجا عقب را میخواند، بیشترین تاریخچهٔ مجاز را نگه میدارد و اخطار میدهد:
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:
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).
کمهزینهتر کردن اسکریپت#
- به جای حلقه روی کندلهای گذشته، از تابعهای داخلی
tech.*استفاده کنید. - به هر ورودیای که طول یا تعداد کندلهای عقب را تعیین میکند
maxبدهید. - برای مقدارهای روی هر کندل با
plot،mark.*وlevelرسم کنید؛ خطها، برچسبها و باکسها را برای رویدادهای کمتکرار یا آخرین کندل نگه دارید. - مجموعههایی را که بزرگ میشوند کوتاه کنید و متنهای بلند را فقط روی آخرین کندل بسازید.
- هر تایمفریم دیگر را یک بار بخوانید و نتیجه را در یک
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را از بین ببرید. - میدانید کی از خط رسمشده و کی از ترسیم استفاده کنید.