cryptum 0.0.325 → 0.0.327
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/cryptum +1 -0
- data/lib/cryptum/event.rb +0 -173
- data/lib/cryptum/option/choice.rb +1 -0
- data/lib/cryptum/option.rb +6 -0
- data/lib/cryptum/order_book/generate.rb +10 -0
- data/lib/cryptum/order_book/indicator.rb +0 -1
- data/lib/cryptum/ui/ticker.rb +6 -3
- data/lib/cryptum/version.rb +1 -1
- data/lib/cryptum/web_sock/event_machine.rb +139 -3
- metadata +2 -3
- data/lib/cryptum/order_book/weighted_avg.rb +0 -157
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a71bdfaffa2d0d506321a5eb061b6e813b1191b8dd27b9a9e4acf874b9d296e9
|
|
4
|
+
data.tar.gz: cb2165ea3267e05058a242187b049ea3b68ed3bfb013688b2f044ea4683b93fa
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5a67eec57d1eb1725424b01b34d4f2d6edee802a8d101e99c0cddece8f9c485472294b8c0b0464d492218db7c22d34f00b59f60ca4a451833d38c7b09f7a1b24
|
|
7
|
+
data.tar.gz: c606e40f2643f2fe06d2a887c0b3a0471d791b12841ec2815ed2a7ade3b4a0d8ddb46b44fa6f79e4673e0bc4c5649f7690e17b787fd4b0c499f8ac00821addfe
|
data/bin/cryptum
CHANGED
data/lib/cryptum/event.rb
CHANGED
|
@@ -17,179 +17,6 @@ module Cryptum
|
|
|
17
17
|
autoload :Scroll, 'cryptum/event/scroll'
|
|
18
18
|
autoload :Sell, 'cryptum/event/sell'
|
|
19
19
|
|
|
20
|
-
# Supported Method Parameters::
|
|
21
|
-
# Cryptum::Event.parse(
|
|
22
|
-
# )
|
|
23
|
-
|
|
24
|
-
public_class_method def self.parse(opts = {})
|
|
25
|
-
option_choice = opts[:option_choice]
|
|
26
|
-
env = opts[:env]
|
|
27
|
-
terminal_win = opts[:terminal_win]
|
|
28
|
-
event_history = opts[:event_history]
|
|
29
|
-
indicator_status = opts[:indicator_status]
|
|
30
|
-
# indicator_history = opts[:indicator_history]
|
|
31
|
-
bot_conf = opts[:bot_conf]
|
|
32
|
-
# ai_enabled = opts[:ai_enabled]
|
|
33
|
-
|
|
34
|
-
# candles = event_history.order_book[:candles]
|
|
35
|
-
# order_history = event_history.order_book[:order_history]
|
|
36
|
-
this_product = event_history.order_book[:this_product]
|
|
37
|
-
fiat = this_product[:quote_currency]
|
|
38
|
-
fiat_portfolio_file = "#{option_choice.session_root}/order_books/#{fiat}_PORTFOLIO.json"
|
|
39
|
-
|
|
40
|
-
# Determine if Summary UI needs updated data
|
|
41
|
-
event_history = Cryptum::Portfolio::Balance.refresh(
|
|
42
|
-
env: env,
|
|
43
|
-
option_choice: option_choice,
|
|
44
|
-
terminal_win: terminal_win,
|
|
45
|
-
event_history: event_history,
|
|
46
|
-
fiat_portfolio_file: fiat_portfolio_file
|
|
47
|
-
)
|
|
48
|
-
|
|
49
|
-
# If the Terminal Window has been Resized, Resize the UI
|
|
50
|
-
if Curses.cols != terminal_win.cols
|
|
51
|
-
terminal_win.cols = Curses.cols
|
|
52
|
-
terminal_win.ticker_ui_resize = true
|
|
53
|
-
terminal_win.market_trend_ui_resize = true
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
event_history = Cryptum::UI::Portfolio.refresh(
|
|
57
|
-
option_choice: option_choice,
|
|
58
|
-
portfolio_win: terminal_win.portfolio_section,
|
|
59
|
-
event_history: event_history,
|
|
60
|
-
key_press_event: terminal_win.key_press_event,
|
|
61
|
-
indicator_status: indicator_status,
|
|
62
|
-
bot_conf: bot_conf,
|
|
63
|
-
fiat_portfolio_file: fiat_portfolio_file
|
|
64
|
-
)
|
|
65
|
-
|
|
66
|
-
if event_history.event_type == :ticker ||
|
|
67
|
-
terminal_win.ticker_ui_resize
|
|
68
|
-
|
|
69
|
-
ticker_event = event_history.ticker_event = event_history.event if event_history.event_type == :ticker
|
|
70
|
-
ticker_event = event_history.ticker_event if terminal_win.ticker_ui_resize
|
|
71
|
-
Cryptum::UI::Ticker.refresh(
|
|
72
|
-
option_choice: option_choice,
|
|
73
|
-
start_time: event_history.start_time,
|
|
74
|
-
ticker_win: terminal_win.ticker_section,
|
|
75
|
-
key_press_event: terminal_win.key_press_event,
|
|
76
|
-
order_book: event_history.order_book,
|
|
77
|
-
event: ticker_event
|
|
78
|
-
)
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
Cryptum::UI::OrderTimer.refresh(
|
|
82
|
-
option_choice: option_choice,
|
|
83
|
-
event_history: event_history,
|
|
84
|
-
order_timer_win: terminal_win.order_timer_section,
|
|
85
|
-
indicator_status: indicator_status,
|
|
86
|
-
key_press_event: terminal_win.key_press_event
|
|
87
|
-
)
|
|
88
|
-
|
|
89
|
-
if event_history.event_type == :l2update ||
|
|
90
|
-
terminal_win.market_trend_ui_resize
|
|
91
|
-
|
|
92
|
-
market_trend_event = event_history.market_trend_event = event_history.event if event_history.event_type == :l2update
|
|
93
|
-
market_trend_event = event_history.market_trend_event if terminal_win.market_trend_ui_resize
|
|
94
|
-
event_history = Cryptum::UI::MarketTrend.refresh(
|
|
95
|
-
option_choice: option_choice,
|
|
96
|
-
market_trend_win: terminal_win.market_trend_section,
|
|
97
|
-
event_history: event_history,
|
|
98
|
-
key_press_event: terminal_win.key_press_event,
|
|
99
|
-
event: market_trend_event,
|
|
100
|
-
indicator_status: indicator_status,
|
|
101
|
-
bot_conf: bot_conf
|
|
102
|
-
)
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
indicator_status = Cryptum::UI::SignalEngine.refresh(
|
|
106
|
-
option_choice: option_choice,
|
|
107
|
-
signal_engine_win: terminal_win.signal_engine_section,
|
|
108
|
-
event_history: event_history,
|
|
109
|
-
key_press_event: terminal_win.key_press_event,
|
|
110
|
-
indicator_status: indicator_status,
|
|
111
|
-
bot_conf: bot_conf,
|
|
112
|
-
fiat_portfolio_file: fiat_portfolio_file
|
|
113
|
-
)
|
|
114
|
-
|
|
115
|
-
unless event_history.order_plan_details_win_active
|
|
116
|
-
event_history = Cryptum::UI::OrderPlan.refresh(
|
|
117
|
-
option_choice: option_choice,
|
|
118
|
-
order_plan_win: terminal_win.order_plan_section,
|
|
119
|
-
env: env,
|
|
120
|
-
event_history: event_history,
|
|
121
|
-
key_press_event: terminal_win.key_press_event,
|
|
122
|
-
indicator_status: indicator_status,
|
|
123
|
-
bot_conf: bot_conf,
|
|
124
|
-
fiat_portfolio_file: fiat_portfolio_file
|
|
125
|
-
)
|
|
126
|
-
recalc_op = event_history.recalculate_order_plan
|
|
127
|
-
order_plan = event_history.order_book[:order_plan]
|
|
128
|
-
terminal_win.key_press_event.key_w = true if (recalc_op || order_plan.empty?) &&
|
|
129
|
-
!event_history.red_pill
|
|
130
|
-
event_history.recalculate_order_plan = false
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
if event_history.order_plan_details_win_active
|
|
134
|
-
event_history = Cryptum::UI::OrderPlanDetails.refresh(
|
|
135
|
-
option_choice: option_choice,
|
|
136
|
-
order_plan_details_win: terminal_win.order_plan_details_section,
|
|
137
|
-
event_history: event_history,
|
|
138
|
-
key_press_event: terminal_win.key_press_event
|
|
139
|
-
)
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
unless event_history.order_execute_details_win_active
|
|
143
|
-
event_history = Cryptum::UI::OrderExecution.refresh(
|
|
144
|
-
option_choice: option_choice,
|
|
145
|
-
order_execute_win: terminal_win.order_execute_section,
|
|
146
|
-
env: env,
|
|
147
|
-
event_history: event_history,
|
|
148
|
-
key_press_event: terminal_win.key_press_event,
|
|
149
|
-
indicator_status: indicator_status,
|
|
150
|
-
bot_conf: bot_conf,
|
|
151
|
-
fiat_portfolio_file: fiat_portfolio_file
|
|
152
|
-
)
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
if event_history.order_execute_details_win_active
|
|
156
|
-
event_history = Cryptum::UI::OrderExecuteDetails.refresh(
|
|
157
|
-
option_choice: option_choice,
|
|
158
|
-
order_execute_details_win: terminal_win.order_execute_details_section,
|
|
159
|
-
event_history: event_history,
|
|
160
|
-
key_press_event: terminal_win.key_press_event
|
|
161
|
-
)
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
# Refresh Command Section for Cryptum Session Usage
|
|
165
|
-
Cryptum::UI::Command.refresh(
|
|
166
|
-
command_win: terminal_win.command_section,
|
|
167
|
-
key_press_event: terminal_win.key_press_event
|
|
168
|
-
)
|
|
169
|
-
|
|
170
|
-
# last_ticker_price = event_history.order_book[:ticker_price].to_f
|
|
171
|
-
# second_to_last_ticker_price = event_history.order_book[:ticker_price_second_to_last].to_f
|
|
172
|
-
# third_to_last_ticker_price = event_history.order_book[:ticker_price_third_to_last].to_f
|
|
173
|
-
|
|
174
|
-
event_history
|
|
175
|
-
rescue LoadError => e
|
|
176
|
-
# This happens when autoloading modules fail.
|
|
177
|
-
File.open('/tmp/cryptum-errors.txt', 'a') do |f|
|
|
178
|
-
f.puts Time.now.strftime('%Y-%m-%d %H:%M:%S.%N %z')
|
|
179
|
-
f.puts "Module: #{self}"
|
|
180
|
-
f.puts "#{e}\n\n\n"
|
|
181
|
-
end
|
|
182
|
-
|
|
183
|
-
retry
|
|
184
|
-
rescue Interrupt
|
|
185
|
-
# Exit Gracefully if CTRL+C is Pressed During Session
|
|
186
|
-
Cryptum.exit_gracefully(which_self: self)
|
|
187
|
-
rescue StandardError => e
|
|
188
|
-
raise e
|
|
189
|
-
ensure
|
|
190
|
-
$stdout.flush
|
|
191
|
-
end
|
|
192
|
-
|
|
193
20
|
# Display Usage for this Module
|
|
194
21
|
|
|
195
22
|
public_class_method def self.help
|
data/lib/cryptum/option.rb
CHANGED
|
@@ -41,6 +41,12 @@ module Cryptum
|
|
|
41
41
|
'<Optional - HTTP Proxy e.g. "http://127.0.0.1:8080">'
|
|
42
42
|
) { |p| option_choice.proxy = p }
|
|
43
43
|
|
|
44
|
+
options.on(
|
|
45
|
+
'-R',
|
|
46
|
+
'--[no-]reset-session-countdown',
|
|
47
|
+
'<Optional - Reset Timers / Market Trend Stats at Session Init (Defaults to false)>'
|
|
48
|
+
) { |t| option_choice.reset_session_countdown = t }
|
|
49
|
+
|
|
44
50
|
options.on(
|
|
45
51
|
'-rPATH',
|
|
46
52
|
'--session-root=PATH',
|
|
@@ -82,6 +82,16 @@ module Cryptum
|
|
|
82
82
|
end
|
|
83
83
|
|
|
84
84
|
event_history.order_book = order_book
|
|
85
|
+
if option_choice.reset_session_countdown
|
|
86
|
+
event_history.order_book[:market_trend][:buy] = 0
|
|
87
|
+
event_history.order_book[:market_trend][:sell] = 0
|
|
88
|
+
event_history.order_book[:last_trend_reset] = Time.now.strftime(
|
|
89
|
+
'%Y-%m-%d %H:%M:%S.%N%z'
|
|
90
|
+
)
|
|
91
|
+
event_history.order_book[:last_order_exec] = Time.now.strftime(
|
|
92
|
+
'%Y-%m-%d %H:%M:%S.%N%z'
|
|
93
|
+
)
|
|
94
|
+
end
|
|
85
95
|
|
|
86
96
|
event_history
|
|
87
97
|
rescue StandardError => e
|
data/lib/cryptum/ui/ticker.rb
CHANGED
|
@@ -7,13 +7,12 @@ module Cryptum
|
|
|
7
7
|
module UI
|
|
8
8
|
module Ticker
|
|
9
9
|
public_class_method def self.refresh(opts = {})
|
|
10
|
-
# option_choice = opts[:option_choice]
|
|
11
10
|
start_time = opts[:start_time]
|
|
12
11
|
ticker_win = opts[:ticker_win]
|
|
13
|
-
|
|
14
|
-
order_book = opts[:order_book]
|
|
12
|
+
event_history = opts[:event_history]
|
|
15
13
|
event = opts[:event]
|
|
16
14
|
|
|
15
|
+
order_book = event_history.order_book
|
|
17
16
|
this_product = order_book[:this_product]
|
|
18
17
|
quote_increment = this_product[:quote_increment]
|
|
19
18
|
fiat_smallest_decimal = quote_increment.to_s.split('.')[-1].length
|
|
@@ -139,6 +138,8 @@ module Cryptum
|
|
|
139
138
|
highest_selling_price
|
|
140
139
|
)
|
|
141
140
|
)
|
|
141
|
+
|
|
142
|
+
event_history.order_book = order_book
|
|
142
143
|
# TODO: Everything Above this Line Needs to be Indicators ^
|
|
143
144
|
|
|
144
145
|
# UI
|
|
@@ -283,6 +284,8 @@ module Cryptum
|
|
|
283
284
|
)
|
|
284
285
|
|
|
285
286
|
ticker_win.refresh
|
|
287
|
+
|
|
288
|
+
event_history
|
|
286
289
|
rescue Interrupt
|
|
287
290
|
# Exit Gracefully if CTRL+C is Pressed During Session
|
|
288
291
|
Cryptum.exit_gracefully(which_self: self)
|
data/lib/cryptum/version.rb
CHANGED
|
@@ -55,23 +55,157 @@ module Cryptum
|
|
|
55
55
|
# Explore another way to decouple required events
|
|
56
56
|
# (such as keypresses) from only being triggered
|
|
57
57
|
# when messages come through.
|
|
58
|
-
ai_enabled = bot_conf[:artifical_intelligence]
|
|
59
58
|
|
|
60
59
|
event_history.event = JSON.parse(
|
|
61
60
|
event.data,
|
|
62
61
|
symbolize_names: true
|
|
63
62
|
)
|
|
64
63
|
event_history.event_type = event_history.event[:type].to_s.to_sym
|
|
65
|
-
|
|
64
|
+
|
|
65
|
+
this_product = event_history.order_book[:this_product]
|
|
66
|
+
fiat = this_product[:quote_currency]
|
|
67
|
+
fiat_portfolio_file = "#{option_choice.session_root}/order_books/#{fiat}_PORTFOLIO.json"
|
|
68
|
+
|
|
69
|
+
# Determine if Summary UI needs updated data
|
|
70
|
+
event_history = Cryptum::Portfolio::Balance.refresh(
|
|
66
71
|
env: env,
|
|
72
|
+
option_choice: option_choice,
|
|
67
73
|
terminal_win: terminal_win,
|
|
74
|
+
event_history: event_history,
|
|
75
|
+
fiat_portfolio_file: fiat_portfolio_file
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
# If the Terminal Window has been Resized, Resize the UI
|
|
79
|
+
if Curses.cols != terminal_win.cols
|
|
80
|
+
terminal_win.cols = Curses.cols
|
|
81
|
+
terminal_win.ticker_ui_resize = true
|
|
82
|
+
terminal_win.market_trend_ui_resize = true
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
event_history = Cryptum::UI::Portfolio.refresh(
|
|
86
|
+
option_choice: option_choice,
|
|
87
|
+
portfolio_win: terminal_win.portfolio_section,
|
|
88
|
+
event_history: event_history,
|
|
89
|
+
key_press_event: terminal_win.key_press_event,
|
|
90
|
+
indicator_status: indicator_status,
|
|
91
|
+
bot_conf: bot_conf,
|
|
92
|
+
fiat_portfolio_file: fiat_portfolio_file
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
if event_history.event_type == :ticker ||
|
|
96
|
+
terminal_win.ticker_ui_resize
|
|
97
|
+
|
|
98
|
+
ticker_event = event_history.ticker_event = event_history.event if event_history.event_type == :ticker
|
|
99
|
+
ticker_event = event_history.ticker_event if terminal_win.ticker_ui_resize
|
|
100
|
+
event_history = Cryptum::UI::Ticker.refresh(
|
|
101
|
+
option_choice: option_choice,
|
|
102
|
+
start_time: event_history.start_time,
|
|
103
|
+
ticker_win: terminal_win.ticker_section,
|
|
104
|
+
key_press_event: terminal_win.key_press_event,
|
|
105
|
+
event_history: event_history,
|
|
106
|
+
event: ticker_event
|
|
107
|
+
)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
Cryptum::UI::OrderTimer.refresh(
|
|
111
|
+
option_choice: option_choice,
|
|
112
|
+
event_history: event_history,
|
|
113
|
+
order_timer_win: terminal_win.order_timer_section,
|
|
114
|
+
indicator_status: indicator_status,
|
|
115
|
+
key_press_event: terminal_win.key_press_event
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
if event_history.event_type == :l2update ||
|
|
119
|
+
terminal_win.market_trend_ui_resize
|
|
120
|
+
|
|
121
|
+
market_trend_event = event_history.market_trend_event = event_history.event if event_history.event_type == :l2update
|
|
122
|
+
market_trend_event = event_history.market_trend_event if terminal_win.market_trend_ui_resize
|
|
123
|
+
event_history = Cryptum::UI::MarketTrend.refresh(
|
|
124
|
+
option_choice: option_choice,
|
|
125
|
+
market_trend_win: terminal_win.market_trend_section,
|
|
126
|
+
event_history: event_history,
|
|
127
|
+
key_press_event: terminal_win.key_press_event,
|
|
128
|
+
event: market_trend_event,
|
|
129
|
+
indicator_status: indicator_status,
|
|
130
|
+
bot_conf: bot_conf
|
|
131
|
+
)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
indicator_status = Cryptum::UI::SignalEngine.refresh(
|
|
68
135
|
option_choice: option_choice,
|
|
136
|
+
signal_engine_win: terminal_win.signal_engine_section,
|
|
69
137
|
event_history: event_history,
|
|
138
|
+
key_press_event: terminal_win.key_press_event,
|
|
70
139
|
indicator_status: indicator_status,
|
|
71
140
|
bot_conf: bot_conf,
|
|
72
|
-
|
|
141
|
+
fiat_portfolio_file: fiat_portfolio_file
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
unless event_history.order_plan_details_win_active
|
|
145
|
+
event_history = Cryptum::UI::OrderPlan.refresh(
|
|
146
|
+
option_choice: option_choice,
|
|
147
|
+
order_plan_win: terminal_win.order_plan_section,
|
|
148
|
+
env: env,
|
|
149
|
+
event_history: event_history,
|
|
150
|
+
key_press_event: terminal_win.key_press_event,
|
|
151
|
+
indicator_status: indicator_status,
|
|
152
|
+
bot_conf: bot_conf,
|
|
153
|
+
fiat_portfolio_file: fiat_portfolio_file
|
|
154
|
+
)
|
|
155
|
+
recalc_op = event_history.recalculate_order_plan
|
|
156
|
+
order_plan = event_history.order_book[:order_plan]
|
|
157
|
+
terminal_win.key_press_event.key_w = true if (recalc_op || order_plan.empty?) &&
|
|
158
|
+
!event_history.red_pill
|
|
159
|
+
event_history.recalculate_order_plan = false
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
if event_history.order_plan_details_win_active
|
|
163
|
+
event_history = Cryptum::UI::OrderPlanDetails.refresh(
|
|
164
|
+
option_choice: option_choice,
|
|
165
|
+
order_plan_details_win: terminal_win.order_plan_details_section,
|
|
166
|
+
event_history: event_history,
|
|
167
|
+
key_press_event: terminal_win.key_press_event
|
|
168
|
+
)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
unless event_history.order_execute_details_win_active
|
|
172
|
+
event_history = Cryptum::UI::OrderExecution.refresh(
|
|
173
|
+
option_choice: option_choice,
|
|
174
|
+
order_execute_win: terminal_win.order_execute_section,
|
|
175
|
+
env: env,
|
|
176
|
+
event_history: event_history,
|
|
177
|
+
key_press_event: terminal_win.key_press_event,
|
|
178
|
+
indicator_status: indicator_status,
|
|
179
|
+
bot_conf: bot_conf,
|
|
180
|
+
fiat_portfolio_file: fiat_portfolio_file
|
|
181
|
+
)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
if event_history.order_execute_details_win_active
|
|
185
|
+
event_history = Cryptum::UI::OrderExecuteDetails.refresh(
|
|
186
|
+
option_choice: option_choice,
|
|
187
|
+
order_execute_details_win: terminal_win.order_execute_details_section,
|
|
188
|
+
event_history: event_history,
|
|
189
|
+
key_press_event: terminal_win.key_press_event
|
|
190
|
+
)
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
# Refresh Command Section for Cryptum Session Usage
|
|
194
|
+
Cryptum::UI::Command.refresh(
|
|
195
|
+
command_win: terminal_win.command_section,
|
|
196
|
+
key_press_event: terminal_win.key_press_event
|
|
73
197
|
)
|
|
74
198
|
|
|
199
|
+
# event_history = Cryptum::Event.parse(
|
|
200
|
+
# env: env,
|
|
201
|
+
# terminal_win: terminal_win,
|
|
202
|
+
# option_choice: option_choice,
|
|
203
|
+
# event_history: event_history,
|
|
204
|
+
# indicator_status: indicator_status,
|
|
205
|
+
# bot_conf: bot_conf,
|
|
206
|
+
# ai_enabled: ai_enabled
|
|
207
|
+
# )
|
|
208
|
+
|
|
75
209
|
# Detect Key Press Events
|
|
76
210
|
Cryptum::Event::KeyPress.detect(terminal_win: terminal_win)
|
|
77
211
|
|
|
@@ -249,6 +383,8 @@ module Cryptum
|
|
|
249
383
|
|
|
250
384
|
sleep 1
|
|
251
385
|
retry
|
|
386
|
+
ensure
|
|
387
|
+
$stdout.flush
|
|
252
388
|
end
|
|
253
389
|
rescue Interrupt
|
|
254
390
|
# Exit Gracefully if CTRL+C is Pressed During Session
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: cryptum
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.327
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- 0day Inc.
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-12-
|
|
11
|
+
date: 2022-12-15 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: addressable
|
|
@@ -401,7 +401,6 @@ files:
|
|
|
401
401
|
- lib/cryptum/order_book/indicator.rb
|
|
402
402
|
- lib/cryptum/order_book/market_trend.rb
|
|
403
403
|
- lib/cryptum/order_book/profit_margin.rb
|
|
404
|
-
- lib/cryptum/order_book/weighted_avg.rb
|
|
405
404
|
- lib/cryptum/portfolio.rb
|
|
406
405
|
- lib/cryptum/portfolio/balance.rb
|
|
407
406
|
- lib/cryptum/ui.rb
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Cryptum
|
|
4
|
-
# This plugin is used to indicate if the Weighted Executed Buy Orders are less than the Weighted Excuted Sell Orders
|
|
5
|
-
|
|
6
|
-
module OrderBook
|
|
7
|
-
module WeightedAvg
|
|
8
|
-
# Supported Method Parameters::
|
|
9
|
-
# Cryptum::OrderBook::WeightedAvg.status(
|
|
10
|
-
# order_book: 'required - order_book data structure'
|
|
11
|
-
# )
|
|
12
|
-
|
|
13
|
-
public_class_method def self.status(opts = {})
|
|
14
|
-
order_book = opts[:order_book]
|
|
15
|
-
order_history = order_book[:order_history]
|
|
16
|
-
indicator_status = opts[:indicator_status]
|
|
17
|
-
invested = opts[:invested]
|
|
18
|
-
|
|
19
|
-
indicator_hash = {}
|
|
20
|
-
indicator_hash[:invested] = invested
|
|
21
|
-
|
|
22
|
-
buy_orders_done = order_history.select do |orders|
|
|
23
|
-
orders[:side] == 'buy' &&
|
|
24
|
-
orders[:status] == 'done' &&
|
|
25
|
-
orders[:done_reason] == 'filled'
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
total_buy_orders_done = buy_orders_done.length
|
|
29
|
-
avg_buy_exec = format('%0.7f', 0.00).to_f
|
|
30
|
-
# total_buy_executed = 0.00
|
|
31
|
-
# total_invested = 0.00
|
|
32
|
-
# buy_fees = 0.00
|
|
33
|
-
if total_buy_orders_done.positive?
|
|
34
|
-
# Calculate Weighted Avg. of Completed Buy Orders
|
|
35
|
-
weighted_buy_prices_arr = []
|
|
36
|
-
buy_orders_done.each do |order|
|
|
37
|
-
weighted_hash = {}
|
|
38
|
-
executed_value = order[:executed_value].to_f
|
|
39
|
-
filled_size = order[:filled_size].to_f
|
|
40
|
-
weighted_hash[:price] = (executed_value / filled_size).to_f
|
|
41
|
-
weighted_hash[:filled_size] = filled_size
|
|
42
|
-
weighted_hash[:price_times_filled_size] = weighted_hash[:price] * filled_size
|
|
43
|
-
weighted_buy_prices_arr.push(weighted_hash)
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
price_times_filled_size = weighted_buy_prices_arr.sum do |orders|
|
|
47
|
-
orders[:price_times_filled_size].to_f
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
this_filled_size = weighted_buy_prices_arr.sum do |orders|
|
|
51
|
-
orders[:filled_size]
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
calc_avg_buy_exec = price_times_filled_size / this_filled_size
|
|
55
|
-
avg_buy_exec = format('%0.7f', calc_avg_buy_exec).to_f
|
|
56
|
-
|
|
57
|
-
executed_value = buy_orders_done.sum do |orders|
|
|
58
|
-
orders[:executed_value].to_f
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
# total_buy_executed = format('%0.7f', executed_value).to_f
|
|
62
|
-
|
|
63
|
-
# fill_fees = buy_orders_done.sum do |orders|
|
|
64
|
-
# orders[:fill_fees].to_f
|
|
65
|
-
# end
|
|
66
|
-
|
|
67
|
-
# buy_fees = format('%0.7f', fill_fees).to_f
|
|
68
|
-
|
|
69
|
-
# calc_total_invested = total_buy_executed.to_f - buy_fees.to_f
|
|
70
|
-
# total_invested = format('%0.7f', calc_total_invested).to_f
|
|
71
|
-
end
|
|
72
|
-
order_book[:avg_buy_exec] = avg_buy_exec
|
|
73
|
-
|
|
74
|
-
sell_orders_done = order_history.select do |orders|
|
|
75
|
-
orders[:side] == 'sell' &&
|
|
76
|
-
orders[:status] == 'done' &&
|
|
77
|
-
orders[:done_reason] == 'filled'
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
total_sell_orders_done = sell_orders_done.length
|
|
81
|
-
avg_sell_exec = format('%0.7f', 0.00).to_f
|
|
82
|
-
# total_sell_executed = format('%0.7f', 0.00).to_f
|
|
83
|
-
# total_return = format('%0.7f', 0.00).to_f
|
|
84
|
-
# sell_fees = format('%0.7f', 0.00).to_f
|
|
85
|
-
if total_sell_orders_done.positive?
|
|
86
|
-
# Calculate Weighted Avg. of Completed Sell Orders
|
|
87
|
-
weighted_sell_prices_arr = []
|
|
88
|
-
sell_orders_done.each do |order|
|
|
89
|
-
weighted_hash = {}
|
|
90
|
-
executed_value = order[:executed_value].to_f
|
|
91
|
-
filled_size = order[:filled_size].to_f
|
|
92
|
-
weighted_hash[:price] = (executed_value / filled_size).to_f
|
|
93
|
-
weighted_hash[:filled_size] = filled_size
|
|
94
|
-
weighted_hash[:price_times_filled_size] = weighted_hash[:price] * filled_size
|
|
95
|
-
weighted_sell_prices_arr.push(weighted_hash)
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
price_times_filled_size = weighted_sell_prices_arr.sum do |orders|
|
|
99
|
-
orders[:price_times_filled_size].to_f
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
this_filled_size = weighted_sell_prices_arr.sum do |orders|
|
|
103
|
-
orders[:filled_size]
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
calc_avg_sell_exec = price_times_filled_size / this_filled_size
|
|
107
|
-
avg_sell_exec = format('%0.7f', calc_avg_sell_exec).to_f
|
|
108
|
-
|
|
109
|
-
executed_value = sell_orders_done.sum do |orders|
|
|
110
|
-
orders[:executed_value].to_f
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
# total_sell_executed = format('%0.7f', executed_value).to_f
|
|
114
|
-
|
|
115
|
-
# fill_fees = sell_orders_done.sum do |orders|
|
|
116
|
-
# orders[:fill_fees].to_f
|
|
117
|
-
# end
|
|
118
|
-
|
|
119
|
-
# sell_fees = format('%0.7f', fill_fees).to_f
|
|
120
|
-
# calc_total_made = total_sell_executed.to_f - sell_fees.to_f
|
|
121
|
-
# total_return = format('%0.7f', calc_total_made).to_f
|
|
122
|
-
end
|
|
123
|
-
order_book[:avg_sell_exec] = avg_sell_exec
|
|
124
|
-
|
|
125
|
-
if avg_buy_exec < avg_sell_exec
|
|
126
|
-
indicator_hash[:color] = :green
|
|
127
|
-
weight_op = '<'
|
|
128
|
-
elsif avg_buy_exec > avg_sell_exec
|
|
129
|
-
indicator_hash[:color] = :red
|
|
130
|
-
weight_op = '>'
|
|
131
|
-
else
|
|
132
|
-
indicator_hash[:color] = :yellow
|
|
133
|
-
weight_op = '=='
|
|
134
|
-
end
|
|
135
|
-
weighted_avg_status_out = "VWAPB #{weight_op} VWAPS"
|
|
136
|
-
order_book[:candles].last[:weighted_avg_status] = weighted_avg_status_out
|
|
137
|
-
indicator_hash[:status] = weighted_avg_status_out
|
|
138
|
-
# indicator_hash[:order_book] = order_book
|
|
139
|
-
|
|
140
|
-
indicator_status.weighted_avg = indicator_hash
|
|
141
|
-
# indicator_hash
|
|
142
|
-
rescue StandardError => e
|
|
143
|
-
raise e
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
# Display Usage for this Module
|
|
147
|
-
|
|
148
|
-
public_class_method def self.help
|
|
149
|
-
puts "USAGE:
|
|
150
|
-
weighted_avg_indicator_hash = #{self}.status(
|
|
151
|
-
order_book: 'required - order_book data structure'
|
|
152
|
-
)
|
|
153
|
-
"
|
|
154
|
-
end
|
|
155
|
-
end
|
|
156
|
-
end
|
|
157
|
-
end
|