تکخطی — بدون return — کار میکند
option.ti.lastPrice * option.sizeبدون فرمولنویسی، باید هر روز صدها قرارداد را دستی بررسی کنید و باز هم ممکن است بهترین موقعیت را از دست بدهید. با آپشن باز و بخش فرمولنویسی، یکبار فرمول بنویسید — دیدهبان خودش بهترینها را جلوی چشمتان میآورد.
true یا false برمیگرداند. فقط قراردادهایی که نتیجه شرط آنها true است در جدول باقی میمانند.در هر دو حالت، کد شما با جاوااسکریپت نوشته میشود، روی هر سطر جداگانه اجرا میشود و به اطلاعات قرارداد (option) و نماد پایه (ua) دسترسی دارد. توضیح کامل ستون و فیلتر در بخشهای بعدی آمده است.
حساسیت حروف در کد
نام فیلدها و توابع به کوچک/بزرگ بودن حروف حساس هستند. برای مثال option.ti.lastPrice درست است ولی option.ti.lastprice خطا میدهد.
هر فرمول در واقع بدنه یک تابع جاوااسکریپت است که روی هر سطر اجرا میشود. رفتار return بسته به تعداد خطوط فرق میکند.
اگر کل فرمول در یک خط باشد، موتور بهصورت خودکار return (expr); را اضافه میکند.
option.ti.lastPrice * option.sizereturn option.ti.lastPrice * option.size;option.state == 'ITM' && leverage() >= 4هر وقت فرمول بیش از یک خط دارد (متغیر، شرط، حلقه)، باید حداقل یک return داشته باشد، وگرنه در ستون ⚠ return ندارد نمایش میدهد.
let profit = option.ti.buy1Price / ua.ti.lastPrice * 100;
return roundNumber(ytmProfit(profit, option.daysUntilMaturity), 1) + '%';let profit = option.ti.buy1Price / ua.ti.lastPrice * 100;
roundNumber(ytmProfit(profit, option.daysUntilMaturity), 1);فرمول فیلتر چندخطی هم باید return true/false; داشته باشد، وگرنه همه سطرها حذف میشوند (مقدار undefined = false).
میتوانید در هر شاخه if یک return بگذارید. اولین return که اجرا شود خروجی ستون را مشخص میکند.
if (!option.ti.volume) return '';
if (option.type == 'call')
return style('C', '#3b82f6');
return style('P', '#f97316');در ویرایشگر فرمول، با Ctrl + Space لیست کامل فیلدها و توابع را ببینید. همچنین وقتی بعد از option. یا ua. تایپ میکنید، پیشنهادهای خودکار نمایش داده میشوند.
ستون محاسباتی یک ستون سفارشی است که در جدول دیدهبان اضافه میشود. خروجی میتواند عدد، متن یا HTML باشد. مقدار برگشتی در ستون نمایش داده میشود.
option.strikeroundNumber(calcBS().delta, 2)style(option.state, option.state=='ITM'?'green':'red')برای رنگبندی، tooltip یا ترکیب چند مقدار در یک ستون از تابع style() استفاده کنید. میتوانید چند style() را با + به هم وصل کنید.
style(option.state, option.state=='ITM'?'green':'red') + ' | ' + style(roundNumber(intrinsic(),0), '#888')let d = calcBS().delta;
return colorCondition(d, 0.3, 'red', 0.5, 'green', 'color', false);از متغیر، شرط و حلقه استفاده کنید. فقط حتماً return داشته باشد.
let premium = option.ti.buy1Price;
let base = ua.ti.lastPrice;
if (!premium || !base) return '';
let pct = (premium / base) * 100;
return roundNumber(ytmProfit(pct, option.daysUntilMaturity), 1) + '%';let next = optionSE(1);
if (!next) return '';
let debit = option.ti.sell1Price - next.ti.buy1Price;
let maxProfit = (next.strike - option.strike) - debit;
return style(commaSeparator(debit), 'orange', '', 'هزینه') +
' | ' +
style(commaSeparator(maxProfit), 'green', '', 'حداکثر سود');نکته: مقدار خالی
اگر فرمول return ''; یا return null; برگرداند، خروجی خالی نمایش داده میشود — مناسب برای پنهانکردن مقدار وقتی داده معتبر وجود ندارد.
فیلتر یک کد است که برای هر سطر true یا false برمیگرداند. سطرهایی که false باشند از جدول حذف میشوند.
یک عبارت شرطی که مستقیماً true/false برمیگرداند. نیازی به return نیست.
option.state == "ITM" && leverage() >= 4option.ti.volume > 0ua.namad == 'خودرو' || ua.namad == 'خساپا'وقتی شرط پیچیدهتری نیاز دارید (محاسبه میانی، nullچک)، باید با return true یا return false تمام شود.
let iv = calcBS().iv;
if (!iv) return false;
return probOfProfit(breakeven(), ua.ti.lastPrice, iv, option.daysUntilMaturity) >= 60;let iv = calcBS().iv;
let hv = ua.hv;
if (!iv || !hv) return false;
return iv > hv;با تعریف const FILTER_RESULT = false; در فرمول، یک کد میتواند هم مقدار ستون را نمایش دهد هم بهعنوان فیلتر عمل کند.
| ثابت | کاربرد | مقدار در اجرا |
|---|---|---|
| FILTER_RESULT | مشخص میکند فرمول در حالت نمایش ستون اجرا شده یا در حالت فیلتر. مقدار نهایی را worker تعیین میکند. | ستون: false، فیلتر: true |
| FILTER_SHOW | کنترل نمایش مقدار ستون، بدون غیرفعالکردن فیلتر. | true یعنی نمایش مقدار؛ false یعنی خروجی خالی |
const FILTER_RESULT = false;
const FILTER_SHOW = true;
let lev = leverage();
if (FILTER_RESULT) return lev >= 3;
return style(roundNumber(lev, 1), lev >= 3 ? 'green' : '#888', '', 'اهرم');فعال/غیرفعالکردن این فیلتر از پنل فیلترها در toolbar انجام میشود — بدون نیاز به ویرایش کد.
هر فرمول به دو آبجکت اصلی دسترسی دارد که اطلاعات سطر جاری را در خود دارند.
تفاوت اصلی: آبجکت option مربوط به خود قرارداد اختیار (مثلاً ضخود) است، اما ua مربوط به سهم پایه آن (مثلاً خودرو) میباشد. برای قیمتهای لحظهای هر دو، همیشه از پسوند .ti استفاده کنید.
optionقرارداد اختیار سطر جاری
اطلاعات همان قراردادی که در این سطر دیدهبان نمایش داده میشود.
| فیلد | توضیح |
|---|---|
option.strike | قیمت اعمال |
option.type | نوع قرارداد: call یا put |
option.daysUntilMaturity | روز تا سررسید |
option.state | وضعیت ITM، ATM یا OTM |
option.ti.* | قیمت، حجم و دفتر سفارش قرارداد |
مثال: آخرین قیمت قرارداد
option.ti.lastPriceuaنماد پایه سطر جاری
دارایی پایهای که قرارداد اختیار روی آن نوشته شده است.
| فیلد | توضیح |
|---|---|
ua.namad | نماد پایه، مثل خودرو |
ua.hv | نوسانپذیری تاریخی |
ua.ivRank | IV Rank — رتبه نوسان ضمنی نسبت به یک سال گذشته (۰–۱۰۰) |
ua.ivPercentile | IV Percentile — درصد روزهایی که WIV کمتر از امروز بوده (۰–۱۰۰) |
ua.isEtf | آیا دارایی پایه صندوق است؟ |
ua.ti.* | قیمت، حجم و دفتر سفارش نماد پایه |
مثال: آخرین قیمت نماد پایه
ua.ti.lastPriceفیلدهای آبجکت سطر جاری را مستقیماً بخوانید — سریعترین روش.
ua.ti.tValue > 10option.strike * option.sizeقرارداد یا پایه دیگر، همسررسید، زنجیره — با توابع جستجو.
getOptionByNamad('ضهرم8004').ti.lastPriceoptionSE(0, 'os').namadمشخصات خود قرارداد اختیار — نماد، استرایک، نوع call/put، سررسید، وضعیت ITM/ATM/OTM، موقعیت باز، IV و مارجین. دسترسی با option.fieldName. قیمت و حجم روز در option.ti است (بخش بعدی).
| فیلد | نوع | توضیح و جزئیات |
|---|---|---|
option.namad | string | نماد اختیارکد نماد اختیار معامله (مثال: ضبهمن۱۴۰۳) |
option.name | string | نام اختیارنام کامل نماد اختیار |
option.code | string | کد اختیارکد داخلی نماد اختیار |
option.strike | number | قیمت اعمالStrike price — قیمت اعمال اختیار |
option.type | string | نوع: call | put"call" برای خرید, "put" برای فروش |
option.sarresid | string | سررسیدتاریخ سررسید اختیار به فرمت رشته |
option.daysUntilMaturity | number | روز تا سررسیدتعداد روز کالندری تا سررسید |
option.dayTradesUntilMaturity | number | روز معاملاتی تا سررسیدتعداد روز معاملاتی تا سررسید |
option.size | number | اندازه قراردادتعداد سهم در هر قرارداد اختیار |
option.state | string | وضعیت: ITM | ATM | OTMوضعیت اختیار: در سود / در سر به سر / خارج از سود |
option.openInterest | number | موقعیت بازتعداد کل موقعیتهای باز در بازار |
option.openInterestPC | number | تغییر موقعیت باز (%)درصد تغییر موقعیت باز نسبت به روز قبل |
option.volumeAvg | number | میانگین حجممیانگین حجم معاملات روزانه اختیار |
option.iv | number | نوسان پذیری ضمنیImplied Volatility — نوسانپذیری ضمنی (0 تا 1) |
option.blackSholesHV | number | نوسان تاریخی BSHistorical Volatility برای محاسبه Black-Scholes |
option.wivSe | number | WIV (وزنی سررسید)نوسانپذیری ضمنی وزنی بر اساس سررسید |
option.wiv | number | WIVWeighted Implied Volatility |
option.requiredMargin | number | مارجین مورد نیازمارجین مورد نیاز برای فروش این اختیار |
option.minimumMargin | number | حداقل مارجینحداقل مارجین قابل قبول |
option.uaSymbolNamad | string | نماد دارایی پایهنماد سهم پایه مرتبط با این اختیار |
option.chainOpen | boolean | وضعیت باز بودن زنجیرهtrue فقط وقتی وضعیت زنجیره کاملا باز باشد (نه سقفخورده/بسته/در انتظار بازگشایی) |
option.chainFill | number | درصد پرشدن سقف زنجیرهدرصد پرشدن سقف OI زنجیره (میتواند بیشتر از ۱۰۰ باشد) |
option.fee | number | کارمزد خرید/فروشنرخ کارمزد خرید و فروش قرارداد اختیار |
option.buyExerciseFee | number | کارمزد اعمال خریدنرخ کارمزد اعمال خرید |
option.writeExerciseFee | number | کارمزد اعمال فروشنرخ کارمزد اعمال فروش (صندوق: 0.0005، سهام: 0.0055) |
نماد، نوع call/put، قیمت اعمال، روزهای باقیمانده تا سررسید و وضعیت ITM/ATM/OTM — پرکاربردترین فیلدهای option در یک خروجی ترکیبی.
let typeLabel = option.type == 'call' ? 'کال' : 'پوت';
let stateColor =
option.state == 'ITM' ? '#16a34a' :
option.state == 'ATM' ? '#2563eb' : '#6b7280';
return style(option.namad, '#1d4ed8', '', option.name) +
' | ' +
style(typeLabel, option.type == 'call' ? '#16a34a' : '#dc2626', '', 'نوع') +
' | ' +
style(commaSeparator(option.strike), '', '', 'اعمال') +
' | ' +
style(option.daysUntilMaturity + ' روز', '#6b7280', '', 'تا سررسید') +
' | ' +
style(option.state, stateColor, '', 'وضعیت');iv نوسان ضمنی همین قرارداد است؛ blackSholesHV نوسان تاریخی که در محاسبات بلکشولز استفاده میشود — مقایسه برای دیدن گران/ارزان بودن نسبت به تاریخ.
if (!option.iv) return '';
let ivPct = roundNumber(option.iv * 100, 1);
let hvPct = option.blackSholesHV
? roundNumber(option.blackSholesHV * 100, 1)
: '—';
return style('IV ' + ivPct + '%', option.iv > 0.5 ? '#dc2626' : '#16a34a', '', 'ضمنی') +
' | ' +
style('HV ' + hvPct + '%', '#6b7280', '', 'تاریخی BS');openInterest تعداد کل موقعیتهای باز را نشان میدهد؛ openInterestPC درصد تغییر نسبت به دیروز — برای پیدا کردن قراردادهای «داغ».
if (!option.openInterest) return '';
let oiChg = option.openInterestPC;
let chgColor = oiChg > 5 ? '#16a34a' : oiChg < -5 ? '#dc2626' : '#6b7280';
return style(rnwc(option.openInterest), '', '', 'موقعیت باز') +
' | ' +
style(roundNumber(oiChg, 1) + '%', chgColor, '', 'تغییر OI');requiredMargin و minimumMargin برای فروشنده اختیار — معمولاً در استراتژیهای فروش call/put یا اسپرد نمایش داده میشود.
if (!option.requiredMargin) return '';
return style(
'مارجین ' + rnwc(option.requiredMargin),
'#ea580c',
'',
'حداقل: ' + rnwc(option.minimumMargin)
);ترکیب option.strike با قیمت پایه (ua.ti) — فاصله درصدی اعمال از آخرین قیمت دارایی پایه.
if (!ua.ti.lastPrice || !option.strike) return '';
let pct = calcRateChange(ua.ti.lastPrice, option.strike, 1);
return style(
commaSeparator(option.strike),
'',
'',
'اعمال — ' + pct + '% از آخرین ' + ua.namad
);دو فیلد ساده برای سقف زنجیره: chainOpen وضعیت باز/غیرباز و chainFill درصد پرشدن سقف (میتواند بیشتر از ۱۰۰ باشد).
let status = option.chainOpen ? 'باز' : 'بسته/محدود';
let color = option.chainOpen ? '#16a34a' : '#dc2626';
return style(status, color, '', 'وضعیت زنجیره') +
' | ' +
style(roundNumber(option.chainFill, 0) + '%', '#ea580c', '', 'درصد پرشدن سقف');فیلتر ساده روی نوع و وضعیت قرارداد — بدون نیاز به ti.
option.type == "call" && option.state == "ITM"daysUntilMaturity بازه زمانی را مشخص میکند؛ معمولاً با شرط حجم (ti) ترکیب میشود تا قراردادهای مرده حذف شوند.
return option.daysUntilMaturity >= 7
&& option.daysUntilMaturity <= 45
&& option.ti.volume > 0;قراردادی که OI معنادار دارد و امروز رشد قابلتوجه موقعیت باز داشته (بیش از ۵٪).
option.openInterest > 500 && option.openInterestPC > 5اگر زنجیره سقفخورده، بسته یا در انتظار بازگشایی باشد chainOpen برابر false میشود.
!option.chainOpenقراردادهایی که درصد پرشدن سقف زنجیره آنها از یک حد مشخص بیشتر است (مثلا ۸۵٪).
option.chainFill >= 85ترکیب وضعیت و درصد: یا زنجیره غیرباز باشد یا درصد پرشدن خیلی بالا باشد.
!option.chainOpen || option.chainFill >= 95iv بهصورت عدد اعشاری (۰ تا ۱) است؛ ۰.۵ یعنی ۵۰٪. برای پیدا کردن پریمیومهای پرنوسان.
option.iv > 0.5 && option.daysUntilMaturity > 3ترکیب type، state و روزهای باقیمانده — مثلاً برای استراتژیهای کوتاهمدت روی پوت.
return option.type == "put"
&& option.state == "ATM"
&& option.daysUntilMaturity <= 14
&& option.daysUntilMaturity >= 1;فیلد option.ti برای صف؛ خود option برای شناسایی قراردادهایی که امروز معامله نشدهاند ولی سفارش فروش دارند.
option.ti.volume == 0 && option.ti.sell1Count > 0فیلدهای نماد پایه — دسترسی با ua.fieldName.
| فیلد | نوع | توضیح و جزئیات |
|---|---|---|
ua.namad | string | نماد دارایی پایهکد نماد سهم پایه (مثال: وبهمن) |
ua.name | string | نام دارایی پایهنام کامل سهم پایه |
ua.code | string | کد دارایی پایهکد داخلی سهم پایه |
ua.hv | number | نوسان تاریخی (HV)Historical Volatility — نوسانپذیری تاریخی سهم پایه (0 تا 1) |
ua.ivRank | number | IV Rank (رتبه IV)رتبه نوسانپذیری ضمنی نسبت به یک سال گذشته — ua.ivRank، مقیاس ۰ تا ۱۰۰؛ null اگر تاریخچه کافی نباشد |
ua.ivPercentile | number | IV Percentile (درصد IV)درصد روزهایی که WIV کمتر از مقدار فعلی بوده — ua.ivPercentile، مقیاس ۰ تا ۱۰۰؛ null اگر تاریخچه کافی نباشد |
ua.isEtf | boolean | آیا صندوق استtrue اگر دارایی پایه صندوق (ETF) باشد، در غیر این صورت false |
ua.volumeAvg | number | میانگین حجم پایهمیانگین حجم معاملات روزانه سهم پایه |
ua.buyFee | number | کارمزد خرید پایهنرخ کارمزد خرید دارایی پایه بر اساس بازار و نوع |
ua.sellFee | number | کارمزد فروش پایهنرخ کارمزد فروش دارایی پایه بر اساس بازار و نوع |
برای قیمت و حجم روز، از ua.ti استفاده کنید؛ فیلدهای hv، ivRank، ivPercentile و isEtf مستقیماً روی آبجکت پایه هستند.
ترکیب فیلدهای ua و ua.ti در یک خروجی HTML: نماد پایه، آخرین قیمت معامله و نوسان تاریخی (HV) با رنگ شرطی.
if (!ua.ti.lastPrice) return '';
let hvPct = roundNumber(ua.hv * 100, 1);
return style(ua.namad, '#2563eb', '', 'نماد پایه') +
' | ' +
style(commaSeparator(ua.ti.lastPrice), '', '', 'آخرین') +
' | ' +
style(hvPct + '%', ua.hv >= 0.4 ? '#dc2626' : '#16a34a', '', 'HV');فیلدهای ua.ivRank و ua.ivPercentile فقط روی نماد پایه تعریف شدهاند؛ برای دیدن «ارزان/گران بودن» نوسان پایه نسبت به یک سال گذشته. اگر null باشد تاریخچه کافی نیست.
if (ua.ivRank == null) return '';
return style(
'IVR ' + roundNumber(ua.ivRank, 0),
ua.ivRank >= 70 ? '#dc2626' : ua.ivRank <= 30 ? '#16a34a' : '#6b7280',
'',
'IV Rank: ' + roundNumber(ua.ivRank, 0) + ' | IV Percentile: ' + roundNumber(ua.ivPercentile, 0)
);مقایسه قیمت اختیار (ti قرارداد) با آخرین قیمت پایه (ua.ti) — پایهای برای کاورکال و بازده نسبی.
let premium = option.ti.lastPrice;
let base = ua.ti.lastPrice;
if (!premium || !base) return '';
let pct = roundNumber((premium / base) * 100, 2);
return style(pct + '%', '#ea580c', '', 'پریمیوم ÷ پایه');فیلتر روی ua.ivRank — مثلاً نمادهایی که نوسان ضمنیشان نسبت به یک سال گذشته در رتبه بالاست (≥ ۵۰).
return ua.ivRank != null && ua.ivRank >= 50;فیلتر روی ua.ivPercentile — مثلاً نمادهایی که WIV امروز پایینتر از اکثر روزهای سال گذشته است.
return ua.ivPercentile != null && ua.ivPercentile <= 30;فیلتر ساده روی ua.isEtf — مثلاً برای زنجیرههای صندوقی.
ua.isEtfترکیب حجم و ارزش معاملات پایه (ua.ti) با میانگین حجم تاریخی (ua.volumeAvg).
return ua.ti.volume > 0
&& ua.ti.tValue > 50000000000
&& ua.volumeAvg > 0
&& ua.ti.volume >= ua.volumeAvg * 0.4;HV بالا + آخرین قیمت پایه داخل دامنه مجاز روز — مناسب استراتژیهای وابسته به نوسان.
return ua.hv >= 0.3
&& ua.ti.lastPrice >= ua.ti.dailyPriceLow
&& ua.ti.lastPrice <= ua.ti.dailyPriceHigh
&& ua.ti.volume > 0;مشترک بین option.ti و ua.ti — قیمت، حجم، دفتر سفارش (۵ سطح) و آمار حقیقی/حقوقی.
| فیلد | نوع | توضیح و جزئیات |
|---|---|---|
option.ti.lastPrice | number | آخرین قیمتآخرین قیمت معاملهشده |
option.ti.lastPC | number | تغییر آخرین قیمت (%)درصد تغییر آخرین قیمت نسبت به دیروز |
option.ti.endPrice | number | قیمت پایانیقیمت پایانی (تعدیلشده) |
option.ti.endPC | number | تغییر قیمت پایانی (%)درصد تغییر قیمت پایانی |
option.ti.volume | number | حجمحجم معاملات امروز |
option.ti.tValue | number | ارزش معاملاتارزش ریالی کل معاملات امروز |
option.ti.lastDayVolume | number | حجم روز قبلحجم معاملات روز معاملاتی قبل |
option.ti.lastDayTValue | number | ارزش معاملات روز قبلارزش ریالی معاملات روز معاملاتی قبل |
option.ti.transactions | number | تعداد معاملاتتعداد دفعات معامله امروز |
option.ti.min | number | کمترین قیمتکمترین قیمت معاملهشده امروز |
option.ti.max | number | بیشترین قیمتبیشترین قیمت معاملهشده امروز |
option.ti.dailyPriceLow | number | حد پایین دامنه نوسانپایینترین حد مجاز قیمت روزانه |
option.ti.dailyPriceHigh | number | حد بالای دامنه نوسانبالاترین حد مجاز قیمت روزانه |
option.ti.buy1Price | number | قیمت خرید ۱بهترین قیمت خرید (ردیف اول تقاضا) |
option.ti.buy2Price | number | قیمت خرید ۲دومین قیمت خرید |
option.ti.buy3Price | number | قیمت خرید ۳سومین قیمت خرید |
option.ti.buy4Price | number | قیمت خرید ۴چهارمین قیمت خرید |
option.ti.buy5Price | number | قیمت خرید ۵پنجمین قیمت خرید |
option.ti.buy1Volume | number | حجم خرید ۱حجم بهترین سفارش خرید |
option.ti.buy2Volume | number | حجم خرید ۲حجم دومین سفارش خرید |
option.ti.buy3Volume | number | حجم خرید ۳حجم سومین سفارش خرید |
option.ti.buy4Volume | number | حجم خرید ۴حجم چهارمین سفارش خرید |
option.ti.buy5Volume | number | حجم خرید ۵حجم پنجمین سفارش خرید |
option.ti.sell1Price | number | قیمت فروش ۱بهترین قیمت فروش (ردیف اول عرضه) |
option.ti.sell2Price | number | قیمت فروش ۲دومین قیمت فروش |
option.ti.sell3Price | number | قیمت فروش ۳سومین قیمت فروش |
option.ti.sell4Price | number | قیمت فروش ۴چهارمین قیمت فروش |
option.ti.sell5Price | number | قیمت فروش ۵پنجمین قیمت فروش |
option.ti.sell1Volume | number | حجم فروش ۱حجم بهترین سفارش فروش |
option.ti.sell2Volume | number | حجم فروش ۲حجم دومین سفارش فروش |
option.ti.sell3Volume | number | حجم فروش ۳حجم سومین سفارش فروش |
option.ti.sell4Volume | number | حجم فروش ۴حجم چهارمین سفارش فروش |
option.ti.sell5Volume | number | حجم فروش ۵حجم پنجمین سفارش فروش |
option.ti.realBuyCount | number | تعداد خریدار حقیقیتعداد معاملات خرید حقیقی امروز |
option.ti.coBuyCount | number | تعداد خریدار حقوقیتعداد معاملات خرید حقوقی امروز |
option.ti.realSellCount | number | تعداد فروشنده حقیقیتعداد معاملات فروش حقیقی امروز |
option.ti.coSellCount | number | تعداد فروشنده حقوقیتعداد معاملات فروش حقوقی امروز |
option.ti.realBuyVolume | number | حجم خرید حقیقیحجم خرید حقیقیها امروز |
option.ti.coBuyVolume | number | حجم خرید حقوقیحجم خرید حقوقیها امروز |
option.ti.realSellVolume | number | حجم فروش حقیقیحجم فروش حقیقیها امروز |
option.ti.coSellVolume | number | حجم فروش حقوقیحجم فروش حقوقیها امروز |
همان فیلدها برای ua.ti هم معتبر است — مثلاً مقایسه تغییر درصدی اختیار و پایه با option.ti.lastPC و ua.ti.lastPC.
سه فیلد ti پرکاربرد در دفتر سفارش: buy1Price، sell1Price و اسپرد محاسباتی با askBidSpread.
if (!option.ti.buy1Price || !option.ti.sell1Price) return '';
return style(commaSeparator(option.ti.buy1Price), '#16a34a', '', 'تقاضا') +
' | ' +
style(commaSeparator(option.ti.sell1Price), '#dc2626', '', 'عرضه') +
' | ' +
style(askBidSpread() + '%', askBidSpread() > 25 ? '#ea580c' : '#6b7280', '', 'اسپرد');حجم خالص خرید/فروش حقیقی و حقوقی را کنار هم ببینید — برای تشخیص ورود پول حقیقی یا حقوقی.
if (!option.ti.volume) return '';
let netReal = option.ti.realBuyVolume - option.ti.realSellVolume;
let netCo = option.ti.coBuyVolume - option.ti.coSellVolume;
return style('حقیقی ' + rnwc(netReal), netReal > 0 ? '#16a34a' : '#dc2626', '', 'خالص حجم حقیقی') +
' | ' +
style('حقوقی ' + rnwc(netCo), netCo > 0 ? '#2563eb' : '#ea580c', '', 'خالص حجم حقوقی');lastPC روی option.ti و ua.ti — مقایسه جهت حرکت قرارداد و نماد پایه در یک ستون.
if (option.ti.lastPC == null || ua.ti.lastPC == null) return '';
return style(
roundNumber(option.ti.lastPC, 1) + '%',
option.ti.lastPC >= 0 ? '#16a34a' : '#dc2626',
'',
'تغییر اختیار'
) + ' | ' + style(
roundNumber(ua.ti.lastPC, 1) + '%',
ua.ti.lastPC >= 0 ? '#16a34a' : '#dc2626',
'',
'تغییر پایه'
);جمع حجم buy1–3 و sell1–3 برای نسبت تقاضا به عرضه در عمق نزدیک.
let bid = option.ti.buy1Volume + option.ti.buy2Volume + option.ti.buy3Volume;
let ask = option.ti.sell1Volume + option.ti.sell2Volume + option.ti.sell3Volume;
if (!bid && !ask) return '';
let ratio = roundNumber(bid / (ask || 1), 2);
return style('تقاضا/عرضه ' + ratio, ratio > 1.2 ? '#16a34a' : ratio < 0.8 ? '#dc2626' : '#6b7280', '', 'حجم ۳ سطح اول');حجم معاملات، وجود سرخط و اسپرد معقول — الگوی رایج قبل از هر استراتژی معاملاتی.
return option.ti.volume > 0
&& option.ti.buy1Price > 0
&& option.ti.sell1Price > 0
&& askBidSpread() <= 25;حجم خرید حقیقی از فروش حقیقی جلوتر است و در سرخط تقاضا سفارش فعال وجود دارد.
return option.ti.volume > 0
&& option.ti.realBuyVolume > option.ti.realSellVolume * 1.5
&& option.ti.buy1Count > 0;هر دو ti (قرارداد و پایه) امروز مثبتاند و ارزش معاملات اختیار از حداقل برابر است.
return option.ti.lastPC > 0
&& ua.ti.lastPC > 0
&& option.ti.tValue > 1000000000;وقتی حجم/ارزش معاملات امروز نسبت به روز معاملاتی قبل رشد معنادار داشته باشد، نمادهای فعالتر جدا میشوند.
return option.ti.lastDayVolume != null
&& option.ti.lastDayTValue != null
&& option.ti.lastDayVolume > 0
&& option.ti.lastDayTValue > 0
&& option.ti.volume >= option.ti.lastDayVolume * 1.5
&& option.ti.tValue >= option.ti.lastDayTValue * 1.5;برای دسترسی به قراردادها یا پایههایی که در سطر جاری نیستند، از این توابع استفاده کنید.
مجموعهای از توابع آماده که در همه ستونها و فیلترها در دسترساند و بیشتر محاسبات رایج بازار اختیار — از ارزش ذاتی و اهرم تا قالببندی عدد و رنگبندی خروجی ستون — را بدون کدنویسی از صفر پوشش میدهند. توابع بر اساس کاربرد دستهبندی شدهاند؛ روی هر تابع کلیک کنید تا توضیح، پارامترها و مثالهای آن را ببینید.
ارزش ذاتی/زمانی، سر به سر، اهرم، وضعیت ITM/ATM/OTM، احتمال سود و قیمت مرجع
تبدیل سود دورهای به بازده ماهانه و بازده موثر سالانه
گرد کردن، جداکننده هزارگان، خلاصه K/M/B و تبدیل عدد به حروف فارسی
رنگبندی HTML، لینک جزئیات، نمودار قیمت و چیدمان چند خروجی در یک ستون
با pos.Add پوزیشنها را تعریف کنید و با pos.Build یک دکمه نمودار سود/زیان و ساخت استراتژی در ستون ظاهر میشود. با کلیک روی آن نمودار P&L در پنل استراتژی باز میشود.
pos.Add(position, namad, count?, price?, cashBlock?)| پارامتر | کاربرد | مقدارها | اجباری |
|---|---|---|---|
| position | نوع موقعیت معاملاتی | 'buy' برای خرید، 'sell' برای فروش | بله |
| namad | نماد معاملاتی | option.namad، ua.namad یا نام نماد بهصورت مستقیم | بله |
| count | تعداد قرارداد یا دارایی پایه | عدد صحیح؛ پیشفرض ۱ | خیر |
| price | قیمت معامله | 'buy'، 'sell'، 'last'، 'end' یا عدد ثابت | خیر |
| cashBlock | بلوکه شدن وجه تضمین برای موقعیت فروش | true، false یا عدد دلخواه؛ برای sell پیشفرض true است | خیر |
pos.Build(name, tradingFee?, exerciseFee?)| پارامتر | کاربرد | مقدارها | اجباری |
|---|---|---|---|
| name | نام نمودار سود/زیان و ساخت استراتژی | متن دلخواه؛ اگر خالی باشد نام پیشفرض نمایش داده میشود | خیر |
| tradingFee | محاسبه کارمزد معاملات | true یا false | خیر |
| exerciseFee | نحوه محاسبه کارمزد اعمال | 'not'، 'all' یا 'itm-only' | خیر |
pos.Add('buy', ua.namad);
pos.Add('sell', option.namad, 1, 'buy');
return pos.Build('کاور بلوکه ' + option.namad);let next = optionSE(1);
if (!next) return '';
pos.Add('buy', option.namad, 1, 'sell');
pos.Add('sell', next.namad, 1, 'buy');
return pos.Build('Bull Call Spread');آیتمهایی که با نوع «تابع» ذخیره میشوند، مثل ستون و فیلتر ذخیره میشوند اما در جدول نمایش داده نمیشوند. موتور فرمول آنها را قبل از اجرای همه ستونها و فیلترها داخل scope همان worker تزریق میکند؛ بنابراین میتوانید محاسبات تکراری را یکبار تعریف کنید و در چند فرمول استفاده کنید.
تابع عمومی باید با function تعریف شود و خودش مقدار را با return برگرداند.
function myFunction(a, b) {
return a * b;
}myFunction(4, 3)مثل راهنمای قدیم، میتوانید یک تابع برای اختلاف قیمت تئوری و قیمت عرضه تعریف کنید، سپس همان تابع را هم در ستون و هم در فیلتر استفاده کنید.
function bsDiff() {
return calcRateChange(calcBS().bs, option.ti.sell1Price, 1);
}style(bsDiff() + '%', Math.abs(bsDiff()) <= 10 ? 'green' : 'red')bsDiff() >= -10 && bsDiff() <= 10تابع calcBS قیمت تئوری بلکشولز و یونانیهای قرارداد را محاسبه میکند. خروجی شامل bs, delta, gamma, vega, theta, rho و iv است. بدون آرگومان برای قرارداد جاری اجرا میشود، با نام قرارداد روی همان قرارداد محاسبه میکند، و برای سناریوهای دلخواه آبجکت overrides میگیرد.
نکته کاربردی: اگر فقط به دنبال «دلتا» یا «IV» قرارداد هستید، سادهترین راه استفاده از calcBS().delta یا calcBS().iv است.
| Syntax | توضیح | مثال کوتاه |
|---|---|---|
| calcBS() | محاسبه بلکشولز برای قرارداد جاری همان ردیف جدول. | calcBS().delta |
| calcBS(namad) | محاسبه برای یک قرارداد مشخص؛ نام قرارداد میتواند ثابت یا خروجی توابعی مثل optionSE باشد. | calcBS(next.namad).iv |
| calcBS(overrides) | محاسبه با مقادیر دلخواه و تغییر یک یا چند پارامتر. پارامترهای مشخصنشده از قرارداد جاری گرفته میشوند. | calcBS({ days: 10 }).bs |
خروجی همیشه یک آبجکت است و میتوانید فیلدهای آن را مستقیم بخوانید:
نام فیلدهای overrides با camelCase نوشته میشوند:
let bg = calcBS({
type: 'call', // 'call' یا 'put'
uaPrice: 100, // قیمت دارایی پایه
strike: 105, // قیمت اعمال
days: 30, // روز تا سررسید
riskFree: 0.3, // نرخ بدون ریسک: 0.3 یعنی ۳۰٪
volatility: 0.3, // نوسانپذیری: 0.3 یعنی ۳۰٪
premium: 40 // قیمت اختیار برای محاسبه IV
});
return bg.bs;تابع را بدون ورودی صدا بزنید؛ خروجی را در متغیر bg بگیرید و فیلدهای bs، delta و iv را نمایش دهید.
let bg = calcBS();
return 'BS: ' + bg.bs +
' | Delta: ' + bg.delta +
' | IV: ' + bg.iv;نام قرارداد را به calcBS بدهید تا محاسبه روی آن انجام شود، نه روی سطر جاری.
let bg = calcBS('ضخود9015');
return 'Vega: ' + bg.vega + ' | Theta: ' + bg.theta;قرارداد استرایک بالاتر را با optionSE پیدا کنید، سپس calcBS روی نام آن.
let next = optionSE(1);
if (!next) return null;
let bg = calcBS(next.namad);
return 'IV: ' + bg.iv + ' | BS: ' + bg.bs;فقط uaPrice را override کنید؛ بقیه پارامترها از قرارداد جاری.
let bg = calcBS({ uaPrice: ua.ti.dailyPriceHigh });
return bg.bs;premium را از سرخط خرید بگیرید و در فیلتر شرط بگذارید.
let bg = calcBS({ premium: option.ti.buy1Price });
return bg.delta >= 0.4 && bg.delta <= 0.6 && bg.iv >= 0.5;همه پارامترها را خودتان میدهید — برای سناریو و تست فرضی.
let bg = calcBS({
type: 'call',
uaPrice: 100,
strike: 105,
days: 30,
riskFree: 0.3,
volatility: 0.3,
premium: 40
});
return bg.bs;از let برای ذخیره مقادیر میانی استفاده کنید.
let debit = option.ti.sell1Price - optionSE(1).ti.buy1Price;
return commaSeparator(debit);برای منطق چندشاخهای.
let iv = calcBS().iv;
if (iv > 0.8) return style('خیلی بالا', 'red');
else if (iv > 0.5) return style('بالا', 'orange');
else if (iv > 0.3) return style('متوسط', 'blue');
else return style('کم', '#888');برای انتخاب بین دو مقدار — مناسب برای فرمول تکخطی.
option.type == 'call' ? style('Call', 'blue') : style('Put', 'orange')از backtick و ${'{expr}'} برای ترکیب متن ثابت با مقدار محاسباتی استفاده کنید.
`اسپرد: ${askBidSpread()}% | اهرم: ${roundNumber(leverage(),1)}x`بسیاری از فیلدها میتوانند null یا 0 باشند؛ قبل از محاسبه بررسی کنید.
if (!option.ti.lastPrice) return '';
return option.ti.lastPrice * option.size;(option.iv ?? 0) * 100 + '%'Math| تابع | توضیح و مثال خروجی |
|---|---|
| Math.abs(x) | قدر مطلق (مثبت کردن عدد) ← Math.abs(-5) برابر 5 |
| Math.round(x) | گرد کردن به نزدیکترین عدد صحیح ← Math.round(4.7) برابر 5 |
| Math.floor(x) | گرد کردن به پایین ← Math.floor(4.9) برابر 4 |
| Math.ceil(x) | گرد کردن به بالا ← Math.ceil(4.1) برابر 5 |
| Math.max(a, b, ...) | پیدا کردن بزرگترین عدد بین ورودیها |
| Math.min(a, b, ...) | پیدا کردن کوچکترین عدد بین ورودیها |
| Math.pow(x, y) | توان (x به توان y) ← Math.pow(2, 3) برابر 8 |
| Math.sqrt(x) | جذر (ریشه دوم) ← Math.sqrt(16) برابر 4 |
تعداد رقم اعشار را تنظیم میکند — خروجی رشته است.
let n = 3.14159;
return n.toFixed(2); // '3.14'وقتی بر اساس یک مقدار ثابت چند خروجی مختلف دارید، خواناتر از ifهای پشتسرهم است.
switch (option.state) {
case 'ITM':
return style('در سود', 'green');
case 'ATM':
return style('سر به سر', 'orange');
default:
return style('خارج از سود', 'red');
}در فیلتر، فقط سطرهایی که حاصل عبارت true است نمایش داده میشوند. در ستون میتوانند در شرطها استفاده شوند.
| عملگر | معنی | مثال |
|---|---|---|
| == | مساوی | مقایسه مقدار دو عبارت (نه type) option.namad == 'ضخود2018' |
| != | نامساوی | نابرابری مقدار ua.namad != 'خودرو' |
| > | بزرگتر | مقایسه عددی option.openInterest > 0 |
| >= | بزرگتر یا مساوی | حداقل مقدار leverage() >= 4 |
| < | کوچکتر | کمتر از مقدار option.daysUntilMaturity < 30 |
| <= | کوچکتر یا مساوی | حداکثر مقدار option.daysUntilMaturity <= 7 |
| && | و منطقی | هر دو شرط باید برقرار باشند ua.namad == 'خساپا' && option.strike < 2000 |
| || | یا منطقی | حداقل یک شرط برقرار باشد ua.namad == 'خساپا' || ua.namad == 'خودرو' |
| ! | نفی منطقی | برعکسکردن شرط !option.ti.volume |
نکته مهم: == vs ===
از == (دو مساوی) برای مقایسه مقدار استفاده کنید. از === (سه مساوی) وقتی type هم مهم است. در اکثر موارد == کافی است.
فرمولهای آمادهای که میتوانید مستقیماً استفاده کنید یا بر اساس آنها فرمول خودتان را بسازید.
درصد فاصله قیمت سر به سر از قیمت پایه.
calcRateChange(ua.ti.lastPrice, breakeven()) + '%'ارزش ذاتی: سبز اگر ITM، خاکستری اگر OTM.
style(roundNumber(intrinsic(), 0), intrinsic() > 0 ? 'green' : '#999')دلتا با رنگبندی بر اساس مقدار.
let d = calcBS().delta;
return style(d, d > 0.5 ? '#16a34a' : d > 0.3 ? '#ea580c' : '#dc2626', '', 'delta');بازده سالانه فروش call بدون پوشش (کاورکال).
let premium = option.ti.buy1Price;
let base = ua.ti.lastPrice;
if (!premium || !base) return '';
let pct = (premium / base) * 100;
return roundNumber(ytmProfit(pct, option.daysUntilMaturity), 1) + '%';هزینه خرید اسپرد صعودی: خرید call جاری + فروش call یک استرایک بالاتر.
let nextCall = optionSE(1);
if (!nextCall) return '';
let debit = option.ti.sell1Price - nextCall.ti.buy1Price;
let maxProfit = (nextCall.strike - option.strike) - debit;
return style(commaSeparator(debit), 'orange', '', 'هزینه') + ' | ' +
style(commaSeparator(maxProfit), 'green', '', 'حداکثر سود');اختلاف نوسانپذیری ضمنی (IV) و تاریخی (HV) به درصد.
let iv = calcBS().iv;
let hv = ua.hv;
if (!iv || !hv) return '';
let diff = roundNumber((iv - hv) * 100, 1);
return style(diff + '%', diff > 0 ? 'red' : 'green', '', 'IV − HV');برای هر call، لینک put هماسترایک نمایش دهد.
let opp = optionSE(0, 'os');
return opp ? showDetail(opp.namad, 'put') : '';قراردادهایی که حجم دارند و اسپرد معقول دارند.
option.ti.volume > 0 && askBidSpread() <= 30قراردادهای ITM با اهرم بالای ۴.
option.state == "ITM" && leverage() >= 4قراردادهای ۷ تا ۳۰ روزه با حجم.
option.daysUntilMaturity >= 7 && option.daysUntilMaturity <= 30 && option.ti.volume > 0احتمال سود بالای ۶۰٪ بر اساس IV.
let iv = calcBS().iv;
if (!iv) return false;
return probOfProfit(breakeven(), ua.ti.lastPrice, iv, option.daysUntilMaturity) >= 60;این بخش چند نمونه آماده برای ستون، فیلتر، تابع و استراتژی دارد. در فرمولهای چندخطی از return استفاده کنید و برای دادههای اختیاری null-check بگذارید.
اگر فرمولی با نامهای قبلی وارد کردهاید، معادل فعلی بیشتر فیلدها با camelCase نوشته میشود؛ برای مثال Option.TI.Buy_1_Price به option.ti.buy1Price تبدیل میشود.
قوانین تبدیل: حروف بزرگ → کوچک، underscore → حذف + حرف بعدی بزرگ.
| نام قبلی | نام فعلی | یادداشت |
|---|---|---|
| Option | option | آبجکت قرارداد سطر جاری |
| UA | ua | آبجکت نماد پایه سطر جاری |
| Option.TI.LastPrice | option.ti.lastPrice | — |
| UA.TI.LastPrice | ua.ti.lastPrice | — |
| Option.TI.Buy_1_Price | option.ti.buy1Price | — |
| Option.TI.Sell_1_Price | option.ti.sell1Price | — |
| Option.TI.Buy_1_Count | option.ti.buy1Count | — |
| Option.TI.Sell_1_Count | option.ti.sell1Count | — |
| Option.TI.Real_Buy_Count | option.ti.realBuyCount | — |
| Option.TI.Co_Buy_Count | option.ti.coBuyCount | — |
| Option.TI.daily_price_low | option.ti.dailyPriceLow | — |
| Option.TI.TValue | option.ti.tValue | — |
| Option.TI.Volume | option.ti.volume | — |
| Option.TI.LastDayVolume | option.ti.lastDayVolume | — |
| Option.TI.LastDayTValue | option.ti.lastDayTValue | — |
| Option.TI.Min | option.ti.min | — |
| Option.TI.Max | option.ti.max | — |
| Option.DaysUntilMaturity | option.daysUntilMaturity | — |
| Option.OpenInterest | option.openInterest | — |
| Option.BlackSholesHV | option.blackSholesHV | — |
| GetOption(namad) | getOptionByNamad(namad) | — |
| GetUA(namad) | getUaByNamad(namad) | — |
| OptionSE(n, type?) | optionSE(n, type?) | — |
| OptionSU(namad, type?) | optionSU(namad, type?) | — |
| CalcLeverage() | leverage() | — |
| intrinsictValue() | intrinsic() | — |
| CalcBG(namad?) → delta/... | calcBS(namad?) → delta/... | آبجکت یونانیها |
| CommaSeparator(x) | commaSeparator(x) | — |
| ShowDetail(x) | showDetail(x) | — |
| CalcRateChange(a,b) | calcRateChange(a,b) | — |
| MP(profit, days) | monthlyProfit(profit, days) | — |
| YTM(r, t) | ytmProfit(r, t) | — |
| ScalePrice(ti, scale?) | basePrice(option) | امضای قبلی deprecated است؛ ScalePrice/scalePrice برای legacy فعلاً کار میکند و بعداً حذف میشود. |
| scalePrice(option.ti) | basePrice(option) | موقع ذخیره خودکار تبدیل میشود؛ برای ua هم بنویسید basePrice(ua). |
| copyToCB(text) | copyToClipboard(value) | خروجی قابل کپی با کلیک |
| ColorRange(val, ranges) | colorRange(val, ranges) | رنگبندی بازهای عدد با تگ span |
| NamadNo(namad) | namadNo(namad) | — |