Запускаются некоторые функции, которые что-то считают. Это могут быть индикаторы, могут быть и торговые алгоритмы. Эти функции обмениваются данными через некоторую область памяти - структуру. Таким образом, торговая система может использовать для своих нужд значения индикаторов, которые выполняются параллельно с ней.
Это с одной стороны и логично, а с другой стороны проще в реализации самих индикаторов. Ведь если бы они вызывались в однозадачном режиме, то индикатору следовало бы помнить до куда он досчитался в предыдущий раз и расчитываться далее, в общем, в индикаторе (и других вспомогательных модулях) не нужно реализовать системный код, который только запутает основную логику.
Далее, посколку реальное распараллеливание мне не интересно - у меня на ПК один процессор и всё это расспараллеливание, которое предлагает средство разработки лишь профанация, реально мешающая выполнению кода, например МТС может запросить данные индикатора, а данные в это время обновляются, и в итоге получить не старые данные, не новые, а некоторый "мусор".
Поэтому
менеджер задач я делал сам подменяя системные регисты процессора. В итоге получилось, что системных процессов у меня всего два - один интерфейсный, чтобы можно было во время выполнения по менюшкам ходить, в том числе другие процессы запускать. И второй процесс - для выполнения задач, которые я время от времени подменяю одну на другую.
Теперь как и когда происходит подмена. Есть некоторый системный таймер, привязанный к временному ряду цен. Все процессы рано или поздно обращаются либо за баром либо за тиком. Когда они его получили и обрабатывают - я их не трогаю и управление не забираю, когда же процесс обратился за следующим баром, то менеджер задач определяет время этого бара. И если есть процессы, которым нужны бары расположенные раньше по времени, то управление передаётся этим процессам. Таким образом имеется реальное параллельное выполнение нескольких процессов, привязанное к временному ряду цен, а смена процесса происходит в момент запроса ценовых данных.
Я гонял для тестирования порядка 100 процессов, просто запускал одну и ту же систему в своей области памяти, всё работает.
Здесь же легко решается и вопрос о бэктестинге/реальной работе. Для бэктестинга указывается время старта МТС в прошлом и время финиша тоже в прошлом. При реальной работе время старта в прошлом - система обычно накапливает некоторую информацию (те же средние), а время финиша в будущем. МТС запрашивает бар, который реально ещё не наступил - менеджер останавливает процесс до прихода этого бара и запускает снова, когда он появится.
В общем, примерно так это всё и работает.
BlakBird