آواتار محمدرضا فلاحتی توسط: تاریخ انتشار: 5 بهمن 1403 0 دیدگاه

امروز، Pine به نسخه v5 ارتقا پیدا می‌کند! نسخه جدید زبان برنامه‌نویسی اندیکاتور و استراتژی ما، یک مجموعه از ویژگی‌های جدید و بهبودها را به ارمغان می‌آورد. اینک Pine از هر زمان دیگری قدرتمندتر شده و تغییرات در v5 به ما کمک می‌کند تا زبان را به سطوح جدیدی ببریم. این پست تنها چند مورد از ویژگی‌های جدید موجود را معرفی می‌کند؛ حتماً یادداشت‌های انتشار و راهنمای مهاجرت را بخوانید.

مبدل v4 به v5

اسکریپت‌های Pine قبلی که از نسخه‌های قبل استفاده می‌کنند، بدون تغییر ادامه خواهند داد، اما ما ابزار تبدیل را در ویرایشگر Pine برای کمک به برنامه‌نویسان جهت تبدیل اسکریپت‌های v4 به v5 ارائه داده‌ایم. بهبودهای آینده در Pine به‌طور انحصاری برای v5 ارائه می‌شود، بنابراین اگر می‌خواهید از ویژگی‌های جدید بهره‌مند شوید، پیشنهاد می‌کنیم اندیکاتورها و استراتژی‌های خود را تبدیل کنید. ابزار تبدیل v4 به v5 هنگامی که یک اسکریپت v4 در ویرایشگر بارگذاری شده، از منوی کشویی بیشتر در دسترس است:

آتو تی کریپتو

به خاطر داشته باشید که همه کدهای v4 نمی‌توانند به‌طور خودکار تبدیل شوند. اگر با مشکلات تبدیل مواجه شدید یا ترجیح می‌دهید اسکریپت‌های خود را به‌صورت دستی تبدیل کنید، راهنمای مهاجرت که تمام تغییرات بین v4 و v5 را مستند می‌کند، به شما کمک خواهد کرد.

کتابخانه‌ها

یک افزودنی کلیدی به Pine که با v5 ظاهر می‌شود، کتابخانه‌ها هستند. کتابخانه‌ها نوع جدیدی از نشریه هستند که به شما امکان می‌دهند تا تابع‌های سفارشی ایجاد کنید که در اسکریپت‌های دیگر مورد استفاده قرار گیرند. پس از انتشار یک کتابخانه، سایر اسکریپت‌ها (چه اندیکاتورها، استراتژی‌ها یا حتی کتابخانه‌های دیگر) می‌توانند آن را وارد کرده و از توابع آن استفاده کنند. شما می‌توانید از کتابخانه‌ها برای گنجاندن الگوریتم‌های پیچیده یا توابع پرکاربرد استفاده کنید، به‌طوری که شما یا کل جامعه Pine به راحتی بتوانید از آن‌ها دوباره استفاده کنید.

برای شروع کار با کتابخانه‌ها، صفحه راهنمای کاربر ما درباره کتابخانه‌ها را ببینید. در انتهای این پست، مثال‌های کتابخانه‌ای منتشرشده توسط اعضای تیم PineCoders ما را خواهید یافت. همچنین می‌توانید کتابخانه‌های منتشرشده را از جریان اسکریپت از اینجا ببینید.

مقادیر پیش‌فرض برای توابع تعریف‌شده توسط کاربر

بهبود دیگری که با کتابخانه‌ها همراه است: یک مقدار پیش‌فرض می‌تواند برای پارامترها در توابع تعریف‌شده توسط کاربر مشخص شود، که به‌این‌ترتیب آن‌ها را اختیاری می‌کند. در مثال زیر، ما یک تابع سفارشی به نام customPow() را تعریف می‌کنیم که base را به توان exp می‌برد. اگر exp در هنگام فراخوانی تابع مشخص نشده باشد، 2 به‌عنوان مقدار پیش‌فرض استفاده خواهد شد:

برای استفاده رایگان از تریدینگ ویو پرمیوم از چارت آتو تی کریپتو استفاده کنید//@version=5
indicator(“”)
customPow(base, exp = 2) =>
    result = 1
    for i = 1 to exp
        result *= base
