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