مجموعه کاملی از نمونه کدهای آماده و کاربردی برای ساخت ستونهای محاسباتی شخصیسازیشده و پیشرفته در دیدهبان بر اساس بلکشولز، سر به سر، یونانیها و موقعیت باز.
برای ساخت ستون، به دیدهبان آپشن بروید (راهنمای دیدهبان)، یا از طریق میزکار باکس دیدهبان اضافه کنید؛ سپس روی دکمهٔ ستون محاسباتی کلیک کنید، یک نام مناسب بگذارید، کد را در ادیتور بنویسید و خروجی نهایی را با دستور return برگردانید، سپس آن را ذخیره کنید.
این کدها فقط در دیدهبان آپشنباز اجرا میشوند. دیدهبان سایت TSETMC زبان دیگری دارد و خروجی هر ردیفش فقط درست یا نادرست است؛ نمونههای همان محیط در فیلترنویسی اختیار معامله در دیدهبان TSETMC آمدهاند.
ستونهای زیر آمادهٔ کپیاند، ولی برای اینکه بتوانید تغییرشان بدهید باید بدانید هر خط چه میگوید — زبان فرمولنویسی متغیر، شرط، آرایه و تابع را با همین جنس مثالها توضیح میدهد.
قبل از نوشتن کد: فرمولهای آماده و استراتژیها
بیشتر چیزی که یک ستون تازه قرار است نشان بدهد، از قبل ساخته شده. نوشتن کد آخرین گزینه است، نه اولی — و همین ترتیب، وقتِ شما را نگه میدارد.
چهار مسیر برای ساختن یک ستون، به ترتیبِ ارزانی. کد، آخرین گزینه است نه اولی — سه مسیر بالاتر همان کار را بدون ادیتور انجام میدهند.
یک: کتابخانهٔ فرمولهای آماده. دهها ستون و فیلتر آماده در خود دیدهبان هست که با یک انتخاب فعال میشوند و یک خط کد هم لازم ندارند — فهرست کاملشان در فرمولهای آمادهٔ دیدهبان بدون کدنویسی آمده است.
دو: تنظیمات ویژوال. هر فرمولی که آیکن تنظیمات دارد، آستانههایش را بدون باز کردن ادیتور میشود عوض کرد؛ همان کاری که بخش 7 همین مقاله با FILTER_MIN_MONTHLY میکند. ساخت و مدیریت این پنل در مدیریت خروجی و فیلتر فرمول توضیح داده شده.
چهار: دستیار هوش مصنوعی. اگر میدانید چه میخواهید ولی نمیدانید چطور بنویسید، دستیار داخل خودِ اپ کد را از روی توضیح فارسی میسازد؛ برای ابزارهای بیرونی هم پرامپت آمادهٔ فرمولنویسی را بردارید.
و اگر هیچکدام دقیقاً همان چیزی نبود که میخواهید، از همینجا به بعد کدش را مینویسیم.
یک سلول سه کانال دارد: مقدار خوانده میشود، رنگ وضعیت را بیکلمه میگوید، و تولتیپ جزئیات را بدون شلوغ کردن جدول نگه میدارد.رنگ را چشم پیش از عدد میبیند، پس آستانهها را جایی بگذارید که تصمیم شما عوض میشود — و برای دادهٔ خالی رشتهٔ خالی بدهید، نه رنگ خنثی.
اختلاف قیمت بازار (بهترین تقاضا) با قیمت تئوریک بلکشولز (درصد):
نمایش وضعیت زنجیره معاملاتی (باز/بسته) و درصد پر شدن سقف قانونی بورس:
let status = option.chainOpen ? 'باز' : 'بسته/محدود';
let color = option.chainOpen ? '#16a34a' : '#dc2626';
return style(status, color, '', 'زنجیره') +
' | ' + style(roundNumber(option.chainFill, 0) + '%', '#ea580c', '', 'درصد سقف قانون');
6. توابع پیشرفته همسررسید (زنجیره اختیارها)
یک ستون میتواند قراردادهای اعمالِ بالاتر و پایینتر را قابل کلیک کنار هم بگذارد — مقایسهٔ همسایهها بدون ترک جدول.
نمایش نمادهای همسررسید با قیمت اعمال بالاتر و پایینتر:
let result = '';
for (let index = -2; index <= 2; index++) {
if (index === 0) continue;
let o = optionSE(index);
if (o) result += showDetail(o.namad, '#') + ' ';
}
return result;
نمایش مشخصات نماد اختیار فروش (Put) مقابل برای جفتقرارداد اختیار خرید (Call) جاری:
let opp = optionSE(0, 'os');
return opp ? showDetail(opp.namad, 'put') : '';
7. ستون پیشرفته — ترکیب کال اسپرد صعودی همراه با دکمه 📈 نمودار سود/زیان
این ستون فوقالعاده هوشمند، بهترین ترکیب کال اسپرد را روی نمادهای پایه پیدا کرده و پوزیشنهای خرید و فروش را مستقیماً وارد شیء pos میکند. به کمک ثابتهای ویژوال جدید، شما میتوانید آستانههای فیلتر سود ماهانه و فاصله اعمال تا سهم را مستقیماً از دکمهٔ ⚙️ بالای ستون کنترل کنید:
ستون پیشرفته چهار چیز را یکجا دارد: ثابتهای ویژوال، حلقه روی زنجیره، ساخت پوزیشن و دکمهٔ نمودار — و حجم سرخط را باید پیش از حلقه چک کرد.
// --- تنظیمات ویژوال قابل تغییر در پنل ⚙️ ---
const FILTER_MIN_MONTHLY = 2; // حداقل سود ماهانه مورد انتظار (درصد)
const FILTER_MIN_STRIKE_DIST = 10; // حداقل فاصله اعمال بالاتر از سهم (درصد)
let result = '';
let index = -1;
while (optionSE(++index) !== undefined) {
let upper = optionSE(index);
if (!upper || upper.ti.buy1Volume === 0 || option.ti.buy1Volume === 0) continue;
// محاسبه بدهکاری/هزینه اولیه راهاندازی اسپرد
let debit = (option.ti.sell1Price - upper.ti.buy1Price) * option.size;
// محاسبه حداکثر سود تئوریک
let profit = ((upper.strike - option.strike) * option.size) - debit;
// محاسبه سود سالانه یا ماهانه
let yCapital = monthlyProfit((profit / debit) * 100, option.daysUntilMaturity);
// فاصله استرایک بالایی تا آخرین قیمت سهم پایه
let disStrike = calcRateChange(ua.ti.lastPrice, upper.strike);
// ارزیابی شروط بر اساس فیلترهای پنل ویژوال
if (yCapital >= FILTER_MIN_MONTHLY && disStrike > FILTER_MIN_STRIKE_DIST && disStrike > 0
&& option.ti.sell1Price > 0 && upper.ti.buy1Price > 0) {
// اضافه کردن موقعیت خرید و فروش تعهدی به شیء جهت رسم پلات
pos.add('buy', option.namad, 1, 'sell');
pos.add('sell', upper.namad, 1, 'buy');
result += showDetail(upper.namad) + ' : '
+ style(yCapital, 'green', '', 'سود ماهانه') + ' : '
+ style(disStrike, '#ea580c', '', 'فاصله اعمال');
// ساخت دکمه 📈 تعاملی جهت بارگذاری فوری پوزیشنها در صفحهٔ نمودار سود/زیان
result += pos.build('اسپرد ' + option.namad);
}
}
return result;
دو ستونی که بیشترین اطلاعات را به ازای یک سلول میدهند همین دو هستند، و هر دو یک تلهٔ واحد دارند که هیچ خطایی نمیدهد.
واحد نوسان در دو تابع برعکس هم است: calcBS درصد میخواهد و popWithIV اعشار. واحد اشتباه خطا نمیدهد — یک عدد کاملاً معقول میسازد که غلط است.
احتمال رسیدن به نقطهٔ سربهسر تا سررسید (درصد):
let iv = option.iv;
if (!iv) return '';
let p = popWithIV(ua.ti.lastPrice, breakeven(), iv, option.daysUntilMaturity);
if (p === '') return '';
return style(p + '%', Number(p) >= 50 ? '#16a34a' : '#dc2626', '', 'احتمال رسیدن به سربهسر');
سه نکته که هر سهشان بیصدا خراب میکنند. اول اینکه popWithIV یک رشته برمیگرداند نه عدد، پس مقایسهٔ مستقیمش با 50 مقایسهٔ متنی میشود؛ به همین دلیل در مثال بالا از Number(p) استفاده شده. دوم اینکه وقتی نوسان ضمنی صفر یا نامعتبر باشد رشتهٔ خالی میدهد، پس شرط p === '' لازم است. سوم — و مهمتر از هر دو — واحد نوسان: option.iv عددی بین 0 و 1 است و popWithIV هم همان را میخواهد. اگر بهجایش 45 بدهید، خطا نمیگیرید؛ خروجی 50 میشود، که یک عدد کاملاً معقول و کاملاً غلط است.
تابع خواهرش probOfProfit همان محاسبه را میکند ولی ترتیب آرگومانهایش برعکس است — اول سربهسر، بعد قیمت روز — و عدد برمیگرداند نه رشته. روی یک نمونهٔ واقعی، جابهجا کردن همین دو آرگومان جواب را از 30 به 70 میبرد و باز هم هیچجا خطایی دیده نمیشود. یک ردیف آشنا را دستی چک کنید تا جهت را ببندید.
اهرم مؤثر کنار اهرم ساده:
let simple = leverage();
let real = effectiveLeverage();
if (!simple || !real) return '';
return style(showNo(real, 1), '#16a34a', '', 'اهرم مؤثر — همان ستون اهرم دیدهبان') +
' | ' + style(showNo(simple, 1), '#6b7280', '', 'اهرم ساده، بدون دلتا');
leverage() فقط قیمت پایه را بر قیمت اختیار تقسیم میکند و معمولاً عدد بزرگ و خوشآبورنگی میدهد. effectiveLeverage() همان را در قدر مطلق دلتا ضرب میکند، و همین دومی است که ستون «اهرم» دیدهبان نشان میدهد. برای یک قرارداد دور از پول که دلتایش کوچک است، فاصلهٔ این دو عدد چند برابر میشود — و اهرمی که واقعاً به دستتان میرسد، همان کوچکتر است.
بازده پرمیوم برای فروشنده، ماهانه و سالانه کنار هم:
let premium = option.ti.buy1Price;
if (!premium || !option.strike) return '';
let r = (premium / option.strike) * 100;
return style(showNo(monthlyProfit(r, option.daysUntilMaturity), 1) + '%', '#16a34a', '', 'ماهانه') +
' | ' + style(ytmProfit(r, option.daysUntilMaturity) + '%', '#ea580c', '', 'سالانه');
این دو تابع دو کار متفاوت میکنند و اشتباه گرفتنشان ستون را از این رو به آن رو میکند. monthlyProfit صرفاً بازده را بر تعداد ماه تقسیم میکند؛ ytmProfit آن را مرکب میکند و به یک سال میرساند. برای یک بازده 3 درصدی در 60 روز، اولی 1.5 میدهد و دومی 20؛ در 90 روز، اولی 1 و دومی 13. هیچکدام غلط نیستند، ولی اگر عنوان ستون نگوید کدام است، خواننده عدد بزرگتر را به حساب سود ماهانه میگذارد.
یک محافظ لازم هم دارد: ytmProfit وقتی بازده یا روز صفر باشد رشتهٔ خالی برمیگرداند، پس نمیشود مستقیم در محاسبهٔ بعدی استفادهاش کرد.
این ستون فقط برای قراردادهایی مقدار دارد که موقعیت فروش رویشان باز میشود. rnwc عدد را با پسوند هزار و میلیون و میلیارد نشان میدهد، پس ستون باریک میماند و رقم کامل در تولتیپ مینشیند.
10. رنگبندی و نمایش، بدون شرط تودرتو
در بخش 1 رنگ دلتا با دو شرط تودرتو ساخته شد. وقتی بازهها بیشتر از دو تا شوند، آن روش خوانا نمیماند — colorRange همان کار را با یک فهرست انجام میدهد.
دو چیز را باید بدانید وگرنه ستون بیسروصدا ناقص میماند. اول: بازهها باید کل دامنه را بپوشانند. colorRange اولین بازهای را که مقدار در آن بیفتد اعمال میکند و اگر هیچ بازهای نگیرد، مقدار را خام و بدون رنگ برمیگرداند — نه خطا، نه سلول خالی؛ فقط یک ردیف بیرنگ وسط بقیه. به همین دلیل در مثال بالا کف و سقف عمداً بزرگ گرفته شدهاند تا دلتای منفی اختیار فروش هم جا بیفتد.
دوم: از میان کلیدهای این تابع، color و bg کار میکنند چون مستقیم به استایل درونخطی تبدیل میشوند، ولی size و bold کلاسهایی میسازند که در استایلهای سایت تعریف نشدهاند و هیچ اثری روی صفحه ندارند. اگر متن پررنگ میخواهید، از style استفاده کنید که پارامتر مخصوص خودش را دارد.
جای قیمت اعمال و سربهسر روی یک نوار قیمت:
let be = breakeven();
if (!be || !ua.ti.lastPrice) return '';
let pts = [
{ value: option.strike, color: 'purple', tooltip: 'قیمت اعمال' },
{ value: be, color: 'green', tooltip: 'سربهسر' }
];
pts.sort(function (a, b) { return a.value - b.value; });
return createPriceLine({ width: 180, currentPrice: ua.ti.lastPrice, points: pts });
createPriceLine بین هر دو نقطهٔ متوالی یک قطعهٔ رنگی میکشد، پس نقاط باید صعودی مرتب باشند؛ بدون آن sort، قطعهها روی هم میافتند. مقیاس نوار خودکار از کمینه و بیشینهٔ همان نقاط بهعلاوهٔ قیمت روز ساخته میشود، و کنار هر نشانگر درصد فاصلهاش تا قیمت روز در تولتیپ میآید. برای سنجیدن فاصلهٔ خرید و فروش هم نقش بازارگردان و اسپرد را ببینید.
نمونههای همین جنس برای فیلتر — که خروجیشان بهجای یک مقدار، درست یا نادرست است — در نمونه کدهای کاربردی فیلترنویسی جمع شدهاند.
اگر سوال یا ابهامی در رابطه با این مطلب دارید، همینجا بپرسید؛ کارشناسان ما پاسخ میدهند.
تجربه یا نکتهای دارید؟ نوشتنش به بقیهٔ کاربران هم کمک میکند.
پرسشها و نظرات کاربران
5 پیام
حسین
19 اردیبهشت 1402 - 22:35
باسلام
آیا این فیلترها در سایت tse قابل اجرا است؟
چون یکیش را تست کردم جواب نمیده
حسینپاسخ
19 اردیبهشت 1402 - 22:52
امکانش هست فرمولهایی که در سایت tse امکان پیاده سازیش باشه معرفی کنید
پشتیبانیپاسخ
22 اردیبهشت 1402 - 11:30
این کدها برای ستون محاسباتی دیدهبان آپشنباز نوشته شدهاند و در دیدهبان TSETMC اجرا نمیشوند؛ دو محیط دو زبان جدا دارند. در TSETMC خروجی هر ردیف فقط درست یا نادرست است و فیلد اختصاصی اختیار معامله هم ندارد، ولی ستون اینجا یک مقدار برمیگرداند و به توابعی مثل calcBS() و optionSE() دسترسی دارد که معادلی در آن محیط ندارند.
برای فیلترنویسی در خود TSETMC، این مقاله نمونههای آماده و محدودیتهای آن محیط را دارد:
https://optionbaaz.ir/pedia/فیلتر-نویسی-اختیار-معامله-دیده-بان-سایت-بورس-TSETMC-96
اشکان
13 اردیبهشت 1402 - 21:55
سلام چگونه میشود فرمولی نوشت که بشه باهاش نوسان ضمنی اختیار های کمتر از 0.6 را پیدا کرد
پشتیبانیپاسخ
15 اردیبهشت 1402 - 13:42
برای این شرط نیازی به فرمول نیست؛ ستون IV خودش فیلتر سرستون دارد.
از دکمهٔ «ستونها» در نوار بالای دیدهبان ستون IV را روشن کنید، روی آیکن فیلتر همان سرستون بزنید، عملگر «کمتر از» را انتخاب کنید و مقدار 0.6 را بگذارید. مقدار این ستون اعشاری است، پس 0.6 یعنی 60٪.
اگر خواستید همین شرط را با شرطهای دیگر ترکیب کنید، فیلتر سرستون چند ستون همزمان با منطق AND اعمال میشود و لازم نیست کد بنویسید.