// متغیرهای تنظیمات نمایش
let rewRiskShow = 1; // برای نمایش نسبت سود به ضرر (1: نمایش، 0: عدم نمایش)
let pointShow = 1; // برای نمایش نقاط فاصله بین نماد پایه و قیمتهای اعمال
// متغیرهای اصلی
let result = ''; // رشته خروجی نهایی
let index = 0; // شمارنده حلقه
// شرطهای فیلتر کردن از ورودی کاربر
let condition1 = _var1 != '' ? _var1 : 10;
let condition2 = _var2 != "" ? _var2 : "";
let size = Option.Size;
// آرایه برای ذخیره موقعیتها
let positions = new Array();
// حلقه اصلی برای بررسی اختیارات
while (OptionSE(++index) != undefined) {
if (OptionSE(index).TI.Buy_1_Volume == 0 || Option.TI.Sell_1_Volume == 0 ||
OptionSE(index).TI.Buy_1_Price < 10)
continue;
let position = new Object();
position.debit = (Option.TI.Sell_1_Price - OptionSE(index).TI.Buy_1_Price) * Option.Size;
let profit = ((OptionSE(index).Strike - Option.Strike) * Option.Size) - position.debit;
position.mCapital = MP(((profit / position.debit) * 100), Option.DaysUntilMaturity);
position.BE = Option.Strike + (Option.TI.Sell_1_Price - OptionSE(index).TI.Buy_1_Price);
position.disBE = CalcRateChange(UA.TI.LastPrice, position.BE);
position.strike = OptionSE(index).Strike;
position.disStrike = CalcRateChange(UA.TI.LastPrice, position.strike);
position.strike1 = CalcRateChange(UA.TI.LastPrice, Option.Strike);
position.strike2 = CalcRateChange(UA.TI.LastPrice, position.strike);
position.namad = OptionSE(index).Namad;
position.namadNo = NamadNo(OptionSE(index).Namad);
position.maxProfit = profit/size;
position.maxLoss = position.debit/size;
position.rewRisk = Math.abs(profit/position.debit).toFixed(2);
let current = ((UA.TI.LastPrice - position.BE) / position.debit) * Option.Size;
position.mCurrent = MP(current * 100, Option.DaysUntilMaturity);
if (_var2 == 1) {
position.point1 = 0;
position.point2 = Option.Strike;
}
else if (_var2 == 2) {
position.point1 = Option.Strike;
position.point2 = position.BE;
}
else if (_var2 == 3) {
position.point1 = position.BE;
position.point2 = OptionSE(index).Strike;
}
else if (_var2 == 4) {
position.point1 = OptionSE(index).Strike;
position.point2 = UA.TI.LastPrice * 100;
position.mCurrent = position.mCapital;
}
else condition2 = ""
if (position.mCapital >= condition1 && Option.Type == 'call' &&
(condition2 == "" || (UA.TI.LastPrice >= position.point1 && UA.TI.LastPrice < position.point2)))
positions.push(position);
}
positions = SortObject(positions, "mCapital");
positions = positions.reverse();
positions.forEach(function(position, posIndex) {
let bgP2, bgP3, bgP4;
if (UA.TI.LastPrice < Option.Strike) {
bgP2 = '#f87878';
position.mCurrent = -100;
}
else if (UA.TI.LastPrice <= position.BE)
bgP2 = "#FFC0CB";
else if (UA.TI.LastPrice > position.BE && UA.TI.LastPrice < position.strike)
bgP3 = "#B0E0E6";
else if (UA.TI.LastPrice >= position.strike)
bgP4 = "#ADFF2F";
pos.Add('buy', Option.Namad, 1, 'sell');
pos.Add('sell', position.namad, 1, 'buy', false);
result += ShowDetail(position.namad, position.namadNo);
result += "[" + Style(position.maxProfit + " (" + position.mCapital + "%)", 'black', '', 'بیشترین سود', true) + " ~" +
Style(position.mCurrent + '%', position.mCurrent >= 0 ? 'green' : 'red', '', 'موقعیت کنونی') + " ~ " +
Style(position.maxLoss, 'red', '', 'بیشترین ضرر') + "]";
if (rewRiskShow)
result += Style(+position.rewRisk, 'blue', '', 'سود/ضرر');
if (pointShow)
result += "<span class='text-secondary' title='نقاط - درصد فاصله نماد پایه با اعمال اول سربه سری و اعمال دوم'> P%[" +
Style(position.strike1, '', bgP2, 'اعمال اول-قیمت%') + '<i class="bi bi-slash-lg text-danger"></i>' +
Style(position.disBE, '', bgP3, 'سر به سری-قیمت%') + '<i class="bi bi-dash-lg text-success"></i>' +
Style(position.strike2, '', bgP4, 'اعمال دوم-قیمت%') + "<span class='text-secondary'>]</span>";
result += pos.Build('اسپرد ' + Option.Namad);
if (posIndex == 0)
result = '<span style="display: none !important">{0}</span>'.format(position.mCapital) + result;
});
result;