plot(customPow(11)) // 11^2
plot(customPow(11, 4)) // 11^4

Switch

بیان جدید switch یک تغییر در بیان شناخته‌شده if است. اگر تا به حال مجبور شده‌اید یک درخت بزرگ از عبارات if-else ایجاد کنید، قدردانی خواهید کرد که چقدر راحت‌تر می‌توان با switch به نتیجه دلخواه رسید. می‌توانید اطلاعات بیشتری را در مرجع ما بیاموزید. در کد زیر آن را در عمل مشاهده کنید. این نشانگر میانگین محدوده واقعی ما است که اکنون از یک بیان switch برای ارائه الگوریتم‌های مختلف صاف‌سازی در محاسبات خود استفاده می‌کند:

//@version=5
indicator(title="میانگین محدوده واقعی", shorttitle="ATR", timeframe="")
lengthInput = input.int(title="طول", defval=14, minval=1)
smoothingInput = input.string(title="صاف‌سازی", defval="RMA", options = ["RMA", "SMA", "EMA", "WMA"])

maFunction(source, length) =>
    switch smoothingInput
        "RMA" => ta.rma(source, length)
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        => ta.wma(source, length)

plot(maFunction(ta.tr(true), lengthInput), title = "ATR", color=#B71C1C)

مجموعه‌های ترسیمی

بهبود قابل توجهی در کیفیت زندگی برای کار با ترسیمات Pine: متغیرهای آرایه جدید line.all، label.all، box.all و table.all همیشه شامل شناسه‌های همه ترسیمات نوع مشخصی است که توسط اسکریپت شما کشیده شده است.

آموزش پخش همزمان نوارها در تریدینگ ویو

از آن می‌توانید استفاده کنید، به عنوان مثال، برای کاهش تعداد ترسیمات نمایش داده شده در چارت بر اساس مقداری که کاربر تعریف کرده است. در اسکریپت زیر، ما یک خط در هر باز جدید روزانه ترسیم می‌کنیم (تا محدودیت ~50، بر اساس محدودیت پیش‌فرض خط در اسکریپت). سپس بررسی می‌کنیم که آیا تعداد خطوط مجاز از طریق ورودی‌های اسکریپت تجاوز کرده است یا خیر، و اگر این‌گونه باشد، خط قدیمی‌ترین را حذف می‌کنیم:

//@version=5
indicator("باز جدید روزانه", overlay = true)

qtyOfLinesInput = input.int(10, "تنها n خط آخر را بکشید", minval = 0, maxval = 50)

if ta.change(time("1D"))
    line.new(bar_index, open, bar_index + 1, open, extend = extend.right)
    if array.size(line.all) > qtyOfLinesInput
        line.delete(array.get(line.all, 0))

برای استفاده رایگان از تریدینگ ویو پرمیوم از چارت آتو تی کریپتو استفاده کنید

در حالی که

یکی از ویژگی‌های منتظر Pine که با نسخه 5 به همراه آمده است، حلقه‌های while است. دستور while یک حلقه ایجاد می‌کند که زمانی که شرط نادرست باشد یا دستور break در حلقه استفاده شود، متوقف می‌شود.

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

//@version=5
var int MAX_BARS_BACK = 500
indicator("توجه به حجم", max_bars_back = MAX_BARS_BACK)

int lookBackInput = input.int(20, "حجم جستجو (میله‌ها)", minval = 2, maxval = int(MAX_BARS_BACK / 4))

// اگر نمودار داده‌های حجم نداشته باشد، اسکریپت را متوقف کنید.
bool noVol = na(volume) and nz(math.sum(nz(volume), 200) == 0, true)
if noVol
    runtime.error("داده حجم وجود ندارد.")

volumeBias(lookBack, maxLookBack) =>
    bool  barUp = ta.rising(close, 1)
    bool  barDn = ta.falling(close, 1)
    float upVolume = 0.
    float dnVolume = 0.
    float avgVolume = math.sum(nz(volume), lookBack)
    int[] upBarNos = array.new_int(0)
    int[] dnBarNos = array.new_int(0)
    int   bar = 1
    bool  volumeFound = false
    while (not volumeFound) and bar < maxLookBack
        if barUp[bar] and upVolume < avgVolume
            upVolume += nz(volume[bar])
            array.push(upBarNos, bar)
        else if barDn[bar] and dnVolume < avgVolume
            dnVolume += nz(volume[bar])
            array.push(dnBarNos, bar)
        bar += 1
        volumeFound := upVolume >= avgVolume and dnVolume >= avgVolume
    float volumeBias = bar >= maxLookBack ? na : array.avg(dnBarNos) - array.avg(upBarNos)

float bias = volumeBias(lookBackInput, MAX_BARS_BACK)
plot(bias, "توجه به حجم", bias > 0 ? color.lime : color.fuchsia)
hline(0)

حلقه while در این اسکریپت تا زمانی که حجم مورد نیاز در هر دو حالت حجم بالا و پایین یافت نشود، اجرا می‌شود و تا زمانی که از حداکثر تعداد میله‌های مجاز فراتر نرفته باشیم. اسکریپت همچنین نشانگر ویژگی‌های دیگر اضافه شده به Pine نسخه 5 را به نمایش می‌گذارد:

آموزش نشانگر فلش (Arrow Marker) در تریدینگ ویو

برای استفاده رایگان از تریدینگ ویو پرمیوم از چارت آتو تی کریپتو استفاده کنید

خطای زمان اجرا (runtime.error())

تابع runtime.error() این امکان را به شما می‌دهد تا اجرای یک اسکریپت را متوقف کرده و پیغام خطایی را بر اساس شرایطی که خودتان تعیین می‌کنید، نمایش دهید. این ویژگی برای سازندگان اسکریپت‌ها بسیار مفید خواهد بود، زیرا می‌توانند مانع از استفاده نادرست کاربران از اندیکاتورهای خود شوند. همچنین می‌توان از این تابع به عنوان ابزاری غیرمعمول برای اشکال‌زدایی استفاده کرد؛ به عنوان مثال، می‌توانید در حین اجرای یک حلقه یا حتی از داخل یک تابع، اجرای اسکریپت را متوقف کنید.

برای استفاده از این تابع جدید، کافیست تابع runtime.error() را زمانی که شرایط مدنظرتان برقرار شد، فراخوانی کنید. پس از اجرای تابع، اسکریپت متوقف شده و علامت تعجب آشنایی در کنار نام اندیکاتور ظاهر می‌شود. کاربران با کلیک بر روی آیکون علامت تعجب، پیغامی که در فراخوانی تابع مشخص کرده‌اید را مشاهده خواهند کرد.

کد زیر یک اندیکاتور ساده VWAP با دو خطای سفارشی است. خطای اول زمانی ظاهر می‌شود که نماد هیچ داده حجمی ندارد: زیرا VWAP بر اساس حجم محاسبه می‌شود، لذا در صورت نبود حجم، اسکریپت نمی‌تواند کار کند. خطای دوم زمانی بروز می‌کند که تایم فریم روی نمودار 1D یا بالاتر باشد؛ زیرا محاسبات پایه VWAP به داده‌های میانگین متحرک وزنی حجم در هر میله جدید پرداخته و در آغاز هر روز جدید بازنشانی می‌شوند. بنابراین این اندیکاتور فقط در تایم فریم‌های درون‌روزی کارایی دارد.

//@version=5
indicator("VWAP با خطاهای سفارشی")
if na(volume) // در صورتی که نماد داده حجم ندارد
    runtime.error("هیچ داده حجمی برای این نماد وجود ندارد.")
else if timeframe.isdwm // در تایم فریم‌های 1D و بالاتر
    runtime.error("VWAP مبتنی بر جلسه داده‌های معنی‌داری در تایم فریم‌های >= 1D نشان نمی‌دهد. لطفاً به تایم فریم کمتری سوئیچ کنید.")
plot(ta.vwap)

پارامترهای جدید استراتژی

خبر خوب برای کدنویسان استراتژی! یک مجموعه جدید از متغیرها و توابع به سیستم اضافه شده که اطلاعاتی در مورد خواص، آمار و معیارهای معاملات را به شما ارائه می‌دهد. این مقادیر در حین اجرای سفارشات شما توسط شبیه‌ساز کارگزاری به‌روز می‌شوند، بنابراین می‌توانید میزان‌ها را در حالی که استراتژی‌تان پیشرفت می‌کند دنبال کنید.

آموزش ابزار باکس (Box) در تریدینگ ویو
برای دیدن جزئیات هر یک به راهنمای مرجع Pine اینجا کلیک کنید

strategy.closedtrades.entry_price() / strategy.opentrades.entry_price()

strategy.closedtrades.entry_bar_index() / strategy.opentrades.entry_bar_index()

strategy.closedtrades.entry_time() / strategy.opentrades.entry_time()

strategy.closedtrades.size() / strategy.opentrades.size()

strategy.closedtrades.profit() / strategy.opentrades.profit()

strategy.closedtrades.commission()

برای استفاده رایگان از تریدینگ ویو پرمیوم از چارت آتو تی کریپتو استفاده کنید.

strategy.opentrades.commission()

strategy.closedtrades.max_runup() / strategy.opentrades.max_runup()

strategy.closedtrades.max_drawdown() / strategy.opentrades.max_drawdown()

strategy.closedtrades.exit_price()

strategy.closedtrades.exit_bar_index()

strategy.closedtrades.exit_time()

strategy.convert_to_account()

strategy.convert_to_symbol()

strategy.account_currency

فضاهای نام جدید

جامعه برنامه نویسان Pine به ما می‌گوید که از سرعت بی‌سابقه‌ای که در چند سال گذشته به Pine اضافه کرده‌ایم، قدردانی می‌کنند و قصد داریم این سرعت را در آینده حفظ کنیم. اما این موضوع باعث ایجاد جریانی مداوم از توابع و متغیرهای جدید Pine شده است. برای حمایت از این رشد سریع، لازم بود که ~600 نام فعلی استفاده شده در زبان را بهتر سازمان‌دهی کنیم. ما این کار را با افزودن فضاهای نام جدید انجام دادیم تا توابع را به گونه‌ای گروه‌بندی کنیم که بهتر منعکس‌کننده استفاده آن‌ها باشد. بسیاری از نام‌های پارامترهای توابع نیز تغییر نام داده شدند تا فهم آن‌ها آسان‌تر شود.

یک مثال از فضای نام جدید ta. است، که حالا شامل تمام متغیرها و توابع مرتبط با تحلیل تکنیکال می‌باشد. این کار به شما کمک می‌کند تا راحت‌تر به راهنمای مرجع مراجعه کرده و تمام متغیرها و توابعی را که مقادیر شاخص‌های رایج را برمی‌گردانند، پیدا کنید. به همین ترتیب، sma() اکنون ta.sma() است. به یاد داشتن فضاهای نام جدید ضروری نیست؛ اگر نام قدیمی تابع را بدون فضای نام در ویرایشگر وارد کنید و کلید میانبر تکمیل خودکار (Ctrl + Space یا Cmd + Space در مک) را فشار دهید، یک پنجره پاپ آپ با پیشنهادات مربوطه نمایش داده می‌شود:

آتو تی کریپتو

همین موضوع در هنگام جستجو در راهنمای مرجع صادق است؛ وارد کردن نام یک تابع آشنا بدون فضای نام، نام جدید آن را نمایان می‌کند. شما می‌توانید لیست کامل تغییرات نسخه 5 را در راهنمای مهاجرت ما مشاهده کنید.

کتابخانه‌های منتشر شده

انتشارات زیر نمونه‌هایی از کتابخانه‌هایی هستند که توسط PineCoders در TradingView منتشر شده‌اند و به ما در آزمایش ویژگی‌های جدید Pine کمک می‌کنند:

ColorScheme توسط RicardoSantos

برای استفاده رایگان از تریدینگ ویو پرمیوم از چارت آتو تی کریپتو استفاده کنید

آتو تی کریپتو

کتابخانه توابع ماتریس از Duyck

آتو تی کریپتو

تحلیل تکنیکالی پیشرفته از HeWhoMustNotBeNamed

آتو تی کریپتو

امیدواریم این ویژگی‌های جدید برای شما مفید باشند. لطفاً به بازخورد و پیشنهادات خود ادامه دهید – ما TradingView را برای شما می‌سازیم و همیشه مشتاقیم که نظر شما را در مورد به‌روزرسانی‌های پلتفرم‌مان بدانیم.

برای استفاده رایگان از تریدینگ ویو پرمیوم از چارت آتو تی کریپتو استفاده کنید

دیدگاهتان را بنویسید