این فرمول حداکثر سود و زیان قرارداد ( به همراه جزییات دیگر ) با قراردادهای زنجیره و با قیمت اعمال کمتر از خودش را نشان میدهد
در این فرمول فقط قراردادها با سود ماهیانه بیشتر از 5 یا (var1) درصد نمایش داده شده اند که میتوانید آن را تغییر دهید .
قراردادهای موجود در ستون (نماد) قراردادهایی هستند که خریداری میشوند و قراردادهای موجود در ستون ایجاد شده (اسپرد نزولی) قراردادهایی هستند که باید فروخته شوند
امکان مرتب سازی بر اساس درصد سود ماهانه و نمایش جزییات به صورت انتخابی وجود دارد
- حداکثر سود
- حداکثر زیان
- درصد فاصله قیمت سهم از اعمال قرارداد کال فروخته شده(اعمال اول)
- درصد فاصله قیمت سهم از اعمال قرارداد کال خریداری شده(اعمال دوم)
- درصد فاصله قیمت سهم از سر به سری
- موقعیت کنونی (نمایانگر درصد سود یا زیان در صورتی که با قیمت های روی تابلو به اعمال برسد)
کد ستون اسپرد نزولی
کد ستون با جزییات کامل
// جهت نمایش اطلاعات نقاط فاصله نماد پایه با اعمال ها در خروجی 1 و عدم نمایش عدد 0
let pointShow = 1;
let result = '';
let index = 0;
// جهت فیلتر کردن خروجی
let condition1 = _var1 != '' ? _var1 : 5;
let condition2 = _var2 != "" ? _var2 : "";
let size = option.size;
let positions = new Array();
while (optionSE(--index) != undefined) {
// اگر حجم خریدار قرارداد صفر بود رد بشه
if (optionSE(index).ti.buy1Volume == 0 || option.ti.sell1Volume == 0 ||
optionSE(index).ti.buy1Price < 10)
continue;
let position = new Object();
// سرمایه درگیر
position.block = optionSE(index).requiredMargin + (option.ti.sell1Price * option.size);
position.debit = (option.ti.sell1Price - optionSE(index).ti.buy1Price) * option.size;
// حداکثر زیان
let loss = position.debit - ((optionSE(index).strike - option.strike) * option.size);
position.mLoss = monthlyProfit(((loss / position.block) * 100), option.daysUntilMaturity);
// حداکثر سود
let profit = (optionSE(index).ti.buy1Price - option.ti.sell1Price) * option.size;
position.mProfit = monthlyProfit(((profit / position.block) * 100), option.daysUntilMaturity);
// سربه سری
position.BE = (optionSE(index).ti.buy1Price - option.ti.sell1Price) + optionSE(index).strike;
// درصد اختلاف ها
position.disBE = calcRateChange(ua.ti.lastPrice, position.BE);
position.strike = optionSE(index).strike;
position.disStrike = calcRateChange(ua.ti.lastPrice, position.strike);
position.strike2 = calcRateChange(ua.ti.lastPrice, option.strike);
position.strike1 = calcRateChange(ua.ti.lastPrice, position.strike);
position.namad = optionSE(index).namad;
position.namadNo = namadNo(optionSE(index).namad);
position.maxLoss = loss / size;
position.maxProfit = profit / size;
let current = ((position.BE - ua.ti.lastPrice) / position.block) * option.size;
position.current = monthlyProfit(current * 100, option.daysUntilMaturity);
if (_var2 == 1) {
position.point1 = option.strike;
position.point2 = ua.ti.lastPrice * 100;
}
else if (_var2 == 2) {
position.point1 = position.BE;
position.point2 = option.strike;
}
else if (_var2 == 3) {
position.point1 = optionSE(index).strike;
position.point2 = position.BE;
}
else if (_var2 == 4) {
position.point1 = 0;
position.point2 = optionSE(index).strike;
position.current = position.mProfit;
}
else condition2 = ''
if (position.mProfit >= condition1 && option.type == 'call' &&
(condition2 == "" || (ua.ti.lastPrice >= position.point1 && ua.ti.lastPrice < position.point2)))
positions.push(position);
}
positions = SortObject(positions, "maxProfit");
positions = positions.reverse();
positions.forEach(function(position, posIndex) {
let bgP2, bgP3, bgP4;
// قیمت سهم کمتر اعمال کال فروخته شده باشه
if (ua.ti.lastPrice <= position.strike)
bgP2 = "#ADFF2F";
// قیمت سهم کمتر از سر به سری باشد
else if (ua.ti.lastPrice <= position.BE)
bgP3 = '#B0E0E6';
// قیمت سهم بین سربه سری و اعمال کال خریداری شده
else if (ua.ti.lastPrice >= position.BE && ua.ti.lastPrice < option.strike)
bgP3 = "#FFC0CB";
// قیمت سهم بیشتر از اعمال کال خریداری شده
else if (ua.ti.lastPrice >= option.strike) {
bgP4 = "red";
position.current = -100;
}
pos.add('buy', option.namad, 1, 'sell');
pos.add('sell', position.namad, 1, 'buy');
result += showDetail(position.namad, position.namadNo);
result += "[" + style(position.maxProfit + " (" + position.mProfit + "%)", 'black', '', 'بیشترین سود', true) + "~" +
style(position.current + '%', position.current >= 0 ? 'green' : 'brown', '', 'موقعیت کنونی') + "~" +
style(position.maxLoss + " (" + position.mLoss + "%)", 'red', '', 'بیشترین ضرر') + "]";
if (pointShow)
result += " P%[" +
style(position.strike1, '', bgP2, 'اعمال اول-قیمت%') + '<i class="mirror"></i>' +
style(position.disBE, '', bgP3, 'سر به سری-قیمت%') + '<i ></i>' +
style(position.strike2, '', bgP4, 'اعمال دوم-قیمت%') + "]";
result += pos.build('اسپرد ' + option.namad);
if (posIndex == 0)
result = ' '.format(position.mProfit) + result;
});
result;
این فیلتر قرادادهایی که سود ماهانه بالای 5 درصد دارند را نمایش میدهد.(میتوانید این عدد از طریق فیلد متغییر و تغییر عدد var1 در دیدهبان تغییر دهید)
محاسبه سود برای حالتی است که وجه تضمین بلوکه میشود
امکان فیلتر قراردادها بر اساس محدوده قیمتی سهم نسبت به اعمال ها و سر به سری با استفاده از فیلد var2 در دیدهبان وجود دارد
با قرار دادن عدد 1 در var2 قرارداد هایی را مشاهده می کنید که قیمت سهم کمتر از اعمال دوم ( قرارداد کال خریده شده) هستند
با قرار دادن عدد 2 در var2 قرارداد هایی را مشاهده می کنید که قیمت سهم بین اعمال دوم و سربه سری هستند
با قرار دادن عدد 3 در var2 قرارداد هایی را مشاهده می کنید که قیمت سهم ببین سر به سری و اعمال اول (قرارداد کال فروخته شده) هستند
با قرار دادن عدد 4 در var2 قرارداد هایی را مشاهده می کنید که قیمت سهم بیشتر از اعمال اول هستند
کد فیلتر
let result = false;
let index = 0;
let condition1 = _var1 != '' ? _var1 : 5;
let condition2 = _var2 != "" ? _var2 : "";
while (optionSE(--index) != undefined) {
if (optionSE(index).ti.buy1Volume == 0 || option.ti.sell1Volume == 0 ||
optionSE(index).ti.buy1Price < 10)
continue;
//سرمایه درگیر
let block = optionSE(index).requiredMargin + (option.ti.sell1Price * option.size);
//حداکثرسود
let profit = (optionSE(index).ti.buy1Price - option.ti.sell1Price) * option.size;
let mProfit = monthlyProfit(((profit / block) * 100), option.daysUntilMaturity);
// سربه سری
let BE = (optionSE(index).ti.buy1Price - option.ti.sell1Price) + optionSE(index).strike;
let point1, point2;
if (_var2 == 1) {
point1 = option.strike;
point2 = ua.ti.lastPrice * 100;
}
else if (_var2 == 2) {
point1 = BE;
point2 = option.strike;
}
else if (_var2 == 3) {
point1 = optionSE(index).strike;
point2 = BE;
}
else if (_var2 == 4) {
point1 = 0;
point2 = optionSE(index).strike;
}
else condition2 = '';
if (mProfit > condition1 &&
(condition2 == "" || (ua.ti.lastPrice >= point1 && ua.ti.lastPrice < point2)) &&
option.type == 'call') {
result = true;
break;
}
}
result;
توابع استفاده شده در کد
| نام تابع | توضیحات |
|---|---|
optionSE |
این تابع به شما اجازه میدهد به دادههای مختلف قراردادها دسترسی پیدا کنید. |
showDetail |
این تابع اطلاعات جزئیات مربوط به هر نماد را نمایش میدهد، شامل نام و شماره نماد، و سایر اطلاعات مرتبط. |
pos.build،pos.add |
این تابع برای رسم نمودارهای مرتبط با موقعیتهای معاملاتی استفاده میشود و به نمایش اطلاعات در یک نمودار کمک میکند. |
MP |
تابع MP برای محاسبه بازده ماهاننه استفاده میشود. |
calcRateChange |
این تابع برای محاسبه درصد تغییرات قیمت بین دو مقدار استفاده میشود و به تجزیه و تحلیل تحلیلی کمک میکند. |
NamadNo |
این تابع شماره مربوط به هر نماد خاص را برمیگرداند و به شناسایی کرات نمادها کمک میکند. |
Style |
این تابع برای تعیین استایل و فرمتدهی به رشتههای خروجی استفاده میشود و به زیبایی دادهها در خروجی کمک میکند. |
برای مشاهده توضیحات کاملتر به راهنمای فرمولنویسی مراجعه کنید.
در کدهای اماده فرمول های مربوط به ایجاد ستون و فیلتر استراتژی به صورت ویژوال در دسترس میباشد اموزش های موجود در صورت تمایل به تغییر و شخصی سازی فرمول ها کمک کننده می باشند
آموزش ویدیویی فرمولنویسی در این ویدیوها فرمولنویسی، ستون محاسباتی و فیلتر را با مثال معرفی کرده ایم
تمرین فرمولنویسی قدم به قدم فرمولنویسی رو تمرین کنید
صفحه مرجع فرمولنویسی راهنمای فرمولنویسی، ایجاد ستون محاسباتی و فیلتر در دیدهبان