How-To: Как Выбрать Язык Программирования Для Создания Торгового Робота



How-to: как выбрать язык программирования для создания торгового робота

Один из самых частых вопросов, которые задают люди, только начинающие интересоваться алгоритмическим трейдингом: «Какой язык программирования лучше всего подходит для этогоЭ» Конечно, краткий ответ: «лучшего» варианта не существует. При выборе инструмента следует учитывать параметры вашей торговой стратегии, требуемую производительность, модульность, методологию разработки и требования к отказоустойчивости.

В этой статье мы поговорим об основных компонентах архитектуры алгоритмической торговой системы и о том, как каждый из них влияет на выбор языка программирования.

Примечание переводчика : Мы очень часто сталкиваемся со скептицизмом по отношению к алгоритмическому трейдингу.

Бытует мнение, что это чистая спекуляция, крайне вредная, и делать это для технического специалиста, мягко говоря, не комильфо.

Предвидя некоторые вопросы в комментариях, хотим сразу дать ссылку на материал , в котором много времени уходит на описание того, какие типы трейдеров существуют на фондовых рынках и почему КАЖДЫЙ из них приносит определенную выгоду в определенный момент времени, а также на тема , который затрагивает более общую тему назначения самих бирж.

Но здесь вы можете прочитать об опыте такой торговли, которая позволила человеку со знанием программирования заработать полмиллиона долларов( Первая часть , Вторая часть .

) Наслаждайся чтением! Прежде всего, мы рассмотрим основные элементы алгоритмической торговой системы, такие как аналитические инструменты, оптимизатор портфеля, риск-менеджер и, собственно, торговый движок.

Далее мы коснемся особенностей различных торговых стратегий и того, как выбор любой из них влияет на развитие всей системы.

В частности, мы обсудим ожидаемую частоту (скорость) и объем торгов.

После того, как вы выбрали торговую стратегию, вам необходимо спроектировать архитектуру всей системы.

Сюда входит выбор аппаратного обеспечения, операционной системы (или нескольких систем) и устойчивость к редким, но потенциально катастрофическим поворотам событий.

При проектировании архитектуры также следует уделить должное внимание производительности – как скорости аналитических инструментов системы, так и самого торгового движка.



Что делает торговая система?

Прежде чем выбрать «лучший» язык программирования, на котором будет работать наш робот, зарабатывая миллионы, нам необходимо определить требования к этому языку.

Будет ли система ориентирована только на задачи или нам также понадобится модуль управления рисками или построения портфеля? Нужен ли вам для работы модуль быстрого бэк-тестирования? Для большинства стратегий торговые системы можно разделить на две категории: исследовательские и генерирующие сигналы.



How-to: как выбрать язык программирования для создания торгового робота

Стратегии исследования сосредоточены на тестировании производительности на основе исторических данных.

Тестирование данных, собранных в прошлом, называется бэктестированием.

На вычислительную мощность модуля бэктестинга влияет объем данных и алгоритмическая сложность стратегии.

При оптимизации скорости исследовательских стратегий ограничивающими факторами часто являются скорость процессора и количество его ядер.

Если говорить о генерации торговых сигналов, то алгоритм должен понимать, когда покупать или продавать, и отправлять на рынок соответствующие ордера (чаще всего через брокерскую систему).

Некоторые стратегии требуют высокого уровня производительности.

Скорость стратегии ограничена такими факторами, как ширина канала данных и задержка, вносимая брокерскими и биржевыми системами (латентность).

Таким образом, в зависимости от того, какая категория стратегий вам нужна, и выбор языка программирования для ее реализации может различаться.



Тип, ликвидность и объем стратегии

Тип торговой стратегии повлияет на всю ее последующую структуру.

Необходимо оценить, на каких рынках планируется торговать, возможность подключения внешних поставщиков данных, а также частоту совершаемых алгоритмом транзакций и их объем.

Важными факторами будет поиск баланса между простотой разработки и оптимизацией производительности, а также аппаратным обеспечением, включая серверы, которые необходимо будет разместить в брокерских или биржевых дата-центрах, и дополнительным оборудованием, которое может понадобиться (GPU, FPGA и т. д.).

