اولین ستون
ستون محاسباتیبفهمی فرمول دقیقاً کجا و چند بار اجرا میشود.
کوتاهترین فرمول ممکن. option یعنی «قراردادی که همین حالا داریم رویش حساب میکنیم» و strike قیمت اعمال آن است. هر چیزی که return کنی، همان چیزی است که در سلول دیده میشود.
از «اصلاً نمیدانم ستون محاسباتی چیست» تا نوشتن ستون و فیلتر خودت — همینجا، بدون نصب چیزی و بدون ثبتنام.
این صفحه با بقیهٔ راهنماها یک فرق اساسی دارد: اینجا کد را واقعاً اجرا میکنی. یک بازار کوچک و ثابت داخل صفحه هست و همان موتوری که دیدهبان واقعی از آن استفاده میکند، فرمول تو را روی همان داده اجرا میکند و نتیجه را پایین همان درس نشان میدهد.
دیدهبان آپشنباز دهها ستون آماده دارد. فرمولنویسی برای وقتی است که ستونی که تو میخواهی جزو آنها نیست. یک تکه کد کوتاه مینویسی، و آپشنباز آن را برای هر قرارداد جداگانه اجرا میکند. هرچه کدت برگرداند، همان چیزی است که در سلول آن ردیف نوشته میشود.
همین یک جمله، هستهٔ همهچیز است: فرمول یک بار برای کل جدول اجرا نمیشود، بلکه یک بار برای هر ردیف. وقتی فرمول مینویسی، همیشه دربارهٔ «یک قرارداد» فکر کن — آپشنباز خودش آن را روی بقیه هم تکرار میکند.
فرمول دو کار میتواند بکند، و تفاوتشان فقط در چیزی است که برمیگردانی:
یک مقدار برمیگردانی — عدد، متن، یا حتی HTML رنگی. آپشنباز یک ستون تازه به جدول اضافه میکند و هر ردیف مقدار خودش را میگیرد. هیچ ردیفی حذف نمیشود.
return roundNumber(intrinsic(), 0);یک بله یا خیر برمیگردانی. هر قراردادی که `false` بگیرد از جدول کنار میرود. ستون تازهای ساخته نمیشود؛ فقط تعداد ردیفها کم میشود.
return option.daysUntilMaturity < 30;و نکتهای که خیلیها دیر میفهمند: لازم نیست بین این دو یکی را انتخاب کنی. یک فرمول میتواند همزمان هر دو باشد — هم عددی نشان بدهد و هم بر اساس همان عدد غربال کند. درس «از ستون به فیلتر» دقیقاً همین را یاد میدهد.
اینها محدودیتهای واقعیاند، نه «فعلاً پیاده نشده». دانستنشان از قبل، ساعتها وقت تلفشده را جلو میگیرد.
بکتست و تحلیل تاریخی
فرمول فقط عکسِ همین لحظهٔ بازار را میبیند. تنها نگاهش به گذشته lastDayPrice و lastDayVolume است، یعنی همین دیروز. تابع uaPriceRange() هم قیمت گذشته نیست — پیشبینی است که دامنهٔ نوسان امروز را تا سررسید جلو میبرد. برای «سه ماه پیش چه شد» جای دیگری باید بگردی.
سفارش گذاشتن و معامله
خروجی فرمول فقط چیزی است که در جدول میبینی یا ردیفی که غربال میشود. آپشنباز از روی فرمول تو خرید و فروش نمیکند.
هشدار و زمانبندی
فرمول وقتی اجرا میشود که تو جدول را باز کرده باشی. اگر میخواهی چیزی در غیاب تو چک شود و خبرت کند، آن کار آلارمِ میزکار است، نه فرمول.
سیگنال خرید و فروش
فرمول دقیقاً همان چیزی را حساب میکند که تو نوشتی — نه بیشتر. اگر منطقت اشتباه باشد، خروجی هم با همان اطمینان اشتباه خواهد بود.
قیمتگذاری هستون
یک استثنای فنی که وقتی پیشرفتهتر شدی به دردت میخورد: برخلاف بلکشولز که با calcBS() همیشه در دسترس است، option.heston عمداً برای فرمولنویسی باز نیست و فقط وقتی فیلتر سریع هستون فعال باشد محاسبه میشود. روی هیچ فرمولی به آن تکیه نکن.
یک نکتهٔ امنیتی که باید صادقانه گفته شود: فرمول واقعاً کد است و در مرورگر خودِ تو اجرا میشود. برای همین فرمولی را که از جای ناشناس کپی میکنی، مثل یک عدد ساده نبین — اول بخوانش و بفهم چه میکند. فرمولهای آمادهٔ خود آپشنباز و مثالهای همین صفحه از این بابت امناند.
از اینجا به بعد فقط خواندن نیست. هر درس یک کد قابل ویرایش دارد و یک دکمهٔ «اجرا». کد را عوض کن، دوباره اجرا کن، ببین چه میشود. هیچچیز ذخیره نمیشود و هیچچیز خراب نمیشود.
۳۲ قرارداد روی ۲ نماد پایه — ثابت و همیشه در دسترس.
این اعداد ساختگیاند و به بازار واقعی وصل نیستند، ولی الکی هم نیستند: پرمیومها با همان بلکشولزِ خودِ آپشنباز قیمتگذاری شدهاند و وضعیت ITM/ATM/OTM با همان طبقهبند برنامه حساب شده. پس هر چه اینجا یاد بگیری، روی دیدهبان واقعی هم همانطور کار میکند.
یاد میگیری فرمول کجا اجرا میشود، داده را از کجا بردارد و خروجی را چطور خوانا کند.
بفهمی فرمول دقیقاً کجا و چند بار اجرا میشود.
کوتاهترین فرمول ممکن. option یعنی «قراردادی که همین حالا داریم رویش حساب میکنیم» و strike قیمت اعمال آن است. هر چیزی که return کنی، همان چیزی است که در سلول دیده میشود.
بدانی هر عددی که لازم داری از کدام آبجکت میآید.
سه آبجکت در دسترس است و بس. option مشخصات خود قرارداد را دارد (قیمت اعمال، نوع، روز مانده). ua نماد پایه را دارد. و ti تابلوی معاملات است — هم option.ti (تابلوی خود قرارداد) و هم ua.ti (تابلوی نماد پایه). تقریباً هر فرمولی ترکیبی از همین سهتاست.
یک عدد بسازی که در جدول آماده وجود ندارد.
این «فاصله تا اعمال» است: نماد پایه چند درصد باید حرکت کند تا به قیمت اعمال برسد. عدد مثبت یعنی قیمت اعمال بالاتر از قیمت فعلی است، منفی یعنی پایینتر.
خروجی را مرتب کنی، بدون اینکه سورت ستون خراب شود.
roundNumber(value, decimals) یکی از دهها تابع آمادهٔ آپشنباز است. خروجی فرمول میتواند HTML باشد، پس میشود متن و برچسب هم اضافه کرد.
از «نمایش دادن» به «تصمیم گرفتن» میرسی: شرط، رنگ، و تبدیل همان کد به فیلتر.
فرمول بر اساس وضعیت قرارداد جواب متفاوت بدهد.
option.state وضعیت قرارداد نسبت به قیمت پایه است و خودِ آپشنباز حسابش کرده: ITM یعنی در سود، OTM یعنی بیسود، و ATM یعنی قیمت پایه تا ±۱٪ دور قیمت اعمال است. خودت دوباره حسابش نکن — این تنها تعریف معتبر در کل برنامه است.
ستون را طوری بسازی که با یک نگاه خوانده شود.
style(value, color, background, tooltip) خروجی را رنگی میکند و آرگومان چهارم تولتیپ میشود. تابع colorCondition(value, min, minColor, max, maxColor) هم هست که خودش بازهها را رنگ میکند — برای وقتی که شرطها فقط عددیاند.
با یک کد، هم ستون داشته باشی هم فیلتر.
این مهمترین الگوی فرمولنویسی آپشنباز است. آن دو خط اول متغیر معمولی نیستند: موتور موقع کامپایل عیناً همان دو عبارت را بازنویسی میکند و دو نسخه از فرمول میسازد — یکی بهعنوان ستون و یکی بهعنوان فیلتر. پس یک فایل، دو کار.
توابع آمادهٔ آپشنباز، نگاه به کل زنجیره، و چهار تلهای که همه یک بار توی آنها میافتند.
بهجای بازنویسی فرمولهای استاندارد، از تابع آماده استفاده کنی.
اینها را خودت ننویس. intrinsic() ارزش ذاتی، timeValue() ارزش زمانی، breakeven() نقطهٔ سربهسر و calcBS() کل بلکشولز (قیمت تئوری و همهٔ یونانیها) را میدهد. همهشان خودشان option و ua ردیف جاری را برمیدارند، پس آرگومان لازم ندارند.
از تکردیف بیرون بیایی و قرارداد را با همسررسیدهایش بسنجی.
فرمول برای هر ردیف جدا اجرا میشود، ولی حبس آن ردیف نیست. getOptionsByChain(نماد پایه، نوع، روز مانده) همهٔ همگروهها را میدهد. optionSE(n) هم هست که قرارداد nاُم بالاتر یا پایینتر از استرایک فعلی را برمیگرداند — پایهٔ هر فرمول اسپرد.
این ۴ مورد خطا نمیدهند. جدول پر میشود، همهچیز سالم به نظر میرسد، و جواب غلط است. هرکدام را در هر دو حالت اجرا کن و تفاوت را ببین.
نشانه: هیچ خطایی نمیگیری و ستون پر میشود — ولی همهٔ ردیفها یک جواب میدهند.
// iv اعشاری است (۰.۴۲ یعنی ۴۲٪)
// ivRank صدتایی است (۶۲ یعنی ۶۲)
return option.iv > ua.ivRank ? 'گران' : 'ارزان';option.iv، option.wiv و ua.hv اعشاریاند، ولی ua.ivRank و ua.ivPercentile روی مقیاس ۰ تا ۱۰۰ هستند. مقایسهٔ مستقیمشان یعنی خطای ۱۰۰ برابری، و چون هر دو عددند جاوااسکریپت اعتراضی نمیکند.
کد درست
return option.iv * 100 > ua.ivRank ? 'گران' : 'ارزان';نشانه: سلولها میشوند «⚠ return ندارد».
const distance = ((option.strike - ua.ti.lastPrice) / ua.ti.lastPrice) * 100;
roundNumber(distance, 1);فرمول تکخطی خودش نتیجه را برمیگرداند، ولی بهمحض اینکه بدنه چند دستور شد، باید صریحاً return بنویسی. این یکی حداقل سر و صدا میکند؛ سه تای دیگر نمیکنند.
کد درست
const distance = ((option.strike - ua.ti.lastPrice) / ua.ti.lastPrice) * 100;
return roundNumber(distance, 1);نشانه: نه خطا، نه هشدار — سلولها فقط خالی میمانند.
let option = 5;
return option.strike;موتور بدنهٔ فرمول را داخل اسکوپ خودش میپیچد، پس let option آبجکت واقعی را جایگزین نمیکند بلکه رویش سایه میاندازد. نتیجهاش سلول خالی است، نه پیام خطا؛ و چون هیچ نشانهای نمیبینی، دنبال اشتباه در جای اشتباه میگردی. اسم option، ua، context، position و strategy را برای متغیر خودت انتخاب نکن.
کد درست
let myNumber = 5;
return option.strike + myNumber;نشانه: بیشتر ردیفها درستاند، ولی چند تا Infinity یا NaN میشوند و سورت ستون را بیمعنی میکنند.
return roundNumber(option.ti.volume / option.ti.lastDayVolume, 1);lastDayVolume و lastDayTValue میتوانند null باشند — قراردادی که دیروز اصلاً معامله نشده. جاوااسکریپت null را صفر میگیرد، پس تقسیم میشود Infinity (اگر امروز معامله شده) یا NaN (اگر نشده). هر دو در جدول به چشم نمیآیند تا وقتی روی ستون سورت بگیری.
کد درست
const yesterday = option.ti.lastDayVolume;
if (!yesterday) return '—';
return roundNumber(option.ti.volume / yesterday, 1);هرچه دوست داری بنویس و روی همان دادهٔ بالا اجرا کن. هیچچیز ذخیره نمیشود و هیچچیز خراب نمیشود.
اینها فرمولهای واقعیاند، نه تمرین. هرکدام را میتوانی مستقیم در میز آزاد باز کنی و روی همان دادهٔ بالا اجرا کنی.
درصد فاصله قیمت سر به سر از قیمت پایه.
calcRateChange(ua.ti.lastPrice, breakeven()) + '%'ارزش ذاتی: سبز اگر ITM، خاکستری اگر OTM.
style(roundNumber(intrinsic(), 0), intrinsic() > 0 ? 'green' : '#999')درصد مجاز رشد و افت روزانه نماد پایه نسبت به قیمت پایانی دیروز — سقفش صف خرید و کفش صف فروش میسازد. uaDailyRange() مبنا (base)، کف و سقف مجاز (low / high) و همانها به درصد (downPct / upPct) را با هم برمیگرداند و اگر دامنهای منتشر نشده باشد null میدهد؛ برای همین اول باید بررسی شود. خروجی: درصد سقف (+) سبز و درصد کف (−) قرمز.
const r = uaDailyRange();
if (!r) return '';
return style(`+${r.upPct}%`, '#16a34a') + ' / ' + style(`-${r.downPct}%`, '#dc2626');دلتا با رنگبندی بر اساس مقدار.
let d = calcBS().delta;
return style(d, d > 0.5 ? '#16a34a' : d > 0.3 ? '#ea580c' : '#dc2626', '', 'delta');با uaPriceRange() بررسی میکند نماد پایه اصلاً فرصت دارد تا سررسید به قیمت اعمال برسد یا نه: high قیمتی است که با صف خرید پشت سر هم و low قیمتی که با صف فروش پشت سر هم قابل دسترس است. بدون آرگومان، روزهای معاملاتی مانده تا سررسید همان قرارداد را میگیرد (دامنه نوسان در هر روز معاملاتی یک بار اعمال میشود، نه در هر روز تقویمی). قراردادهایی که پایهشان حتی در بهترین حالت به استرایک نمیرسد کنار گذاشته میشوند.
const r = uaPriceRange();
if (!r) return false;
return option.type == 'call'
? option.strike <= r.high
: option.strike >= r.low;مرجع کامل: هر فیلد option، ua و ti، همهٔ توابع آماده، عملگرها و مثالهای مرجع. وقتی بلدی چه میخواهی و فقط دنبال اسم دقیقش میگردی، اینجاست.
متغیر، شرط، حلقه و تابع — پایههای جاوااسکریپتی که فرمول با آن نوشته میشود، از صفر و با مثال. اگر خود کدنویسی برایت تازه است، از این شروع کن.
خواندن مقاله ←فهرست کامل ستونها و فیلترهای آمادهای که بدون نوشتن حتی یک خط کد میتوانی روی دیدهبانت نصب کنی — با شرح تنظیمات هرکدام.
دیدن فهرست ←۲۸ مقالهٔ دانشنامه دربارهٔ فرمولنویسی: پیادهسازی کاورد کال، انواع اسپرد، باترفلای، بلکشولز و یونانیها، فیلترهای ترکیبی و بیشتر.
دستهٔ فرمولنویسی ←حالا روی بازار واقعی امتحانش کن
همان کدی که اینجا نوشتی، در دیدهبان روی قراردادهای واقعی و قیمتهای زنده کار میکند.
هنوز نظری ثبت نشده است.