Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
549b4f5
cmake update
mkipnis May 18, 2025
4f757c7
cmake update
mkipnis May 18, 2025
0a6e09e
cmake update
mkipnis May 18, 2025
0db28a6
cmake update
mkipnis May 18, 2025
63d7baa
cmake update
mkipnis May 19, 2025
e25d67b
prevent db create if file doesnt exits
mkipnis May 21, 2025
113c0b1
Merge remote-tracking branch 'refs/remotes/origin/enhancements_0424' …
mkipnis May 21, 2025
a5d9a99
include db files in install
mkipnis May 22, 2025
bd2fee4
docker update
mkipnis May 23, 2025
8226416
docker compose updates
mkipnis May 23, 2025
a586cf2
Merge branch 'master' into enhancements_0424
mkipnis Jul 17, 2025
970051c
Merge pull request #23 from mkipnis/enhancements_0424
mkipnis Jul 17, 2025
1ba9707
update
mkipnis Jul 20, 2025
8814e91
updated ust_ats
mkipnis Jul 20, 2025
2a642d4
docker updated
mkipnis Jul 20, 2025
bf13567
Merge pull request #24 from mkipnis/enhancements_0424
mkipnis Jul 20, 2025
908fa26
Update README.md
mkipnis Jul 20, 2025
11811fc
Create cmake-single-platform.yml
mkipnis Sep 6, 2025
938f65d
Update cmake-single-platform.yml
mkipnis Sep 6, 2025
8f1fbd6
Update cmake-single-platform.yml
mkipnis Sep 6, 2025
b729450
Update cmake-single-platform.yml
mkipnis Sep 6, 2025
201f6af
general updates
mkipnis Oct 12, 2025
eb186d5
updated asio cmake build
mkipnis Oct 12, 2025
cc9ac4d
Merge pull request #28 from mkipnis/misc_0925
mkipnis Oct 12, 2025
b619b4c
Update README.md
mkipnis Oct 12, 2025
74e3dcb
Update README.md
mkipnis Oct 12, 2025
ea8e813
Merge pull request #29 from mkipnis/misc_0925
mkipnis Oct 12, 2025
9cf96a7
Update README.md
mkipnis Oct 12, 2025
15d9a9f
Merge pull request #30 from mkipnis/misc_0925
mkipnis Oct 12, 2025
2941bd1
Update README.md
mkipnis Oct 12, 2025
8ffc2db
Merge pull request #31 from mkipnis/misc_0925
mkipnis Oct 12, 2025
6887ad1
multi matching engine update
mkipnis Oct 23, 2025
0f99a7a
Update README with Multi Matching Engine ATS details
mkipnis Oct 23, 2025
c8216b7
Fix formatting in README for Docker Compose links
mkipnis Oct 23, 2025
5f507c4
Fix typo in docker-compose file for matching engine
mkipnis Oct 23, 2025
998e31b
Merge pull request #33 from mkipnis/misc_1025
mkipnis Oct 23, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions .github/workflows/cmake-single-platform.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: CMake on a single platform

on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]

env:
# Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
BUILD_TYPE: Release

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Install dependencies
run: sudo apt-get update && sudo apt-get install -y libboost-all-dev libapr1-dev libaprutil1-dev libtinyxml2-dev libsqlite3-dev libasio-dev

- name: Configure CMake
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}

- name: Build
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}

- name: Test
working-directory: ${{github.workspace}}/build
run: ctest -C ${{env.BUILD_TYPE}}

- name: ✅ Build Success
run: echo "🎉 Build completed successfully!"
79 changes: 35 additions & 44 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,57 +1,48 @@
cmake_minimum_required(VERSION 3.12.4)

if(NOT CMAKE_VERSION VERSION_LESS 3.0)
cmake_policy(SET CMP0048 NEW)
endif()
cmake_minimum_required(VERSION 3.28.3)

project(DistributedATS)
#set(CMAKE_SUPPRESS_REGENERATION true)

# Find requirements
if(NOT fastcdr_FOUND)
find_package(fastcdr REQUIRED)
endif()

