millionchart
English

پیش‌تر جای دیگری اسکریپت نوشته‌اید؟

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

اگر با زبان‌های اسکریپت‌نویسی دیگرِ نمودار اندیکاتور یا استراتژی نوشته‌اید، بیشتر ایده‌ها همین‌جا هم به کار می‌آیند: اسکریپت برای هر کندل یک بار اجرا می‌شود، سری‌های قیمت را می‌خواند، بعضی مقدارها را از کندلی به کندل بعد نگه می‌دارد و آنچه را حساب کرده رسم می‌کند. این صفحه هر ایده را نام می‌برد، نشان می‌دهد Cuprel آن را چطور می‌نویسد و به صفحه‌ای پیوند می‌دهد که آن را یاد می‌دهد. محصولی را با محصول دیگر مقایسه نمی‌کند؛ فقط کمک می‌کند واژه‌ها را پیدا کنید. اگر تا حالا هیچ اسکریپتی ننوشته‌اید، به‌جای این صفحه از درس 1: اولین اسکریپت شما شروع کنید.

ایده به ایده#

ایدهشکل نوشتنش در اینجابخوانید
سرآیندی که می‌گوید اسکریپت از چه نوعی استindicator "Name"، strategy "Name" یا module Name، با تنظیماتش به‌صورت تورفته زیر آننحو و چیدمان
تنظیمی که کاربر می‌تواند تغییر دهدinput length: int = 20, name = "Length", min = 1ورودی‌ها
سری‌های قیمت و کندل‌های قبلیopen، high، low، close، volume؛ close[1] یعنی یک کندل قبلمقدارها و نوع‌ها
اجرای کندل‌به‌کندل و ریپینتاسکریپت برای هر کندل یک بار اجرا می‌شود، از قدیمی‌ترین تا جدیدترین؛ کندل در حال شکل‌گیری تا بسته شدن تغییر می‌کنددرس 16: نتیجه‌هایی که زیادی خوب به نظر می‌رسند
خط‌ها و رنگ‌هاplot(x, name = …, color = …, width = …, style = …)، level، shade، chart.backgroundخط‌ها و ترسیم‌ها
برچسب، خط، باکس و جدولlabel.new، line.new، box.new، table.newدرس 8: برچسب‌ها، خط‌ها و باکس‌ها
شرط‌ها و مقدارهای خالیif، if … then … else، match؛ na، is_na(x)، x ?? 0na، خطاها و محاسبات عددی
تابع‌ها و حلقه‌هاfn name(…): type، for … in، whileتابع‌ها، نوع‌ها و enum‌ها
مقداری که از کندلی به کندل بعد می‌ماندstate (و state day که هر روز معاملاتی از نو شروع می‌شود)؛ mut در هر کندل از نو حساب می‌شودlet، mut و state
تایم‌فریم دیگرdata.series("240", expression, symbol = symbol.id)، به‌طور پیش‌فرض آخرین کندل بسته‌شدهدرس 10: تایم‌فریم‌ها و نمادهای دیگر
نماد دیگردر این نسخه در دسترس نیست: اسکریپت پذیرفته نمی‌شود (E-REQ-UNDECLARED) یا متوقف می‌شود (E4001)درس 10: تایم‌فریم‌ها و نمادهای دیگر
هشدار از اسکریپتalert.when و alert.send کامپایل و اجرا می‌شوند، اما هشدار روی اسکریپت‌های خودتان در این نسخه خاموش استدرس 11: هشدارهایی که چیزی می‌گویند
استراتژی و آزمایش آنstrategy "Name"، orders.enter / orders.close / orders.exit، هزینه‌ها در setup: و execution:؛ آزمایش در Strategy Labدرس 15: آزمایش در Strategy Lab

تفاوت‌های واقعی#

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

  • نسخهٔ زبان (edition). در سرآیند edition = 1 بنویسید. edition می‌گوید اسکریپت برای کدام برداشت از زبان نوشته شده است، پس وقتی نسخهٔ بعدی بیاید، اسکریپت معنای خودش را حفظ می‌کند.
  • بلوک با تورفتگی. هر بلوک همان خط‌هایی است که زیرش تورفته‌اند، هر سطح چهار فاصله. آکولاد و واژهٔ پایان وجود ندارد و هر دستور خط خودش را دارد.
  • عددهای یکسان روی هر دستگاه. موتور تابع‌های ریاضی را با یک پیاده‌سازی ثابت حساب می‌کند، پس اسکریپت روی همان کندل‌ها روی هر دستگاه پشتیبانی‌شده همان نتیجه را می‌دهد. صفحهٔ قطعیت و سقف‌ها دقیقاً می‌گوید این شامل چه چیزهایی است.
  • بودجهٔ اجرا. هر کندل حداکثر 500,000 عملیات و هر اجرا 600,000,000 عملیات می‌تواند خرج کند؛ تاریخچه، ترسیم‌ها، درخواست‌ها و حافظه هم سقف دارند. اسکریپتی که بیش از بودجه‌اش خرج کند، با پیامی که کندل را نام می‌برد متوقف می‌شود. نگاه کنید به سقف‌ها و بودجهٔ اجرا.
  • قاعده‌های na. مقایسهٔ یک مقدار با na هیچ‌وقت درست نیست، حتی na == na؛ بررسی‌کننده اخطار می‌دهد (W-NA-COMPARE). از is_na(x) بپرسید، یا مقدار خالی را با x ?? 0 جایگزین کنید.
  • عملگرهای تنبل. سمت راست and، or و ?? و شاخه‌های یک if … then … else یک‌خطی فقط وقتی اجرا می‌شوند که لازم باشند. اگر به زبانی عادت دارید که هر دو طرف همیشه اجرا می‌شوند، توجه کنید که فراخوانی‌ای که کندل‌های قبلی را به یاد می‌آورد (مثل tech.sma) نمی‌تواند آنجا بیاید: بررسی‌کننده آن را با E3302 نمی‌پذیرد. اول آن را در خط جداگانه‌ای بنویسید:
