У меня есть цепочка опций, которую я хотел бы подмножить на основе базовой цены. Точнее, я хочу получить звонки & с ценами на забастовку чуть ниже, чуть выше базовой цены и чуть выше базовой цены, а также пары каждого старта и звонка с тем же ударом.Использование LINQ для выбора поднабора опционных цепей
Вот голые данные опции в формате JSON:
{
"underlying_price": 130.96001,
"puts": [
{
"cid": "901428591898527",
"strike": "125.00",
"expiry": "Sep 18, 2015"
},
{
"cid": "990945460064288",
"strike": "130.00",
"expiry": "Sep 18, 2015"
},
{
"cid": "119741665156957",
"strike": "135.00",
"expiry": "Sep 18, 2015"
},
{
"cid": "712197852541730",
"strike": "140.00",
"expiry": "Sep 18, 2015"
},
{
"cid": "193052493845513",
"strike": "145.00",
"expiry": "Sep 18, 2015"
},
{
"cid": "30896117048646",
"strike": "150.00",
"expiry": "Sep 18, 2015"
}
],
"calls": [
{
"cid": "1103304608596226",
"strike": "125.00",
"expiry": "Sep 18, 2015"
},
{
"cid": "28683704337826",
"strike": "130.00",
"expiry": "Sep 18, 2015"
},
{
"cid": "293690467884457",
"strike": "135.00",
"expiry": "Sep 18, 2015"
},
{
"cid": "791049407206135",
"strike": "140.00",
"expiry": "Sep 18, 2015"
},
{
"cid": "932015841628223",
"strike": "145.00",
"expiry": "Sep 18, 2015"
},
{
"cid": "501320075715761",
"strike": "150.00",
"expiry": "Sep 18, 2015"
}
]
}
Это был преобразован в объект класса OptionData:
public class OptionData
{
public Option[] puts { get; set; }
public Option[] calls { get; set; }
public string underlying_price { get; set; }
}
public class Option
{
public string cid { get; set; }
public string strike { get; set; }
public string expiry { get; set; }
}
public class OptionPair
{
public decimal Strike { get; set; }
public DateTime Expiry { get; set; }
public Option Call { get; set; }
public Option Put { get; set; }
}
Как и в этом примере, лежащий в основе цена составляет около $ 130, поэтому я хотел бы извлечь puts & звонки ударов ($ 125, $ 130 & $ 135) программно без kn из-за приращения (в этом случае 5 долларов США, оно может меняться в других опционных цепочках).
Поэтому у меня есть два вопроса:
Как я могу сделать выше, с помощью LINQ или Select расширения? (может рассмотреть использование Last, First, Skip, Take, Join и т. д.)
Как я могу связать каждый поместить & вызов (тот же удар) в качестве объекта OptionPair (предпочитаете использовать синтаксис LINQ)?
Есть идеи? Благодарю.
EDIT
Вот код, который работает для меня. Для приращения я вычисляю разницу двух ударов и добавляю 0.99 вместе как отсечку:
Single margin = Convert.ToSingle(puts[1].strike) - Convert.ToSingle(puts[0].strike);
var pairs = calls.Join(puts, call => call.strike, put => put.strike, (call, put) =>
new OptionPair
{
Call = call,
Put = put,
Expiry = DateTime.Parse(call.expiry),
Strike = Convert.ToSingle(call.strike),
}).Where(pair => Math.Abs(pair.Strike - price) <= margin + 0.99);
Большое спасибо! @gisek вы спасли мой день. Я сделал очень незначительные изменения, как показано в EDIT выше. – Ben