# 12. Сравнение C++ формул и WebSocket API

Расширение существующих возможностей робота возможно двумя способами: с помощью механизма [С++ формул](c-api.md#cpp) и [WebSocket API](api.md#api). При желании эти разные механизмы можно комбинировать. Они решают разные задачи, тем не менее, у этих механизмов есть общие черты. Для удобства пользователей ниже в таблице приведено сравнение [С++ формул](c-api.md#cpp) и [WebSocket API](api.md#api) по ряду параметров.

|Характеристика|[С++ формулы](c-api.md#cpp)|[WebSocket API](api.md#api)|
|---|---|---|
|Язык программирования|C++|Любой язык программирования. Желательно использовать высокоуровневые языки, имеющие стандартные библиотеки для работы с протоколом WebSocket|
|Возможности|Ограниченные. Есть ограничения на длину исходного кода формул. Доступно получение значений по финансовым инструментам и изменение некоторых параметров портфелей. Для использования в формулах предусмотрены [пользовательские поля](params-description.md#p.user_fields), не задействованные в основном алгоритме. Запрещено использование функций, обращающихся к файловой системе или работающих с сетью. Крайне нежелательно выполнение затратных по времени операций. Нет возможности получения значений из внешних источников данных (баз данных, таблиц Excel и т.д.)|Полные. Можно автоматизировать всё то, что доступно через веб-интерфейс платформы. Нет ограничений на архитектуру приложения и на использование внешних источников данных.
|Взаимодействие между портфелями|Возможно только между портфелями одного робота, при этом у портфелей, к которым осуществляется доступ, должен быть взведен флаг [Shared formulas](params-description.md#p._sh_f)|Можно из одного приложения взаимодействовать со всеми доступными портфелями вне зависимости от того, каким роботам они принадлежат|
|Способ исполнения|Нативный код, компилируется в динамически загружаемую библиотеку, которая выполняется в том же потоке, что и код основного алгоритма робота|Отдельное приложение, которое запускается на другом сервере|
|Влияние на скорость работы робота|Могут замедлять работу робота, так как являются неотъемлемой частью основного алгоритма робота и выполняются в одном потоке с ним|Нет влияния на скорость работы робота, так как расчёты производятся параллельно работе робота|
|Скорость доступа к данным|Код формул выполняется всегда, когда вызывается расчёт цен по основному алгоритму. Соответственно, формулы пересчитываются сразу после получения цен при любом изменении в стакане. Никаких ограничений на доступ к данным, доступным в формулах, не накладывается|Для получения данных или внесения изменений необходимо отправить соответствующий запрос, есть [ограничения](api.md#api.rate_limits) на количество отправляемых запросов в единицу времени. При подписке на получение данных данные со стороны сервера управления роботами отправляются не при каждом изменении данных, а "пачками" с [определенной частотой](api.md#api.updates_rate)|
|Отказоустойчивость|Ошибки в формулах могут приводить к аварийному завершению работы всего робота|Аварийное завершение работы отдельного приложения повлияет лишь на расчёты, выполняемые в этом приложении, робот при этом продолжит торговать в соответствии со своим алгоритмом и заданными параметрами. Стоит учитывать, что при такой автоматизации есть риск разрыва связи между роботом и отдельным приложением, в таком случае робот продолжит торговать с теми параметрами, которые у него остались перед разрывом связи