if(NOT fastdds_FOUND)
find_package(fastdds 3 REQUIRED)
endif()
set(CMAKE_PREFIX_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

FIND_PACKAGE( Boost 1.40 COMPONENTS program_options REQUIRED )
INCLUDE_DIRECTORIES( ${Boost_INCLUDE_DIR} )
link_directories(${Boost_LIBRARY_DIRS})

link_directories(${QUICKFIX_INSTALL_PREFIX}/lib)

include_directories(Common)
add_subdirectory(GenTools/idl)

include_directories(GenTools/idl)
add_subdirectory(FIXGateway/src)
add_subdirectory(DataService/src)
add_subdirectory(MatchingEngine/src)
add_subdirectory(LatencyTest)

set(CMAKE_XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS "-o linker-signed")

install(DIRECTORY MiscATS DESTINATION ${CMAKE_INSTALL_PREFIX})
install(CODE "
file(GLOB_RECURSE SCRIPT_FILES
\"\${CMAKE_INSTALL_PREFIX}/MiscATS/*.sh\")
foreach(script \${SCRIPT_FILES})
execute_process(COMMAND chmod +x \${script})
endforeach()
")
install(FILES FIXGateway/scripts/fixgateway.sh
DataService/scripts/dataservice.sh
MatchingEngine/scripts/matchingengine.sh
find_package( Boost )
find_package( DDS REQUIRED )
find_package( log4cxx REQUIRED )
find_package( quickfix REQUIRED )
find_package( liquibook REQUIRED )

set(DDS_INCLUDE_DIR "${DDS_INSTALL_PREFIX}/include")
set(DDS_LIBRARY_DIR "${DDS_INSTALL_PREFIX}/lib")
set(QUICKFIX_INCLUDE_DIR "${QUICKFIX_INSTALL_PREFIX}/include")
set(QUICKFIX_LIBRARY_DIR "${QUICKFIX_INSTALL_PREFIX}/lib")
set(LOG4CXX_INCLUDE_DIR "${LOG4CXX_INSTALL_PREFIX}/include")
set(LOG4CXX_LIBRARY_DIR "${LOG4CXX_INSTALL_PREFIX}/lib")

set(LIQUIBOOK_INCLUDE_DIR "${LIQUIBOOK_INSTALL_PREFIX}/include")

include_directories( Common )
add_subdirectory( GenTools/idl )

include_directories( GenTools/idl )
add_subdirectory( FIXGateway/src )
add_subdirectory( DataService/src )
add_subdirectory( MatchingEngine/src )
add_subdirectory( LatencyTest )

install(DIRECTORY ${CMAKE_SOURCE_DIR}/MiscATS/
DESTINATION MiscATS
FILES_MATCHING PATTERN "*.db" PATTERN "*.py" PATTERN "*.ini" PATTERN "*.cfg" PATTERN "*.json")

install(FILES FIXGateway/scripts/fix_gateway_manager.py
DataService/scripts/data_service_manager.py
MatchingEngine/scripts/matching_engine_manager.py
DESTINATION scripts
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
GROUP_READ GROUP_EXECUTE
WORLD_READ WORLD_EXECUTE)

install(FILES config/log4cxx.xml DESTINATION config)
install(FILES FIXGateway/spec/FIX44.xml DESTINATION spec)
install( FILES config/log4cxx.xml DESTINATION config )
install( FILES FIXGateway/spec/FIX44.xml DESTINATION spec )
107 changes: 107 additions & 0 deletions DataService/scripts/data_service_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
#!/usr/bin/env python3

import os
import sys
import time
import subprocess
from pathlib import Path
import psutil

PROGNAME = "DataService"


def get_config_file():
if len(sys.argv) < 3:
print(f"Usage: {sys.argv[0]} [start|stop|check] <config_file>")
sys.exit(1)
return sys.argv[2]


def get_paths(config_file):
basedir = os.environ.get("BASEDIR_ATS", ".")
dats_home = os.environ.get("DATS_HOME")
if not dats_home:
print("DATS_HOME is not set.")
sys.exit(1)

config_path = Path(basedir) / "config" / config_file
log_path = Path(basedir) / "logs" / f"{PROGNAME}.{config_file}.console.log"
binary_path = Path(dats_home) / "bin" / PROGNAME
return binary_path, config_path, log_path, basedir


def source_dats_env():
dats_home = os.environ.get("DATS_HOME")
env_script = Path(dats_home) / "dats_env.sh"
if env_script.exists():
subprocess.call(f"source {env_script}", shell=True, executable="/bin/bash")


def check_process(config_path):
for proc in psutil.process_iter(['pid', 'cmdline']):
try:
cmdline = proc.info['cmdline']
if cmdline and PROGNAME in cmdline[0] and str(config_path) in ' '.join(cmdline):
print(f"{PROGNAME} [{config_path.name}] is running - {proc.pid}")
return proc.pid
except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
continue
print(f"{PROGNAME} [{config_path.name}] is not running")
return None


def start_process(binary_path, config_path, log_path):
print(f"Starting: {PROGNAME} -c {config_path}")
for key in sorted(os.environ):
print(f"{key}={os.environ[key]}")
if check_process(config_path) is None:
with open(log_path, "a") as f:
subprocess.Popen([str(binary_path), "-c", str(config_path)],
stdout=f, stderr=subprocess.STDOUT)
time.sleep(1)
check_process(config_path)


def stop_process(config_path):
cmd_str = f"{PROGNAME} -c {config_path}"
print(f"Stopping: {cmd_str}")
pid = check_process(config_path)
if pid:
os.system(f"pkill -SIGTERM -f \"{cmd_str}\"")
time.sleep(1)

for _ in range(10):
if check_process(config_path) is None:
break
time.sleep(1)
else:
os.system(f"pkill -KILL -U {os.getuid()} -f \"{cmd_str}\"")


def main():
if len(sys.argv) < 3:
print(f"Usage: {sys.argv[0]} [start|stop|check] <config_file>")
sys.exit(1)

command = sys.argv[1].lower()
config_file = get_config_file()

binary_path, config_path, log_path, basedir = get_paths(config_file)
source_dats_env()

if command == "start":
start_process(binary_path, config_path, log_path)
elif command == "stop":
stop_process(config_path)
elif command == "check":
check_process(config_path)
else:
print("Unknown command")
sys.exit(1)

with open(log_path, "a") as f:
f.write(f"{time.strftime('%Y%m%d.%H%M%S')} run-done : pid,{os.getpid()}\n")


if __name__ == "__main__":
main()
49 changes: 29 additions & 20 deletions DataService/src/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,36 +1,45 @@
cmake_minimum_required(VERSION 3.12.4)

if(NOT CMAKE_VERSION VERSION_LESS 3.0)
cmake_policy(SET CMP0048 NEW)
endif()
message(STATUS "Current source dir: ${CMAKE_CURRENT_SOURCE_DIR}")
message(DDS_INCLUDE_DIR="${DDS_INCLUDE_DIR}")
message(DDS_LIBRARY_DIR="${DDS_LIBRARY_DIR}")

project(DataService)
message(QUICKFIX_INCLUDE_DIR="${QUICKFIX_INCLUDE_DIR}")
message(QUICKFIX_LIBRARY_DIR="${QUICKFIX_LIBRARY_DIR}")

# Find requirements
if(NOT fastcdr_FOUND)
find_package(fastcdr REQUIRED)
endif()
include_directories(${DDS_INCLUDE_DIR})
link_directories(${DDS_LIBRARY_DIR})

if(NOT fastdds_FOUND)
find_package(fastdds 3 REQUIRED)
endif()
include_directories(${QUICKFIX_INCLUDE_DIR})
link_directories(${QUICKFIX_LIBRARY_DIR})

find_package(log4cxx REQUIRED)
include_directories(${LOG4CXX_INCLUDE_DIR})
link_directories(${LOG4CXX_LIBRARY_DIR})

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIRS})

link_directories(${CMAKE_INSTALL_PREFIX}/lib)
file(GLOB DISTRIBUTED_ATS_DATASERVICE_SRC *.cpp)

file(GLOB DISTRIBUTED_ATS_DATASERVICE_SRC *)
add_executable(DataService ${DISTRIBUTED_ATS_DATASERVICE_SRC})
link_directories(DistributedATSLib quickfix log4cxx)
target_link_libraries(DataService DistributedATSLib quickfix log4cxx boost_program_options sqlite3)

find_package(Boost REQUIRED COMPONENTS program_options)
include_directories(${Boost_INCLUDE_DIRS})

target_link_libraries(DataService
PRIVATE
DistributedATSLib
quickfix
log4cxx
Boost::program_options
fastcdr
fastdds
sqlite3
)

set(CMAKE_XCODE_ATTRIBUTE_OTHER_CODE_SIGN_FLAGS "-o linker-signed")

install(TARGETS DataService
install(TARGETS DataService
PUBLIC_HEADER
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dats
)
2 changes: 2 additions & 0 deletions DataService/src/MarketDataService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,8 @@ int MarketDataService::service (void)
std::this_thread::sleep_for(std::chrono::duration<long double, std::milli>(1000));
}
};

return 0;
}

