идея Fix - тестируем протокол
Обо мне

TG: haradkou_sdet
- SDET с 2018
- Playwright labs contributor
- Certified node.js application developer (JSNAD 2023)
- автор TG канала @haradkou_sdet
-
Помогаю с автоматизацией и нагрузкой

План
- Контекст проекта
- Fix protocol и его внутренности
- Подход к тестированию Fix
- Выводы
Контекст
- Broker/Trader
- WebSocket для получение данных в реальном времени
- k6 для нагрузки
- Nodejs (playwright) как автотесты для UI и API
- Fix protocol
- DotNet - backend
B2Trader

Fix protocol - что за покемон?

Что такое FixProtocol
The Financial Information eXchange (FIX®) - протокол передачи финансовых данный для трейдинговых терминалов
Fix 1.x - 1994 год. Большое распространение получил в 2006
Где такой FixProtocol?
MOEX?

Где такой FixProtocol?
NYSE

Где такой FixProtocol?

Где такой FixProtocol?

Где такой FixProtocol !?

Что такое FixProtocol
The Financial Information eXchange (FIX®) - протокол передачи финансовых данный для трейдинговых терминалов
Как работает FixProtocol

Как работает FixProtocol

Как работает FixProtocol

Как работает FixProtocol

Как работает FixProtocol

FixProtocol. Структура сообщения
8=FIX.4.2
9=118
35=D
49=ONIXS
56=CME
34=2
52=20240528-09:20:52.111
11=983532-3
21=1
38=100
55=NVDA
40=1
54=1
60=20240528-09:20:52.004
10=017FixProtocol


8=FIX.4.29=11835=D49=ONIXS56=CME34=252=20240528-09:20:52.11111=983532-321=138=10055=NVDA40=154=160=20240528-09:20:52.00410=017- New Order-Single (MsgType=
D) - Order Cancel Request (MsgType=
F) - Execution Report (MsgType=
8) - Security Definition Request (MsgType=
c) - Trade Capture Report Request (MsgType=
AD) - Trade Capture Report (MsgType=
AE)

Как писать автотесты ?

k6 <3 FixProtocol?
библиотек нет
Надо работать с голым TLS.
Можно написать на GoLang extension
GoLang Extension Path
- Изучить существующие расширения
- написать на GoLang решение
- предусмотреть метрики*
- multi-worker mode
- работать с TCP/IP напрямую
- "запечь" докер
- положить в artifactory
- "запечь" k6 + extension
- положить в artifactory
- создать паиплаин
* надо знать GoLang
Очень долго!

Что делать?

Что если NodeJS?
- Взять готовую библиотеку
- Написать свое решение

Готовое решение
- некоторые решения кушает память очень много (OOM в nodejs)
- прихотлив к кастомному FixProtocol
- некоторые решения платные
- некоторые отправляют FIXML (fix xml формате. У нас текстовый)
Свое решение
стоимость абстракций ч2

Свое решение. План
- подключится к TLS напрямую
- получать сообщения
- парсить сообщения (опционально)
- формировать + отправлять сообщения
Максимальная эфективность в JS!
- node:net - подключение к FIX API
- node:string_decoder - свои encoder/decoder для Fix
- node:streams - для обработки большого кол-ва сообщений без просадок в памяти
Решение - чистый JS!
стоимость абстракций Ч2


стоимость абстракций Ч1
Подключение к FixAPI
// filename: fixapi.mjs
import { Socket } from 'node:net'
const credentials = {
username: 'test-user',
password: 'sample',
}
const connectionUrl = `tcp+ssl://staging.com:6120`
const connection = new Socket();
connection.on('connect', () => {
console.log('connected to fixAPI')
connection.write(/** 8=FIX.4.4 ..... */) // handshake // string or Buffer!!!
})
connection.on('data', (data) => {
const message = data.toString('utf8') // Buffer!!!
console.log('message:', message)
})
connection.on('close', () => { console.log('closed') })
connection.connect(connectionUrl, () => {
console.log('connected & listenging', connectionUrl)
})
Парсинг Fix Message
// filename: fix-codec.mjs
export class FixMessageDecoder {
encode(str) {
const buf = Buffer.alloc(/** args */)
// implementation
return buf // Buffer
}
}
export class FixMessageEncoder {
decode(buf) { // Buffer
// implementation
return {} // parsed message
}
}Добавляем потоков
// filename: fix-coordinator.mjs
import { Worker } from 'node:worker_threads'
const THREADS = os.cpus().length || '10'
for (let i = 0; i < THREADS; i++) {
const worker = new Worker('fixapi.mjs');
worker.on('data', (result) => {
results.push(result)
worker.close()
})
}




Метрики

- Что такое Fix Protocol
- Как его можно протестировать (Node.js)
- Метрики позволили вычислить узкие места
- Было произведено улучшение собираемых метрик
Выводы


References
- Blog - https://blog-vitaliharadkous-projects.vercel.app/
- Haradkou.SDET стоимость абстракиций P1 & P2 - https://t.me/haradkou_sdet/175 & https://t.me/haradkou_sdet/187
- Haradkou SDET в гостях https://www.youtube.com/playlist?list=PL-xAG9ENbnyDiQ1EybAOrYcKxhGL2x5U7
- Fix protocol - https://www.fixtrading.org/what-is-fix/
- Binance API - https://www.binance.com/en-GB/binance-api
- Moex API - https://iss.moex.com/iss/reference/543
- T-Invest API - https://developer.tbank.ru/invest/intro/intro
- Fix Parser - https://www.onixs.biz/fix-parser
- Fix Analyzer - https://www.onixs.biz/fix-analyser.html
- JSPureFix - https://github.com/TimelordUK/jspurefix
MoscowQA 2026. Fix protocol
By vitalic gorodkov
MoscowQA 2026. Fix protocol
- 36