millionchart
English

برگهٔ خلاصه

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

کل زبان در یک نگاه. هر شکلی که اینجا آمده روی نمودار کامپایل می‌شود؛ برای قاعده‌ها پیوندها را دنبال کنید.

یک اندیکاتور کامل#

Cuprel
// One program that uses most of the syntax on one page.
indicator "Cheat sheet"
    edition = 1
    display = price

enum Kind
    sma = "SMA"
    ema = "EMA"

type Band
    upper: float
    lower: float

group "Average"
    /// How many bars the average reads
    input length: int = 20, name = "Length", min = 2, max = 500
    input kind: Kind = Kind.ema, name = "Kind"
    input src: source = close, name = "Source"
input width: float = 2.0, name = "Width", min = 0.1, step = 0.1
input band_color: color = #2962ff, name = "Band colour"

session london = 08:00 .. 16:30 @ "Europe/London"

fn band_of(middle: float, size: float): Band = Band(upper = middle + size, lower = middle - size)

let sma = tech.sma(src, length)
let ema = tech.ema(src, length)
let middle = match kind
    Kind.sma => sma
    Kind.ema => ema
let b = band_of(middle, width * tech.atr(length))
state above_count = 0
mut last_three = 0.0
for i in 0 until 3
    last_three += close[i]
if close > b.upper
    above_count += 1
let crossed = tech.crosses_above(close, middle)
let top = plot(b.upper, name = "Upper", color = band_color)
let bottom = plot(b.lower, name = "Lower", color = band_color)
shade(top, bottom, color = color.fade(band_color, 90), name = "Band")
plot(middle, name = "Middle", color = color.gray, width = 2)
plot(last_three / 3, name = "Mean of 3 closes", display = none)
mark.shape(crossed, name = "Cross up", shape = triangle_up, place = below, color = color.green)
chart.background(if london.active then color.fade(color.blue, 94) else na, name = "London")
let yesterday_high = prior(day).high
plot(yesterday_high, name = "Yesterday's high", style = step_break, color = color.orange)
if bar.is_last
    label.new(
        bar.index,
        b.upper,
        f"{above_count} closes above, last {close:price}",
        style = label_down,
    )

شکل یک اسکریپت#

بنویسیدیعنی
indicator "Name"سرآیند یک اندیکاتور؛ تنظیماتش زیر آن تورفته می‌آیند
strategy "Name"سرآیند یک استراتژی (سفارش‌های شبیه‌سازی‌شده)
module Nameسرآیند ماژولی که اسکریپت‌های دیگر وارد می‌کنند
edition = 1نسخهٔ زبانی که اسکریپت برایش نوشته شده است
display = priceروی نمودار قیمت رسم کن؛ بدون آن اسکریپت پنل خودش را می‌گیرد
// textتوضیح، تا آخر خط
/// textبالای یک input: راهنمای کوچک آن
چهار فاصلهیک سطح از یک بلوک (if، for، fn، group …)؛ تب خطاست

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

نام‌ها و مقدارها#

بنویسیدیعنی
let x = close - openنامی که در هر کندل یک بار تعیین می‌شود و هرگز تغییر نمی‌کند
mut n = 0مقداری که در هر کندل از نو شروع می‌شود و می‌تواند تغییر کند: n += 1، -=، *=، /=
state count = 0مقداری که از کندلی به کندل بعد نگه داشته می‌شود؛ state day در هر روز معاملاتی از نو شروع می‌شود
close[1]مقدار یک کندل قبل (تاریخچه)
na، is_na(x)، x ?? 0بی‌مقدار؛ آزمونش؛ یک جایگزین
20، 2.5، "text"، trueعدد صحیح، عدد، متن، مقدار درست/نادرست
#2962ff، color.red، color.fade(c, 80)رنگ‌ها: یک کد، یک نام، شفاف‌تر
08:30، @2026-01-01T00:00Z، 15m، 0.5%ساعتی از روز، یک لحظه، یک مدت، یک درصد
[1, 2, 3]، [0.0; 4]یک آرایه؛ چهار نسخه از 0.0
map<int, float>()نگاشتی خالی از عدد صحیح به عدد

نگاه کنید به let، mut و state، مقدارها و نوع‌ها، واحدها و لیترال‌ها.

ورودی‌ها#