bool MarketDataService::populateMarketDataSnapshotFullRefresh( const Instrument& instrument,
Expand Down
3 changes: 2 additions & 1 deletion DataService/src/RefDataService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,8 @@ void RefDataService::populateUserGroupInstrumentMap()
" m.market_name=im_map.market_name and " \
" im_map.market_name=ugm_map.market_name");

LOG4CXX_INFO(logger, "Populating security list");
LOG4CXX_INFO(logger, "Populating security list : ");
LOG4CXX_INFO(logger, "Query : " + sqliteQuery.getQuery());

m_sqliteConnection->execute(sqliteQuery);

Expand Down
9 changes: 6 additions & 3 deletions DataService/src/SQLiteConnection.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,6 @@ class SQLiteQuery
public:
SQLiteQuery( const std::string& query ) : m_stmt(0), m_query( query )
{

std::cout << query << std::endl;
}

~SQLiteQuery()
Expand Down Expand Up @@ -95,6 +93,11 @@ class SQLiteQuery
{
return m_rows[row][column];
}

std::string getQuery()
{
return m_query;
}

private:
sqlite3_stmt* m_stmt;
Expand Down Expand Up @@ -132,7 +135,7 @@ class SQLiteConnection
private:
void connect()
{
int rc = sqlite3_open(m_pDatabase.getDatabase().c_str(), &m_pConnection);
int rc = sqlite3_open_v2(m_pDatabase.getDatabase().c_str(), &m_pConnection, SQLITE_OPEN_READONLY, nullptr);

if (rc != SQLITE_OK)
{
Expand Down
Loading