diff --git a/lib/rex/book/limit_volume_tracker.rb b/lib/rex/book/limit_volume_tracker.rb index 8cf42d5..593976e 100644 --- a/lib/rex/book/limit_volume_tracker.rb +++ b/lib/rex/book/limit_volume_tracker.rb @@ -1,6 +1,7 @@ module Rex module Book class LimitVolumeTracker + include Enumerable LimitVolumeChange = Struct.new(:side, :price, :quantity) attr_reader :volumes @@ -24,6 +25,18 @@ module Rex ] end + def each + volumes.each do |side, limits| + limits.each do |limit, volume| + yield LimitVolumeChange.new( + side ? :buy : :sell, + limit, + volume + ) + end + end + end + def remove_order(order) volumes[order.is_buy][order.price] -= order.remaining_quantity diff --git a/spec/book/limit_volume_tracker_spec.rb b/spec/book/limit_volume_tracker_spec.rb index 87c5e87..92a89d4 100644 --- a/spec/book/limit_volume_tracker_spec.rb +++ b/spec/book/limit_volume_tracker_spec.rb @@ -37,6 +37,22 @@ RSpec.describe Rex::Book::LimitVolumeTracker do end end + describe "#each" do + before do + instance.add_order(sell_order) + end + + it "retuns all limit volumes" do + expect(instance.to_a).to eq([ + Rex::Book::LimitVolumeTracker::LimitVolumeChange.new( + :sell, + 100, + 250 + ) + ]) + end + end + describe "#process_trade" do let(:trade) do Rex::Book::Trade.new(