Cuprel · خطا E3302
indicator "A call that remembers, in an operand"
    edition = 1
    display = price

let strong = close > open and close > tech.sma(close, 20)
plot(if strong then close else na, name = "Strong bars", style = circles)
Cuprel
indicator "Bound on its own line first"
    edition = 1
    display = price

let average = tech.sma(close, 20)
let strong = close > open and close > average
plot(if strong then close else na, name = "Strong bars", style = circles)
  • اسکریپت‌های خصوصی. هر اسکریپت مال حساب شماست. در این نسخه راهی برای به اشتراک گذاشتن یا منتشر کردن اسکریپت وجود ندارد.
  • یک چیدمان. دکمهٔ Format ویرایشگر (و Format when saving) اسکریپت را در همان چیدمان استانداردی بازنویسی می‌کند که این راهنما به کار می‌برد، پس لازم نیست راهنمای سبک نوشتن یاد بگیرید.

صفحه‌های عملگرهای تنبل، E3302 و W3302 و فراخوانی‌هایی که حالت نگه می‌دارند قاعدهٔ آخر را کامل توضیح می‌دهند.

همان ایده، به زبان Cuprel#

هر برنامه کامل است: آن را در یک اسکریپت جدید بچسبانید، ذخیره و بعد افزودن به نمودار را بزنید.

یک میانگین متحرک با دو تنظیم:

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

input length: int = 20, name = "Length", min = 1
input src: source = close, name = "Source"
plot(tech.sma(src, length), name = "Average", color = color.orange, width = 2)

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

Cuprel
indicator "Crossing marks"
    edition = 1
    display = price

let fast = tech.ema(close, 10)
let slow = tech.ema(close, 30)
let up = tech.crosses_above(fast, slow)
let down = tech.crosses_below(fast, slow)
plot(fast, name = "Fast", color = color.green)
plot(slow, name = "Slow", color = color.red)
mark.shape(up, name = "Up", shape = triangle_up, place = below, color = color.green)
mark.shape(down, name = "Down", shape = triangle_down, place = above, color = color.red)

مقداری که با state از کندلی به کندل بعد می‌ماند:

Cuprel
indicator "Bars since a new high"
    edition = 1
    display = pane

state count = 0
if close >= tech.highest(close, 20)
    count = 0
else
    count += 1
plot(count, name = "Bars since", style = histogram, color = color.teal)

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

Cuprel
indicator "Four-hour average"
    edition = 1
    display = price

let h4 = data.series("240", tech.ema(close, 20), symbol = symbol.id)
plot(h4, name = "4h EMA (last closed bar)", color = color.orange, width = 2)

مقدارهای خالی: ?? یک جایگزین می‌دهد و is_na می‌پرسد که آیا مقداری خالی است:

Cuprel
indicator "Missing values"
    edition = 1
    display = pane

let change = close - close[1]
let average = tech.sma(change, 50)
plot(average ?? 0, name = "Average change, 0 while unknown", color = color.blue)
plot(if is_na(average) then 1 else 0, name = "Still unknown", style = columns, color = color.gray)

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

Cuprel
indicator "Range of the last bars"
    edition = 1
    display = price

fn range_of(length: int): (float, float)
    return (tech.highest(high, length), tech.lowest(low, length))
let (top, bottom) = range_of(20)
plot(top, name = "Top", color = color.green)
plot(bottom, name = "Bottom", color = color.red)

یک استراتژی کوچک با اندازهٔ معامله و کمیسیون. نمودار معامله‌هایش را علامت می‌زند؛ Strategy Lab آن را روی تاریخچهٔ طولانی‌تری آزمایش می‌کند:

Cuprel
strategy "Crossing strategy"
    edition = 1
    display = price

setup:
    size = sizing.lots(0.1)
    fees = fee.per_lot(3.5)

let fast = tech.ema(close, 10)
let slow = tech.ema(close, 30)
if tech.crosses_above(fast, slow)
    orders.enter("Long", side.long)
if tech.crosses_below(fast, slow)
    orders.close("Long")
plot(fast, name = "Fast", color = color.green)
plot(slow, name = "Slow", color = color.red)

بعدی: درس 1: اولین اسکریپت شما