.

Торговля акциями с низкой ликвидностью на рынках США потребует совершенно иной технологии, чем стратегия высокочастотного статистического арбитража на фьючерсном рынке.

Прежде чем приступить к выбору реального языка программирования, вам следует начать выбирать поставщиков данных, с которыми будет работать ваша торговая стратегия.



How-to: как выбрать язык программирования для создания торгового робота

Необходимо проанализировать существующую связь с системами поставщиков, структуру любых API, скорость доставки данных и возможность их хранения в случае сбоев.

Разумным решением будет организация доступа к нескольким таким системам одновременно, что также потребует отдельной разработки, поскольку у каждого поставщика данных свои технологические требования (тикеры биржевых инструментов и т.п.

).

Ожидаемая частота торгов будет иметь определяющее влияние на то, как будет реализован стек технологий вашей системы.

Стратегии, требующие обновления данных чаще одного раза в минуту, потребуют для работы больших ресурсов.

В случае стратегий, требующих тиковых данных, необходимо разработать всю систему в соответствии с методологией проектирования, ориентированной на производительность.

Для этих задач часто используются HDF5 или кдб+ .

Чтобы обрабатывать чрезмерные объемы данных, необходимые HFT-приложениям, необходимо использовать как оптимизированный бэктестер, так и торговый движок.

Основными кандидатами на роль языка программирования в такой системе будут C/C++ (возможно, местами ассемблер).

Высокочастотные стратегии часто требуют дополнительного оборудования, такого как программируемые пользователем матрицы (FPGA), а также размещения серверов как можно ближе к ядру обмена и настройки сетевых интерфейсов самих серверов.



Исследовательские системы

При создании систем такого характера часто приходится прибегать к интерактивной разработке и автоматизации сценариев.

Первая концепция реализуется в IDE, такой как Visual Studio, MatLab или R Studio. Автоматизация сценариев включает в себя множество вычислений для различных параметров и точек данных.

Принимая все это во внимание, необходимо выбирать язык, который предоставляет отличные возможности для тестирования кода, а также позволяет добиться приемлемой производительности при расчете стратегий по различным параметрам.

На этом этапе часто используются такие IDE, как Microsoft Visual C++/C#, включающие в себя разнообразные инструменты для отладки, завершения кода и работы со всем стеком проекта (ORM, LINQ); MatLab, созданный специально для задач числовой линейной алгебры и векторных операций; R Studio, реализованная с использованием статистического языка R; Eclipse IDE для Linux, Java и C++, а также полусобственные IDE, такие как Enought Canopy для Python, которая включает в себя множество библиотек анализа данных (NumPy, SciPy, scikit-learn и pandas).

Все упомянутые инструменты подходят для численного бэктестинга, хотя из-за того, что код будет работать «в фоновом режиме», нет необходимости использовать графические IDE. На этом этапе в первую очередь следует подумать о скорости работы системы.

Компилируемые языки (например, C++) полезны, когда количество параметров бэктестинга очень велико.

В этом случае вам всегда следует быть очень осторожным на каждом этапе проектирования, поскольку ваша система изначально может быть не такой быстрой.

В случае интерпретируемых языков, таких как Python, для бэктестинга часто используются высокопроизводительные библиотеки (NumPy/pandas).

Выбор языка для реализации модуля бэктестинга будет определяться конкретными потребностями вашего алгоритма и количеством библиотек, доступных для этого языка (подробнее об этом ниже).

Однако не следует забывать, что язык, используемый для бэктестера и исследовательской среды, может отличаться от инструментов, выбранных для модулей построения портфеля, управления рисками и торгового механизма.



Формирование портфеля и управление рисками

Многие алгоритмические трейдеры часто недооценивают важность дизайнер портфолио и управление рисками.

Это большая ошибка, поскольку эти средства позволят вам сохранить свои деньги на бирже.

С их помощью вы сможете не только сократить количество рискованных сделок, но и минимизировать затраты на торговые операции за счет снижения транзакционных издержек.