بنویسیدنشان می‌دهد
input length: int = 20, name = "Length", min = 1, max = 500عدد صحیح با حد پایین و بالا
input mult: float = 2.0, name = "Width", step = 0.1یک عدد؛ step گام فیلد است
input on: bool = true, name = "Show"یک کلید روشن/خاموش
input src: source = close, name = "Source"قیمتی که اسکریپت می‌خواند
input c: color = color.blue, name = "Colour"انتخاب‌گر رنگ
input tf: tf = "60", name = "Timeframe"یک تایم‌فریم
input kind: text = "EMA", name = "Kind", options = ["EMA", "SMA"]یک فهرست کشویی
input mode: Mode = Mode.fast, name = "Mode"فهرست کشوییِ یک enum
group "Name"ورودی‌های تورفتهٔ زیر آن یک عنوان مشترک می‌گیرند

نگاه کنید به ورودی‌ها.

عملگرها، از سست به محکم#

عملگرهانکته
if c then a else bمقداری که با یک شرط انتخاب می‌شود؛ else لازم است
orسمت راست فقط وقتی اجرا می‌شود که سمت چپ نادرست باشد
andسمت راست فقط وقتی اجرا می‌شود که سمت چپ درست باشد
notسست‌تر از مقایسه: not a == b یعنی not (a == b)
== != < <= > >=زنجیره نمی‌شوند: a < b < c خطاست
??سمت راست وقتی سمت چپ na باشد
+ -جمع، تفریق (+ متن‌ها را هم به هم می‌چسباند)
* / %ضرب، تقسیم، باقیمانده
-xمنفی
x[1]، f(x)، a.bتاریخچه، فراخوانی، عضو

عملگر توان وجود ندارد: بنویسید math.pow(x, 2). فراخوانی‌ای که کندل‌های قبلی را به یاد دارد (tech.*، data.series) نمی‌تواند سمت راست and، or، ?? یا در یکی از شاخه‌های if ... then ... else بنشیند (E3302): به آن یک خط جدا بدهید. نگاه کنید به عملگرهای تنبل.

انتخاب‌ها و حلقه‌ها#

بنویسیدکارش
if cond با یک بلوک تورفته، elseوقتی شرط درست است بلوک را اجرا می‌کند
let v = if cond then a else bیک مقدار را انتخاب می‌کند
match x و سپس خط‌های "a" => 1 و _ => 0بر اساس مقدار انتخاب می‌کند؛ match بدون موضوع بر اساس شرط انتخاب می‌کند
for i in 0 to 30، 1، 2، 3 (until 3 عدد 3 را کنار می‌گذارد؛ by 2 گام را تعیین می‌کند)
for x in items، for (i, x) in itemsهر عضو یک آرایه، همراه جایگاهش
while condتا وقتی شرط برقرار است تکرار می‌کند
break، continueاز حلقه بیرون برو؛ به دور بعدی‌اش برو

حلقه نمی‌تواند فراخوانی‌ای داشته باشد که کندل‌های قبلی را به یاد دارد (E3301). نگاه کنید به انتخاب‌ها و حلقه‌ها.

تابع‌ها، نوع‌ها و enum‌ها#

بنویسیدیعنی
fn mid(a: float, b: float): float = (a + b) / 2تابعی یک‌خطی
fn f(x: float) با یک بلوک تورفته و returnتابعی با بلوک
fn scaled(x: float, k: float = 2.0): floatپارامتری با مقدار پیش‌فرض؛ صدا زدن با scaled(close, k = 0.5)
let (a, b) = pair()جدا کردن یک تاپل (_ یک مقدار را رد می‌کند)
type Band با فیلدهای تورفته مثل upper: floatیک رکورد؛ ساختنش با Band(upper = 1.0, lower = 0.0)
fn Band.width(self): float = self.upper - self.lowerیک متد، که با b.width() صدا زده می‌شود
enum Mode با fast = "Fast" تورفتهفهرست بسته‌ای از نام‌ها
import Me/Name@1 as aliasیکی از ماژول‌های خودتان

تابع نمی‌تواند خودش را صدا بزند (E3310). نگاه کنید به تابع‌ها، نوع‌ها و enum‌ها، ماژول‌ها و کتابخانه‌ها.

متن و قالب‌ها#

بنویسیدمی‌دهد
f"Close {close:price}"قیمت بسته‌شدن با تعداد اعشار خود نماد
{x:.2f}، {x:,.2f}، {x:+.1f}دو رقم اعشار؛ با جداکنندهٔ هزارگان؛ با علامت
{x:.1%}، {x:03}یک درصد؛ با صفرهای پیشین
{x:.1f?'n/a'}تا وقتی x برابر na است، n/a
text.fmt(x, ".2f")، text.length(s)، text.split(s, ",")تابع‌های متن

نگاه کنید به قالب‌بندی متن و عدد.

