From 1bdb619f6c0f3bd52b5702790a275059ebe5d046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20K=C3=A4chele?= Date: Sat, 3 Feb 2024 21:04:09 +0100 Subject: [PATCH] Implement basic capped trade tracker --- lib/rex/book.rb | 1 + lib/rex/book/trade_tracker.rb | 29 +++++++++++++++++++++++++++++ spec/book/trade_tracker_spec.rb | 24 ++++++++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 lib/rex/book/trade_tracker.rb create mode 100644 spec/book/trade_tracker_spec.rb diff --git a/lib/rex/book.rb b/lib/rex/book.rb index 5e883d7..e4a033f 100644 --- a/lib/rex/book.rb +++ b/lib/rex/book.rb @@ -6,6 +6,7 @@ require_relative "book/order" require_relative "book/limit_order_book" require_relative "book/matcher" require_relative "book/limit_volume_tracker" +require_relative "book/trade_tracker" module Rex module Book diff --git a/lib/rex/book/trade_tracker.rb b/lib/rex/book/trade_tracker.rb new file mode 100644 index 0000000..e86c3e4 --- /dev/null +++ b/lib/rex/book/trade_tracker.rb @@ -0,0 +1,29 @@ +module Rex + module Book + class TradeTracker + DEFAULT_TRADE_HISTORY_LIMIT = 200 + + attr_reader :trades + + def initialize(limit: DEFAULT_TRADE_HISTORY_LIMIT) + @limit = limit + @trades = [] + end + + def add(trade) + @trades.push(trade) + cap + end + + def fetch_trades(limit) + @trades.last(limit) + end + + private + + def cap + @trades = @trades.last(@limit) + end + end + end +end diff --git a/spec/book/trade_tracker_spec.rb b/spec/book/trade_tracker_spec.rb new file mode 100644 index 0000000..6e4f89d --- /dev/null +++ b/spec/book/trade_tracker_spec.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +RSpec.describe Rex::Book::TradeTracker do + let(:n) { 1 } + subject(:instance) { described_class.new(limit: n) } + + before do + instance.add(10) + instance.add(11) + end + + describe "#trades" do + it "returns only the last n trades" do + expect(instance.trades).to eq([11]) + end + end + + describe "#fetch_trades" do + let(:n) { 3 } + it "returns only the last n trades" do + expect(instance.fetch_trades(1)).to eq([11]) + end + end +end