Продуманное внедрение этих компонентов может оказать существенное влияние на качество и постоянную прибыльность.

Без них очень сложно создать стабильную стратегию, поскольку наличие механизма сбора портфеля и риск-менеджера позволяют легко модифицировать торговую систему.

Цель модуля Portfolio Builder — определить набор потенциально прибыльных сделок и совершить те, которые принесут наибольшую прибыль — это делается путем анализа множества факторов (например, волатильности, класса активов и сектора компании, акции которой торгуются ).

В соответствии с этим свободный капитал распределяется между множеством биржевых инструментов.

Построение портфеля часто сводится к задаче линейной алгебры (например, факторизации матрицы), а это означает, что производительность механизма во многом зависит от эффективности реализации в системе инструментов линейной алгебры.

Популярные библиотеки включают uBLAS, LAPACK и NAG для C++.

MatLab обладает обширными возможностями по работе с матрицами.

Python использует NumPy/SciPy для таких вычислений.

Чтобы система поддерживала качественный и сбалансированный портфель, вам понадобится скомпилированная (и хорошо оптимизированная) библиотека для работы с матрицами.

Еще одной чрезвычайно важной частью любой алгоритмической торговой системы является модуль управления рисками.

Риск может принимать разные формы: повышенная волатильность (для некоторых стратегий это вообще желательно), повышенная корреляция между классами активов, сбои в работе серверов, так называемые «черные лебеди» (события, которые невозможно предсказать) и необнаруженные ошибки в коде торговой программы.

– и это лишь малая часть возможных проблем.

Модуль управления рисками пытается «предвидеть» последствия большинства вышеперечисленных рисков.

Очень часто для этого используют статистический анализ (например, стресс-тесты по методу Монте-Карло).

В таких вычислениях большую роль играет параллелизм, и в целом проблемы с производительностью можно решить, просто увеличив вычислительную мощность.



Торговый движок

Задача торгового движка системы — получать отфильтрованные торговые сигналы от конструктора портфеля и модулей управления рисками, формировать на их основе торговые ордера, которые затем отправляются в брокерскую торговую систему.

В случае с «обычными» частниками это скорее всего вам понадобится API или подключение по протоколу FIX. Соответственно, для выбора языка необходимо проанализировать качество самого API, наличие/отсутствие программных оболочек для работы с ним, ожидаемую частоту операций и ожидаемое «проскальзывание» между моментом отправки заказа на брокерская система и ее появление в ядре биржевой торговой системы.

«Качество» API складывается из нескольких элементов: качество документации, производительность, которую обеспечивает интерфейс, нужно ли для работы с ним отдельное программное обеспечение или можно ли установить соединение без GUI и т. д. Большинство брокерских API имеют интерфейсы на C++ и/или Java. Обычно вокруг каждого такого инструмента формируется сообщество пользователей брокерского клиента, которые помогают его развивать и создавать оболочки для C#, Python, R, Excel и MatLab. Однако необходимо помнить, что любой дополнительный плагин может содержать различные ошибки, поэтому их всегда следует тщательно тестировать и следить за тем, чтобы разработчики занимались поддержкой их творения.

Лучший способ — посмотреть, как часто выпускались обновления за последние месяцы.

Частота торговых операций — важнейший элемент алгоритма торгового движка.

Робот может отправлять сотни заказов в минуту, поэтому производительность системы чрезвычайно важна.

Если система реализована не очень хорошо, то неизбежно значительное проскальзывание между ценой, когда ордер должен был быть размещен, и той, по которой он был фактически исполнен.

Это может оказать существенное влияние на прибыльность.

Статически типизированные языки (см.

ниже), такие как C++/Java, обычно лучше всего подходят для написания торгового движка, но их использование вызывает проблемы со временем разработки, простотой тестирования и удобством сопровождения кода.

С другой стороны, динамически типизированные языки, такие как Python и Perl, теперь «довольно быстрые».

Убедитесь, что все компоненты вашей системы разработаны с использованием модульного подхода, который позволяет легко удалять и добавлять в систему новые элементы с течением времени.



