پیشتر جای دیگری اسکریپت نوشتهاید؟
اگر پیشتر برای نمودار به زبان دیگری اسکریپت نوشتهاید، این صفحه ایدههای آشنا را به شکل نوشتنشان در اینجا وصل میکند و تفاوتهای واقعی را میگوید.
اگر با زبانهای اسکریپتنویسی دیگرِ نمودار اندیکاتور یا استراتژی نوشتهاید، بیشتر ایدهها همینجا هم به کار میآیند: اسکریپت برای هر کندل یک بار اجرا میشود، سریهای قیمت را میخواند، بعضی مقدارها را از کندلی به کندل بعد نگه میدارد و آنچه را حساب کرده رسم میکند. این صفحه هر ایده را نام میبرد، نشان میدهد 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 ?? 0 | na، خطاها و محاسبات عددی |
| تابعها و حلقهها | 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نمیپذیرد. اول آن را در خط جداگانهای بنویسید:
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)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#
هر برنامه کامل است: آن را در یک اسکریپت جدید بچسبانید، ذخیره و بعد افزودن به نمودار را بزنید.
یک میانگین متحرک با دو تنظیم:
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)علامت در جایی که میانگین سریع از میانگین کند عبور میکند. آزمونهای تقاطع هر کدام در خط جداگانهای حساب میشوند:
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 از کندلی به کندل بعد میماند:
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)مقداری از نمودار چهارساعته. بهطور پیشفرض مقدار آخرین کندل چهارساعتهٔ بستهشده است، پس تا وقتی آن کندل در حال شکلگیری است تغییر نمیکند:
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 میپرسد که آیا مقداری خالی است:
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)تابعی که دو نتیجه را با هم برمیگرداند:
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 آن را روی تاریخچهٔ طولانیتری آزمایش میکند:
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: اولین اسکریپت شما