Давайте отвлечемся от проблемы "интегрировать С# и R".
Будем считать, Вы или умеете это делать или перенесете все расчеты в C#.
Далее нужно будет хорошо покодировать на C# (воспользоваться
ТСЛаб АПИ).
Вам нужно реализовать кубик, который на выходе возвращает объект класса
InteractiveSeries.
Для каждого страйка серии нужно сказать, "
какая на этом страйке волатильность".
Волатильность в коде идет не в процентах, а "как есть".
Например, "волатильность фРТС 0.27".
ЭТО ВАЖНО.Самый простой заголовок класса:
/// <summary>
/// \~english Flat smile as in Black-Scholes option model. Volatility is constant.
/// \~russian Тривиальная улыбка по версии Блека-Шолза. Уровень волатильности постоянен и задаётся параметром SigmaPct.
/// </summary>
[HandlerCategory(HandlerCategories.OptionsTickByTick)]
[HelperName("Black-Scholes Const", Language = Constants.En)]
[HelperName("Константа по Блеку-Шолзу", Language = Constants.Ru)]
[InputsCount(2)]
[Input(0, TemplateTypes.DOUBLE, Name = Constants.FutPx)]
[Input(1, TemplateTypes.DOUBLE, Name = Constants.Time)]
[OutputType(TemplateTypes.INTERACTIVESPLINE)]
[Description("Тривиальная улыбка по версии Блека-Шолза. Уровень волатильности постоянен и задаётся параметром 'Волатильность, %'.")]
[HelperDescription("A flat smile as in the Black-Scholes option model. Volatility is a constant and is defined by the 'Sigma, %' parameter.", Constants.En)]
public class BlackScholesConstSmile2 : BaseCanvasDrawing, IValuesHandlerWithNumber
{
здесь ваша реализация
}
В реальной жизни нужно будет указать дополнительные входные аргументы (как минимум, нужно будет принять серию опционов).
Теперь метод Execute:
public InteractiveSeries Execute(double price, double time, int barNum)
{
int barsCount = ContextBarsCount;
if (barNum < barsCount - 1)
return new InteractiveSeries();
double futPx = price;
double dT = time;
if (Double.IsNaN(dT) || (dT < Double.Epsilon) ||
Double.IsNaN(futPx) || (futPx < Double.Epsilon))
return new InteractiveSeries();
<дальнейшая реализация: нужно для каждого страйка придумать уровень волатильности>
}
Здесь пара моментов важных:
1. В отличие от других блоков улыбка существует только для самого последнего (текущего!) бара.
Поэтому первым делом мы проверяем индекс и если он в ппрошлом -- завершаемся.
2. Обязательно делаем валидацию входных параметров.
Если на вход передана отрицательная цена или отрицательное время -- лучше сразу тихо завершиться, чем возвращать из блока какие-то несостоятельные фантазии.
Попробуйте сами заполнить InteractiveSeries хотя бы десятком точек -- и их уже можно будет увидеть на графике.
Если мы с Вами это сделаем, то можно будет с этой точки продолжить.