Процесс планирования и разработки архитектуры

Мы уже обсуждали компоненты торговой системы, важность параметров частоты торгов и их объема, но еще не затронули вопросы инфраструктуры.

Независимый индивидуальный трейдер или сотрудник небольшой HFT-фирмы или фонда, скорее всего, столкнется со многими проблемами — анализ альфа-модели, управление рисками и параметры исполнения, а также окончательное развертывание системы — и все это придется делать самостоятельно.

Все это важные моменты, поэтому, прежде чем с головой погрузиться в обсуждение языков программирования, неплохо обсудить оптимальную архитектуру системы.



Разделение интересов

Одной из важнейших задач при создании торгового робота является «разделение интересов» или, на языке разработки программного обеспечения, разделение различных аспектов торговой системы на модульные компоненты.

Такое разделение на компоненты поможет в будущем менять/заменять/добавлять в систему новые модули для повышения производительности, надежности или упрощения обслуживания, без необходимости проверять все зависимости и «не сломано ли что-нибудь» в других местах.

Для торговых систем такой подход является лучшей практикой.

Для систем, работающих «на средних скоростях», его реализация весьма желательна.

В случае с HFT-системами, возможно, придется игнорировать некоторые правила, чтобы добиться еще большей скорости, но в целом стоит придерживаться именно такого подхода.

Создание карты компонентов алгоритмической торговой системы — тема, заслуживающая отдельной статьи.

Однако оптимальным подходом здесь является реализация отдельных компонентов для исторической и реальной рыночной информации, хранения данных, доступа к API, модуля бэктестинга, параметров стратегии, построителя портфеля, а также модуля управления рисками и самого торгового механизма.

Например, если обнаружатся проблемы с эффективностью работы с хранилищем данных (даже после работ по оптимизации), то такой модуль можно легко заменить практически без необходимости что-либо переписывать в компонентах приема данных или доступа к API. Еще одним преимуществом модульной конструкции является то, что она позволяет использовать разные языки программирования в разных частях системы.

Нет необходимости жестко привязываться к конкретному инструменту, если способ связи между компонентами системы независим.

Например, они могут общаться через TCP/IP, ZeroMQ или другие протоколы.

Конкретный пример: система бэктестинга может быть написана на C++ для достижения высокой производительности, а менеджер портфеля и торговый механизм могут быть написаны на Python с использованием SciPy и IBPy.

Мысли о производительности

Производительность важна практически для любой торговой стратегии.

Чем выше частота торговой системы, тем большее значение играет этот фактор.

«Производительность» относится ко многим вещам, включая скорость выполнения алгоритма, задержку сети, канал связи, ввод/вывод данных, многопоточность/параллелизм и масштабирование.

Каждому из этих аспектов посвящены отдельные книги, поэтому мы лишь слегка коснемся их.

Теперь мы обсудим архитектуру и конкретные языки программирования с точки зрения их влияния на общую производительность системы.

Донал Кнут, один из отцов того, что мы называем информатикой, сказал очень мудрую вещь: «корень всех зол — преждевременная оптимизация».

Это верно почти всегда, но не при разработке алгоритма HFT-торговли! Если вы заинтересованы в создании менее высокочастотной стратегии, то общий подход в вашем случае будет заключаться в том, чтобы построить систему максимально простым способом и начинать ее оптимизацию только при обнаружении узких мест. Для их выявления используются различные инструменты профилирования.

Вы можете создавать профили как в MS Windows, так и в Linux. Для этого существует целая куча различных инструментов.

Теперь, как и договаривались, обсудим конкретные языки программирования в контексте производительности.

C++, Java, Python, R и MatLab имеют высокопроизводительные библиотеки (как внутренние, так и внешние) для базовых наборов данных и алгоритмической работы.

C++ поставляется в комплекте со стандартной библиотекой шаблонов, а Python включает NumPy/SciPy. В этих библиотеках можно найти стандартные математические задачи, а написание собственной реализации — путь, который редко можно назвать прибыльным.

Исключением является случай, когда вам нужно уникальное оборудование и вы используете алгоритм, работающий с какими-то фирменными расширениями (например, пользовательскими кэшами).

