gekko 0.5.0 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6e807cf299a74840caedd3ab554af8b30c797d51
4
- data.tar.gz: bce631e42323b43fd1864033a8e8bd6f4c97ffea
3
+ metadata.gz: 486109d7779f0dad9f4295d86f7c4e04a190aaea
4
+ data.tar.gz: 2b7855c833b96c746d9877145d5df44078cd306e
5
5
  SHA512:
6
- metadata.gz: ce1211699c74fc7232ddfbbc83db30d71fa45445a78c2b54c6ba547cd62b6d18d8d93b11486642b4ed6e6dfc496e9ab8acb32f55c916c0ac139edc6a64e0b9df
7
- data.tar.gz: 31f755d6134b1650909bfb8860a28ab1a89e4732ee529fb87fb88161909acca8c6a51569bd7dbeb580997f76c11d33c8091a792b81c54f31eb6ab7eca74ce161
6
+ metadata.gz: 2374b2b91e9873fc91d61395dac62face02d86644949b82a1fe775745836e78f58695a8b2ab2ead6cdc3eb60a5b093de5ace2fef59fc49d930a9e3b11d234d73
7
+ data.tar.gz: 2bdbb61d58115c18f5cdb0907f6f4f2a6fb6bae2ccc7275950c1a1a7faab4495fd7850dd20ea72ae8eff10f3781837057ee2ca11d688b2d76d99a9ab91cc6bad
data/lib/gekko/book.rb CHANGED
@@ -4,6 +4,7 @@ Oj.default_options = { mode: :compat }
4
4
  require 'gekko/book_side'
5
5
  require 'gekko/tape'
6
6
  require 'gekko/errors'
7
+ require 'gekko/symbolize_keys'
7
8
 
8
9
  module Gekko
9
10
 
@@ -12,6 +13,8 @@ module Gekko
12
13
  #
13
14
  class Book
14
15
 
16
+ extend SymbolizeKeys
17
+
15
18
  attr_accessor :pair, :bids, :asks, :tape, :received, :base_precision
16
19
 
17
20
  def initialize(pair, opts = {})
@@ -222,16 +225,6 @@ module Gekko
222
225
  Book.new(hsh[:pair], hsh)
223
226
  end
224
227
 
225
- #
226
- # Symbolizes keys of a non-nested +Hash+
227
- #
228
- # @param hsh [Hash] The +Hash+ for which we want to symbolize the keys
229
- # @return [Hash] A copy of the parameter with all first-level keys symbolized
230
- #
231
- def self.symbolize_keys(hsh)
232
- hsh.inject({}) { |mem, obj| mem[obj[0].to_sym] = obj[1]; mem }
233
- end
234
-
235
228
  end
236
229
  end
237
230
 
@@ -13,7 +13,7 @@ module Gekko
13
13
  raise "Incorrect side <#{side}>" unless [:bid, :ask].include?(side)
14
14
  @side = side
15
15
 
16
- opts[:orders] && opts[:orders].each_with_index { |obj, idx| self[idx] = Order.load(obj) }
16
+ opts[:orders] && opts[:orders].each_with_index { |obj, idx| self[idx] = Order.from_hash(obj) }
17
17
  end
18
18
 
19
19
  #
@@ -8,10 +8,12 @@ module Gekko
8
8
 
9
9
  attr_accessor :quote_margin, :remaining_quote_margin
10
10
 
11
- def initialize(side, id, size, quote_margin, expiration = nil)
12
- super(side, id, size, expiration)
11
+ def initialize(side, id, size, quote_margin)
12
+ super(side, id, size)
13
+
13
14
  @quote_margin = quote_margin
14
15
  @remaining_quote_margin = @quote_margin
16
+
15
17
  raise 'Quote currency margin must be provided for a market bid' if quote_margin.nil? && bid?
16
18
  raise 'Quote currency margin can not be specified for a market ask' if quote_margin && ask?
17
19
  end
