77 lines
2.8 KiB
Python
77 lines
2.8 KiB
Python
"""Tests for market data adapters."""
|
|
|
|
import unittest
|
|
|
|
from deltatrace.adapters import FIXFeedAdapter, SandboxExchangeAdapter
|
|
from deltatrace.event_graph import EventType
|
|
|
|
|
|
class TestFIXFeedAdapter(unittest.TestCase):
|
|
def setUp(self):
|
|
self.adapter = FIXFeedAdapter()
|
|
|
|
def test_name(self):
|
|
self.assertEqual(self.adapter.name, "fix_feed")
|
|
|
|
def test_ingest_market_data_snapshot(self):
|
|
msg = {"35": "W", "55": "AAPL", "bid": "185.50", "ask": "185.55", "44": "185.52", "38": "1000"}
|
|
events = self.adapter.ingest(msg)
|
|
self.assertEqual(len(events), 1)
|
|
self.assertEqual(events[0].event_type, EventType.MD_TICK)
|
|
self.assertEqual(events[0].payload["symbol"], "AAPL")
|
|
self.assertAlmostEqual(events[0].payload["bid"], 185.50)
|
|
|
|
def test_ingest_execution_report(self):
|
|
msg = {"35": "8", "55": "AAPL", "54": "1", "44": "185.50", "38": "500", "150": "F"}
|
|
events = self.adapter.ingest(msg)
|
|
self.assertEqual(len(events), 1)
|
|
self.assertEqual(events[0].event_type, EventType.FILL)
|
|
|
|
def test_ingest_new_order(self):
|
|
msg = {"35": "D", "55": "AAPL", "54": "1", "44": "185.50", "38": "500"}
|
|
events = self.adapter.ingest(msg)
|
|
self.assertEqual(len(events), 1)
|
|
self.assertEqual(events[0].event_type, EventType.ORDER)
|
|
|
|
def test_ingest_unknown_type(self):
|
|
msg = {"35": "Z", "55": "AAPL"}
|
|
events = self.adapter.ingest(msg)
|
|
self.assertEqual(len(events), 0)
|
|
|
|
def test_source_adapter_set(self):
|
|
msg = {"35": "W", "55": "AAPL", "44": "100", "38": "10"}
|
|
events = self.adapter.ingest(msg)
|
|
self.assertEqual(events[0].source_adapter, "fix_feed")
|
|
|
|
|
|
class TestSandboxExchangeAdapter(unittest.TestCase):
|
|
def setUp(self):
|
|
self.adapter = SandboxExchangeAdapter(fill_rate=1.0, latency_ms=0.1)
|
|
|
|
def test_name(self):
|
|
self.assertEqual(self.adapter.name, "sandbox_exchange")
|
|
|
|
def test_ingest_tick(self):
|
|
data = {"type": "tick", "symbol": "AAPL", "bid": 185.0, "ask": 185.05, "last": 185.02}
|
|
events = self.adapter.ingest(data)
|
|
self.assertEqual(len(events), 1)
|
|
self.assertEqual(events[0].event_type, EventType.MD_TICK)
|
|
|
|
def test_ingest_order_with_fill(self):
|
|
data = {"type": "order", "symbol": "AAPL", "price": 185.0, "qty": 100, "side": "buy"}
|
|
events = self.adapter.ingest(data)
|
|
self.assertEqual(len(events), 2)
|
|
self.assertEqual(events[0].event_type, EventType.ORDER)
|
|
self.assertEqual(events[1].event_type, EventType.FILL)
|
|
|
|
def test_generate_ticks(self):
|
|
ticks = self.adapter.generate_ticks("AAPL", 10, 185.0)
|
|
self.assertEqual(len(ticks), 10)
|
|
for t in ticks:
|
|
self.assertEqual(t.event_type, EventType.MD_TICK)
|
|
self.assertEqual(t.payload["symbol"], "AAPL")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|