В то же время нужно помнить, что изобретение велосипеда зачастую отнимает время, которое можно было бы потратить с гораздо большей пользой на разработку и оптимизацию всех частей торговой системы.

Время разработки бесценно, особенно если вы строите свою систему в одиночку.

Задержка часто является проблемой для торгового движка, поскольку инструменты анализа рынка обычно расположены на одной машине.

Задержки могут возникнуть на любом этапе процесса исполнения: идет доступ к базе данных (задержки диска/сети), должны генерироваться торговые сигналы (задержки ОС или ядра), должны быть отправлены ордера на биржу (задержки канала связи) и они должны обрабатываться ядром биржевой торговой системы (задержки на бирже).

Чтобы создать эффективную HFT-систему, вам придется разбираться в оптимизации на уровне ядра и оптимизации процессов передачи данных.

Еще одним полезным инструментом для разработчиков высокоскоростных биржевых роботов является кэширование.

Основная идея кэширования — хранить часто запрашиваемую информацию, чтобы ее можно было получить без траты ресурсов.

Например, в веб-разработке кэширование можно использовать при загрузке данных из реляционной базы данных на диск в память.

Все последующие запросы к этим данным больше не нужно будет отправлять в базу данных, что позволяет существенно повысить производительность системы.

Для онлайн-торговли кэширование также может оказаться очень полезной вещью.

Например, вы можете сохранить текущее состояние портфеля в кэше и хранить его там до тех пор, пока инструменты в нем не будут «ребалансированы», что позволит избежать необходимости заново генерировать список купленных и проданных активов при каждом срабатывании алгоритма.

— его можно просто обновить.

Такая операция требует значительных ресурсов процессора и ввода-вывода.

К сожалению, кэширование не является инструментом без проблем.

Перезагрузка кэшированных данных из-за нестабильного характера хранилищ кэша также может потребовать значительных ресурсов инфраструктуры.

Другая проблема — эффект домино, при котором при высокой нагрузке ошибочно начинает генерироваться несколько копий кэша, что влечет за собой череду сбоев.

Динамическое выделение памяти — дорогостоящая операция.

Поэтому высокопроизводительные торговые приложения должны хорошо работать с памятью и уметь выделять и забирать ее на всех этапах выполнения программы.

Новые языки программирования, такие как Java, C# или Python, имеют автоматическую сборку мусора, благодаря чему память выделяется или освобождается динамически.

Этот инструмент чрезвычайно полезен при разработке, поскольку уменьшает количество ошибок и повышает читаемость кода.

Однако для некоторых HFT-систем все же лучше не использовать стандартные инструменты для работы с памятью, а реализовать свои.

Например, в Java с помощью некоторой настройки сборщика мусора и конфигурации кучи можно повысить производительность HFT-стратегий.

В C++ нет встроенных инструментов сборщика мусора, поэтому необходимо управлять выделением и освобождением памяти во время реализации объектов.

Это, конечно, повышает вероятность возникновения ошибок, но также позволяет лучше контролировать объекты и кучи в конкретных приложениях.

Выбирая язык программирования, потрудитесь узнать больше о том, как в нем работает сборка мусора, и можно ли как-то оптимизировать работу этого механизма под конкретные сценарии.

Многие операции в алгоритмическом трейдинге могут быть распараллелены, то есть разные программные операции могут выполняться одновременно.

Так называемые «ошеломляюще параллельные» алгоритмы включают шаги, которые могут выполняться совершенно независимо от других шагов.

Конкретные статистические операции, такие как моделирование Монте-Карло, являются хорошими примерами таких распараллеленных алгоритмов, поскольку каждая вероятность и ход событий при ее возникновении могут быть рассчитаны без знания других возможных вариантов развития ситуации.

Другие алгоритмы распараллеливаются лишь частично.

К алгоритмам этого типа относится моделирование в гидродинамике, где область вычислений может быть разделена на отдельные области, но они все равно должны быть связаны друг с другом.

