Давайте отвлечемся от проблемы "интегрировать С# и 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 хотя бы десятком точек -- и их уже можно будет увидеть на графике.
Если мы с Вами это сделаем, то можно будет с этой точки продолжить.