رسم روی نمودار#

بنویسیدرسم می‌کند
plot(x, name = "A", color = color.blue, width = 2, style = histogram)یک سری روی هر کندل
level(70, name = "Top", style = dashed)یک خط افقی
shade(top, bottom, color = color.fade(color.purple, 90))فضای میان دو خط رسم‌شده یا دو سطحِ نگه‌داشته در نام
mark.shape(cond, shape = triangle_up, place = below)شکلی جایی که شرط درست است
mark.char(cond, char = "x", place = above)، mark.arrow(x)یک حرف؛ فلشی رو به بالا یا پایین بر اساس علامت
chart.background(if cond then color.fade(color.green, 90) else na)پس‌زمینهٔ یک کندل
chart.candles(color)کندل‌های نمودار را دوباره رنگ می‌کند
label.new(bar.index, high, "text")، line.new(x1, y1, x2, y2)، box.new(left, top, right, bottom)ترسیم‌هایی که با کندل و قیمت جای داده می‌شوند
table.new(top_right, 2, 2)، table.cell(t, 0, 0, "A")جدولی در یک گوشه
log.info("close {0}", close)یک خط در لاگ اسکریپت

سبک‌های خط: line، line_break، step، step_break، step_diamond، histogram، columns، area، area_break، circles، cross. نگاه کنید به خط‌ها و ترسیم‌ها، جدول‌ها.

زمان و تایم‌فریم‌های دیگر#

بنویسیدمی‌دهد
bar.index، bar.time، bar.is_lastشمارهٔ کندل، زمانش، روی جدیدترین کندل درست
data.series("240", tech.ema(close, 20), symbol = symbol.id)یک عبارت روی تایم‌فریم دیگر، آخرین کندل بسته‌شده
prior(day).high، current(week).openبالاترین قیمت دیروز؛ قیمت بازشدن این هفته (نمودارهای درون‌روزی)
session london = 08:00 .. 16:30 @ "Europe/London"یک سشن نام‌دار: london.active، .start، .end، .high، .low
clock.hour_of(bar.time, zone = "UTC")ساعتِ یک زمان در یک منطقهٔ زمانی

نگاه کنید به تایم‌فریم‌ها و نمادهای دیگر، روز معاملاتی و سشن‌ها.

نام‌های داخلی پرکاربرد#

گروهچند نام از آن
قیمت‌هاopen high low close volume hl2 hlc3 ohlc4
techtech.sma tech.ema tech.rma tech.rsi tech.atr tech.stdev tech.highest tech.lowest tech.crosses_above tech.crosses_below tech.pivot_high tech.macd
mathmath.abs math.max math.min math.round math.floor math.sqrt math.pow math.sign
symbolsymbol.id symbol.tick symbol.pip
colorcolor.rgb color.fade color.gradient و رنگ‌های نام‌دار

فهرست توابع هر نام را با پارامترهایش فهرست می‌کند و مرجع توابع هر کدام را توضیح می‌دهد.

استراتژی‌ها#

بنویسیدکارش
orders.enter("Long", side.long)یک معاملهٔ خرید شبیه‌سازی‌شده با کلید "Long" باز می‌کند (side.short برای فروش)
orders.close("Long")آن را می‌بندد
orders.exit("Exit", "Long", stop = s, limit = t)حد ضرر و هدف برای معاملهٔ "Long"
orders.cancel("Key")، orders.close_all()یک سفارش را لغو می‌کند؛ همه را می‌بندد
position.size، position.avg_priceاندازهٔ باز (برای خرید مثبت)؛ قیمتش
setup: با capital، size = sizing.lots(0.1)، fees = fee.per_lot(3.5)سرمایه، اندازه و کمیسیون
execution: با spread = 20 ticks، slippage = 2 ticksهزینه‌های پر شدن
Cuprel
// A strategy: orders with a key, a stop and a target, size and costs in the header.
strategy "Cheat sheet strategy"
    edition = 1
    display = price

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

execution:
    spread = 20 ticks
    slippage = 2 ticks

let fast = tech.ema(close, 10)
let slow = tech.ema(close, 30)
if tech.crosses_above(fast, slow)
    orders.enter("Long", side.long)
if position.size > 0
    orders.exit("Exit", "Long", stop = position.avg_price * 0.99, limit = position.avg_price * 1.02)
if tech.crosses_below(fast, slow)
    orders.close("Long")
plot(fast, name = "Fast", color = color.green)
plot(slow, name = "Slow", color = color.red)

نگاه کنید به اولین استراتژی شما، استراتژی‌ها و سرآیند.