Распараллеливаемые алгоритмы подчиняются закону Амдала, который накладывает теоретический верхний предел улучшения производительности распараллеленного алгоритма при наличии N отдельных процессов (например, на ядре процессора или в потоке).

Распараллеливание стало важным элементом оптимизации, поскольку тактовая частота процессоров в последнее время не увеличивается, а новые процессоры содержат все больше и больше ядер, способных выполнять параллельные вычисления.

Достижения в области графического оборудования (особенно для видеоигр) также привели к усовершенствованию графических процессоров, которые теперь содержат сотни «ядер» для обработки нескольких одновременных операций.

Да и цена таких графических процессоров стала гораздо более приемлемой.

Платформы высокого уровня, такие как CUDA от Nvidia, получили широкое распространение в науке и финансах.

Обычно такие GPU-устройства подходят только для исследовательских задач, но есть и такие (в том числе программируемые FPGA), которые используются непосредственно для HFT. На данный момент подавляющее большинство современных языков программирования в той или иной степени поддерживают многопоточность, что позволит вам, например, оптимизировать бэктестер так, чтобы он использовал независимые друг от друга процессы.

Масштабирование при разработке программного обеспечения означает способность системы обрабатывать постоянно растущие рабочие нагрузки в виде большего количества запросов, большего использования ЦП и большего количества выделяемой памяти.

В алгоритмической торговле стратегия «масштабируется», то есть может работать с большим объемом капитала и при этом стабильно приносить положительные результаты.

Стек торговых технологий масштабируем, если он может обрабатывать большие объемы и справляться с увеличенными задержками без узких мест. Конечно, системы должны быть масштабируемыми, но проблемы и узкие места сложно предсказать.

Строгая регистрация, профилирование и мониторинг сделают систему более масштабируемой.

Некоторые языки программирования часто называют «немасштабируемыми».

На самом деле те, кто так говорит, просто «не умеют их готовить».

Весь стек технологий может быть немасштабируемым, но не сам язык.

Естественно, некоторые языки в конкретных случаях имеют лучшую производительность, чем другие, но нельзя сказать, что один язык «лучше» другого во всех смыслах.

Как мы уже говорили выше, нам необходимо разделять интересы.

Чтобы система справлялась со «скаками» (так называемой внезапной волатильностью, вызывающей большое количество сделок), полезно создать «архитектуру очереди сообщений».

Это значит, что между компонентами торговой системы ставится очередь сообщений, благодаря чему система зависает, если тот или иной компонент не может обработать много запросов.



Аппаратное обеспечение и операционные системы

Аппаратное обеспечение, на котором работает ваша торговая система, может оказать существенное влияние на прибыльность алгоритма.

Это касается даже не исключительно высокочастотных трейдеров — плохие серверы могут выйти из строя в любой момент, и не важно, сколько транзакций совершит ваш робот, если по вине оборудования он не сможет выполнить одну, но очень важную операцию.

.

Поэтому выбор оборудования для торговой системы крайне важен.

Обычно выбор стоит между собственным компьютером пользователя, удаленным сервером, облачной виртуальной машиной или колокейшн-сервером (в дата-центре биржи или брокера).

Понятно, что десктопный вариант является самым простым и дешевым, во многом благодаря существованию большого количества удобных для пользователя операционных систем (Windows, Mac OS, Ubuntu).

Но у них есть и существенные недостатки.

Один из основных – каждое новое обновление ОС будет требовать патчения торгового робота, плюс компьютер придется периодически перезагружать, что тоже не очень хорошо.

Кроме того, на поддержание графического интерфейса тратятся вычислительные ресурсы персонального компьютера, а ведь их можно было бы потратить на повышение производительности торговой системы!

How-to: как выбрать язык программирования для создания торгового робота

Кроме того, работа дома или в офисе чревата проблемами с работоспособностью и подключением к Интернету.

Главным преимуществом настольной системы является тот факт, что дополнительные вычислительные мощности для нее можно приобрести за сумму, значительно меньшую, чем та, которая потребовалась бы для модернизации аналогичного по скорости сервера.

