Давайте отвлечемся от проблемы "интегрировать С# и R".
Будем считать, Вы или умеете это делать или перенесете все расчеты в C#.

Далее нужно будет хорошо покодировать на C# (воспользоваться ТСЛаб АПИ).

Вам нужно реализовать кубик, который на выходе возвращает объект класса InteractiveSeries.
Для каждого страйка серии нужно сказать, "какая на этом страйке волатильность".

Волатильность в коде идет не в процентах, а "как есть".
Например, "волатильность фРТС 0.27".
ЭТО ВАЖНО.


Самый простой заголовок класса:
Code:
    /// <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:
Code:
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 хотя бы десятком точек -- и их уже можно будет увидеть на графике.
Если мы с Вами это сделаем, то можно будет с этой точки продолжить.
_________________________
Скидка на опционной криптобирже Deribit:
https://www.deribit.com/reg-2200.8947?q=home
Да пребудет с вами Вола!