data/lib/gekko/order.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'gekko/serialization'
2
+
1
3
  module Gekko
2
4
 
3
5
  #
@@ -7,6 +9,8 @@ module Gekko
7
9
  #
8
10
  class Order
9
11
 
12
+ include Gekko::Serialization
13
+
10
14
  attr_accessor :id, :side, :size, :remaining, :price, :expiration, :created_at
11
15
 
12
16
  def initialize(side, id, size, expiration = nil)
@@ -24,36 +28,6 @@ module Gekko
24
28
  raise 'The order creation timestamp can''t be nil' if !@created_at
25
29
  end
26
30
 
27
-
28
- #
29
- # Loads an +Order+ from a +Hash+. Only limit orders are supported as market
30
- # orders should never need to get serialized
31
- #
32
- # @return [LimitOrder] The unserialized order
33
- #
34
- def self.load(hsh)
35
- order = LimitOrder.new(hsh[:side], UUID.parse(hsh[:id]), hsh[:size], hsh[:price], hsh[:expiration])
36
- order.created_at = hsh[:created_at]
37
- order
38
- end
39
-
40
- #
41
- # Returns a +Hash+ representation of this +Order+ instance
42
- #
43
- # @return [Hash] The serializable representation
44
- #
45
- def to_hash
46
- {
47
- id: @id,
48
- side: @side,
49
- size: @size,
50
- price: @price,
51
- remaining: @remaining,
52
- expiration: @expiration,
53
- created_at: @created_at
54
- }
55
- end
56
-
57
31
  #
58
32
  # Returns +true+ if this order can execute against +limit_order+
59
33
  #
@@ -0,0 +1,89 @@
1
+ require 'gekko/symbolize_keys'
2
+
3
+ module Gekko
4
+
5
+ #
6
+ # Handles JSON serialization and deserialization of trade orders
7
+ #
8
+ module Serialization
9
+
10
+ #
11
+ # Make our class methods available directly on +Gekko::Order+
12
+ #
13
+ def self.included(base)
14
+ base.extend(ClassMethods)
15
+ end
16
+
17
+ #
18
+ # De-serialization methods to be made available directly on +Gekko::Order+
19
+ #
20
+ module ClassMethods
21
+
22
+ include SymbolizeKeys
23
+
24
+ #
25
+ # Deserializes a +Gekko::Order+ subclass from JSON
26
+ #
27
+ # @param serialized [String] The JSON string
28
+ # @return [Gekko::Order] The deserialized trade order
29
+ #
30
+ def deserialize(serialized)
31
+ from_hash(symbolize_keys(Oj.load(serialized)))
32
+ end
33
+
34
+ #
35
+ # Initializes a +Gekko::Order+ subclass from a +Hash+ instance
36
+ #
37
+ # @param hsh [Hash] The order data
38
+ # @return [Gekko::Order] A trade order
39
+ #
40
+ def from_hash(hsh)
41
+ order = if hsh[:price]
42
+ LimitOrder.new(hsh[:side], UUID.parse(hsh[:id]), hsh[:size], hsh[:price], hsh[:expiration])
43
+ else
44
+ MarketOrder.new(hsh[:side], UUID.parse(hsh[:id]), hsh[:size], hsh[:quote_margin])
45
+ end
46
+
47
+ order.created_at = hsh[:created_at] if hsh[:created_at]
48
+ order
49
+ end
50
+ end
51
+
52
+ #
53
+ # Serializes a +Gekko::Order+ as JSON
54
+ #
55
+ # @param order [Gekko::Order] The order to serialize
56
+ # @return [String] The JSON string
57
+ #
58
+ def serialize
59
+ Oj.dump(to_hash)
60
+ end
61
+
62
+ #
63
+ # Returns a +Hash+ representation of this +Order+ instance
64
+ #
65
+ # @return [Hash] The serializable representation
66
+ #
67
+ def to_hash
68
+ hsh = {
69
+ id: id.to_s,
70
+ side: side,
71
+ size: size,
72
+ price: price,
73
+ remaining: remaining,
74
+ expiration: expiration,
75
+ created_at: created_at
76
+ }
77
+
78
+ if is_a?(Gekko::MarketOrder)
79
+ hsh.delete(:price)
80
+ hsh[:quote_margin] = quote_margin
81
+ hsh[:remaining_quote_margin] = remaining_quote_margin
82
+ end
83
+
84
+ hsh
85
+ end
86
+
87
+ end
88
+ end
89
+
@@ -0,0 +1,20 @@
1
+ module Gekko
2
+
3
+ #
4
+ # Utility module to avoid monkey-patching +Hash+
5
+ #
6
+ module SymbolizeKeys
7
+
8
+ #
9
+ # Symbolizes keys of a non-nested +Hash+
10
+ #
11
+ # @param hsh [Hash] The +Hash+ for which we want to symbolize the keys
12
+ # @return [Hash] A copy of the parameter with all first-level keys symbolized
13
+ #
14
+ def symbolize_keys(hsh)
15
+ hsh.inject({}) { |mem, obj| mem[obj[0].to_sym] = obj[1]; mem }
16
+ end
17
+
18
+ end
19
+ end
20
+
data/lib/gekko/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Gekko
2
-
2
+
3
3
  # The Gekko version string
4
- VERSION = '0.5.0'
4
+ VERSION = '0.5.2'
5
5
 
6
6
  end
metadata CHANGED
@@ -1,153 +1,153 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gekko
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - David FRANCOIS
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-19 00:00:00.000000000 Z
11
+ date: 2016-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: uuidtools
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '2.1'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: oj
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '2.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '2.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: pry
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0.10'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0.10'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
61
  version: '3.1'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ~>
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '3.1'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ~>
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
75
  version: '10.3'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ~>
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '10.3'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: yard
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ~>
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0.8'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ~>
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0.8'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: timecop
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ~>
101
+ - - "~>"
102
102
  - !ruby/object:Gem::Version
103
103
  version: '0.7'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ~>
108
+ - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0.7'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: redcarpet
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - ~>
115
+ - - "~>"
116
116
  - !ruby/object:Gem::Version
117
117
  version: '3.1'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ~>
122
+ - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: '3.1'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: simplecov
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - ~>
129
+ - - "~>"
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0.9'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - ~>
136
+ - - "~>"
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0.9'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: coveralls
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - ~>
143
+ - - "~>"
144
144
  - !ruby/object:Gem::Version
145
145
  version: '0.7'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - ~>
150
+ - - "~>"
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0.7'
153
153
  description: Gekko is a bare-bones order matcher whose task is to accept orders and
@@ -167,6 +167,8 @@ files:
167
167
  - lib/gekko/limit_order.rb
168
168
  - lib/gekko/market_order.rb
169
169
  - lib/gekko/order.rb
170
+ - lib/gekko/serialization.rb
171
+ - lib/gekko/symbolize_keys.rb
170
172
  - lib/gekko/tape.rb
171
173
  - lib/gekko/version.rb
172
174
  homepage: https://paymium.com
@@ -179,17 +181,17 @@ require_paths:
179
181
  - lib
180
182
  required_ruby_version: !ruby/object:Gem::Requirement
181
183
  requirements:
182
- - - '>='
184
+ - - ">="
183
185
  - !ruby/object:Gem::Version
184
186
  version: '0'
185
187
  required_rubygems_version: !ruby/object:Gem::Requirement
186
188
  requirements:
187
- - - '>='
189
+ - - ">="
188
190
  - !ruby/object:Gem::Version
189
191
  version: 1.3.6
190
192
  requirements: []
191
193
  rubyforge_project:
192
- rubygems_version: 2.4.2
194
+ rubygems_version: 2.5.1
193
195
  signing_key:
194
196
  specification_version: 4
195
197
  summary: An in-memory order matching engine.