Выделенный сервер или облачная машина обойдется вам дороже, чем настольный компьютер, но также позволит организовать гораздо более избыточную инфраструктуру — включая автоматическое резервное копирование данных, возможность настройки времени безотказной работы и мониторинга скорости.

Их будет сложнее администрировать, так как как минимум потребуется удаленное подключение.

Для Windows-серверов, скорее всего, будет использоваться RDP, а в Unix-системах без SSH не обойтись — выхода из командной строки вообще нет, что делает некоторые инструменты разработки типа Excel или MatLab неприменимыми из-за их неработоспособности.

без графического интерфейса.

Колокейшн-сервер просто означает, что вы размещаете свой сервер как можно ближе к ядру биржи — в ее дата-центре или в дата-центр брокера , который находится с системой обмена в одной локальной сети.

Для некоторых HFT-стратегий это единственный приемлемый вариант, несмотря на то, что он самый дорогой.

Последний аспект, который следует учитывать при выборе программного обеспечения и языка программирования, — это независимость от платформы.

Есть ли необходимость запускать код на разных ОС? Или код предназначен для работы на определенной архитектуре процессора — например, x86/x64 — или он будет работать и на процессорах ARM RISC? Ответы на эти вопросы будут напрямую зависеть от предполагаемой частоты и типа торговой стратегии.



Стабильность и тестирование

Лучший способ потерять кучу денег на алгоритмической торговле — создать нестабильную систему.

Устойчивость включает в себя способность системы реагировать на редкие события, такие как сбои брокеров (или банкротство), неожиданное повышение волатильности, сбои в работе Интернета у поставщиков услуг (Интернет, центры обработки данных) или случайное удаление всей торговой базы данных.

Плохо реализованная архитектура может за считанные секунды свести на нет годы успешной и прибыльной торговли.

Ключевыми аспектами вашей торговой системы должны быть отладка, тестирование, резервное копирование, доступность и мониторинг.

Разрабатывая качественную торговую систему, даже не рассчитывайте потратить на отладку, тестирование и поддержку менее 50% общего времени.

Практически все языки программирования идут в комплекте с отладчиком или имеют адекватные сторонние альтернативы.

Благодаря отладчику вы можете размещать в своем коде специальные точки останова, которые позволят изучить поведение программы до того, как произойдет сбой.

Отладка — важный инструмент анализа ошибок программного обеспечения, но она в основном используется в компилируемых языках, таких как C++ или Java, тогда как интерпретируемые языки, такие как Python, обычно легче отлаживать.

Однако в состав этого языка также входит pdb — мощный инструмент отладки.

В среде IDE Microsoft Visual C++ имеются дополнительные инструменты отладки графического пользовательского интерфейса, но для Linux C++ вам придется использовать отладчик gdb. Без тестирования не обойтись.

Самая современная парадигма тестирования — TTD или Test Driven Development, при которой сначала пишется тест, охватывающий желаемое изменение в системе, а затем для него пишется код, способный пройти этот тест. Разработка через тестирование — непростая задача, требующая большой дисциплины.

Для C++ в Boost есть платформа модульного тестирования; в Java для тех же целей есть библиотека JUnit. В Python также есть модуль для такого типа тестирования, который является частью стандартной библиотеки.

Во многих других языках также есть инструменты и платформы для выполнения модульного тестирования.

В продуктивной среде интеллектуальное ведение журналов абсолютно необходимо.

Необходимо наладить процесс выдачи различных сообщений об ошибках и поведении системы.

Журналы — это первое, с чего вы начнете решать проблемы и сбои.

Несмотря на всю кажущуюся простоту задачи — вывод сообщений в файл и его хранение — на самом деле все гораздо сложнее, и следует продумать конструкцию системы логирования, прежде чем приступать к ее реализации.

И Windows, и Linux имеют множество инструментов и возможностей ведения журналов, а языки программирования также предоставляют Теги: #фондовый рынок #программирование #алгоритмический трейдинг #торговые роботы #Visual Studio #matlab #C++ #python #статические языки программирования #динамические языки программирования #разработка #разработка веб-сайтов #matlab

Вместе с данным постом часто просматривают: