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

Обо мне

TG: haradkou_sdet

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

План

  1. Контекст проекта
  2. Fix protocol и его внутренности
  3. Подход к тестированию Fix
  4. Выводы

Контекст

  1. Broker/Trader
  2. WebSocket для получение данных в реальном времени
  3. k6 для нагрузки
  4. Nodejs (playwright) как автотесты для UI и API
  5. Fix protocol
  6. 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=017

FixProtocol

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

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

k6 <3 FixProtocol?

библиотек нет

Надо работать с голым TLS.

Можно написать на GoLang extension

GoLang Extension Path

  1. Изучить существующие расширения
  2. написать на GoLang решение
    1. предусмотреть метрики*
    2. multi-worker mode
    3. работать с TCP/IP напрямую
  3. "запечь" докер
  4. положить в artifactory
  5. "запечь" k6 + extension
  6. положить в artifactory
  7. создать паиплаин

* надо знать GoLang

Очень долго!

Что делать?

Что если NodeJS?

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

Готовое решение

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

Свое решение

стоимость абстракций ч2

Свое решение. План

  1. подключится к TLS напрямую
  2. получать сообщения
  3. парсить сообщения (опционально)
  4. формировать + отправлять сообщения

Максимальная эфективность в 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()
  })
}

Метрики

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

Выводы

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