cryptum 0.0.320 → 0.0.322
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/README.md +1 -1
- data/bin/cryptum-forecast +9 -9
- data/lib/cryptum/bot_conf.rb +10 -4
- data/lib/cryptum/event/history.rb +37 -32
- data/lib/cryptum/event.rb +1 -1
- data/lib/cryptum/option/choice.rb +1 -1
- data/lib/cryptum/option.rb +9 -9
- data/lib/cryptum/order_book/generate.rb +12 -14
- data/lib/cryptum/order_book.rb +0 -36
- data/lib/cryptum/ui/order_execution.rb +10 -2
- data/lib/cryptum/ui/order_plan.rb +35 -33
- data/lib/cryptum/ui/order_plan_details.rb +10 -2
- data/lib/cryptum/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8ea4631099b7ad8ff94d00136248b662803cfba132ab021303bea8964f89dc78
|
4
|
+
data.tar.gz: efa2d3a350d174059f33ce86b6f3d04a6dce885b4c5b7649a185d2c13607c5a4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ed9f8234e09f5de2b916cd2769019427d2db893e3498e8e728b7e52b542d617f0766e2dce1d3ba73f7236330780bd306a403205918629beaf253feee0508366
|
7
|
+
data.tar.gz: 3c87ccb59b8f82a553d7cb37261490610f979200e858b1892b07c300bf1314d13aafdeace8382562a7f313acc43c8edb27b2c91c8c0d2c4b7feab247d8856d29
|
data/Gemfile
CHANGED
data/README.md
CHANGED
data/bin/cryptum-forecast
CHANGED
@@ -11,7 +11,7 @@ class Choice
|
|
11
11
|
:cycles_complete,
|
12
12
|
:driver_name,
|
13
13
|
:proxy,
|
14
|
-
:
|
14
|
+
:session_root,
|
15
15
|
:sandbox,
|
16
16
|
:symbol,
|
17
17
|
:tpm,
|
@@ -60,9 +60,9 @@ begin
|
|
60
60
|
|
61
61
|
options.on(
|
62
62
|
'-rPATH',
|
63
|
-
'--
|
63
|
+
'--session-root=PATH',
|
64
64
|
'<Optional - Directory of Cloned Repo (Defaults to Dir.pwd)">'
|
65
|
-
) { |r| option_choice.
|
65
|
+
) { |r| option_choice.session_root = r }
|
66
66
|
|
67
67
|
options.on(
|
68
68
|
'-tTPM',
|
@@ -83,16 +83,16 @@ begin
|
|
83
83
|
reason = :symbol
|
84
84
|
end
|
85
85
|
|
86
|
-
option_choice.
|
86
|
+
option_choice.session_root = Dir.pwd if option_choice.session_root.nil?
|
87
87
|
|
88
88
|
if option_choice.autotrade_percent.to_f > 100
|
89
89
|
usage = true
|
90
90
|
reason = :autotrade_percent
|
91
91
|
end
|
92
92
|
|
93
|
-
unless Dir.exist?(option_choice.
|
93
|
+
unless Dir.exist?(option_choice.session_root)
|
94
94
|
usage = true
|
95
|
-
reason = :
|
95
|
+
reason = :session_root
|
96
96
|
end
|
97
97
|
|
98
98
|
if usage
|
@@ -101,8 +101,8 @@ begin
|
|
101
101
|
puts 'ERROR: --autotrade PERCENT value cannot exceed 100'
|
102
102
|
when :symbol
|
103
103
|
puts "ERROR: --symbol Flag is Required.\n\n"
|
104
|
-
when :
|
105
|
-
puts "ERROR: #{option_choice.
|
104
|
+
when :session_root
|
105
|
+
puts "ERROR: #{option_choice.session_root} does not exist.\n\n"
|
106
106
|
end
|
107
107
|
|
108
108
|
puts `#{option_choice.driver_name} --help`
|
@@ -125,7 +125,7 @@ begin
|
|
125
125
|
|
126
126
|
# crypto = products.last[:base_currency]
|
127
127
|
fiat = products.last[:quote_currency]
|
128
|
-
fiat_portfolio_file = "#{option_choice.
|
128
|
+
fiat_portfolio_file = "#{option_choice.session_root}/order_books/#{fiat}_PORTFOLIO.json"
|
129
129
|
|
130
130
|
# portfolio = Cryptum::API.get_portfolio(
|
131
131
|
# option_choice: option_choice,
|
data/lib/cryptum/bot_conf.rb
CHANGED
@@ -10,10 +10,12 @@ module Cryptum
|
|
10
10
|
option_choice = opts[:option_choice]
|
11
11
|
event_history = opts[:event_history]
|
12
12
|
|
13
|
-
|
13
|
+
session_root = option_choice.session_root
|
14
|
+
symbol = option_choice.symbol
|
15
|
+
bot_conf_file = "#{session_root}/etc/bot_confs/#{symbol}_bot_conf.yaml"
|
14
16
|
unless File.exist?(bot_conf_file)
|
15
17
|
FileUtils.cp(
|
16
|
-
"#{
|
18
|
+
"#{session_root}/etc/bot_confs/BOT_CONF.TEMPLATE",
|
17
19
|
bot_conf_file
|
18
20
|
)
|
19
21
|
end
|
@@ -50,7 +52,9 @@ module Cryptum
|
|
50
52
|
raise e
|
51
53
|
end
|
52
54
|
|
53
|
-
#
|
55
|
+
# SAUCE 1
|
56
|
+
# Calculate Target Profit Margin Percent Based Upon
|
57
|
+
# Observed Margins of Change in the Past 24hrs.
|
54
58
|
public_class_method def self.recalculate_tpm(opts = {})
|
55
59
|
option_choice = opts[:option_choice]
|
56
60
|
event_history = opts[:event_history]
|
@@ -159,7 +163,9 @@ module Cryptum
|
|
159
163
|
key = opts[:key].to_s.to_sym
|
160
164
|
value = opts[:value]
|
161
165
|
|
162
|
-
|
166
|
+
session_root = option_choice.session_root
|
167
|
+
symbol = option_choice.symbol
|
168
|
+
bot_conf_file = "#{session_root}/etc/bot_confs/#{symbol}_bot_conf.yaml"
|
163
169
|
|
164
170
|
bot_conf[key] = value
|
165
171
|
File.write(bot_conf_file, bot_conf.to_yaml)
|
@@ -11,10 +11,27 @@ module Cryptum
|
|
11
11
|
:event_type,
|
12
12
|
:first_event,
|
13
13
|
:market_trend_event,
|
14
|
+
:open_sell_orders,
|
15
|
+
:open_sell_orders_max,
|
16
|
+
:open_sell_orders_merge,
|
14
17
|
:order_book,
|
15
18
|
:order_canceled,
|
16
|
-
:
|
19
|
+
:order_execute_win_active,
|
20
|
+
:order_execute_details_win_active,
|
21
|
+
:order_execute_index_offset,
|
22
|
+
:order_execute_max_rows_to_display,
|
23
|
+
:order_execute_max_records_available_to_display,
|
24
|
+
:order_execute_row_to_select,
|
25
|
+
:order_execute_selected_data,
|
26
|
+
:order_plan_win_active,
|
27
|
+
:order_plan_details_win_active,
|
28
|
+
:order_plan_index_offset,
|
29
|
+
:order_plan_max_rows_to_display,
|
30
|
+
:order_plan_max_records_available_to_display,
|
31
|
+
:order_plan_row_to_select,
|
32
|
+
:order_plan_selected_data,
|
17
33
|
:order_ready,
|
34
|
+
:order_submitted,
|
18
35
|
:plan_no,
|
19
36
|
:reconnected,
|
20
37
|
:red_pill,
|
@@ -24,20 +41,6 @@ module Cryptum
|
|
24
41
|
:time_between_orders_max,
|
25
42
|
:time_between_orders_min,
|
26
43
|
:time_between_orders_reset,
|
27
|
-
:order_plan_win_active,
|
28
|
-
:order_plan_details_win_active,
|
29
|
-
:order_plan_index_offset,
|
30
|
-
:order_plan_max_rows_to_display,
|
31
|
-
:order_plan_max_records_available_to_display,
|
32
|
-
:order_plan_row_to_select,
|
33
|
-
:order_plan_selected_data,
|
34
|
-
:order_execute_win_active,
|
35
|
-
:order_execute_details_win_active,
|
36
|
-
:order_execute_index_offset,
|
37
|
-
:order_execute_max_rows_to_display,
|
38
|
-
:order_execute_max_records_available_to_display,
|
39
|
-
:order_execute_row_to_select,
|
40
|
-
:order_execute_selected_data,
|
41
44
|
:recalculate_order_plan
|
42
45
|
|
43
46
|
def initialize(opts = {})
|
@@ -47,21 +50,11 @@ module Cryptum
|
|
47
50
|
|
48
51
|
self.bullish_trend = true
|
49
52
|
self.first_event = true
|
50
|
-
self.
|
51
|
-
self.
|
52
|
-
self.
|
53
|
+
self.open_sell_orders = 0
|
54
|
+
self.open_sell_orders_max = 500
|
55
|
+
self.open_sell_orders_merge = false
|
53
56
|
self.order_book = order_book
|
54
|
-
self.
|
55
|
-
self.start_time = start_time
|
56
|
-
self.reconnected = false
|
57
|
-
self.red_pill = false
|
58
|
-
self.order_plan_win_active = true
|
59
|
-
self.order_plan_details_win_active = false
|
60
|
-
self.order_plan_index_offset = 0
|
61
|
-
self.order_plan_max_rows_to_display = 6
|
62
|
-
self.order_plan_max_records_available_to_display = 6
|
63
|
-
self.order_plan_row_to_select = order_plan_index_offset
|
64
|
-
self.order_plan_selected_data = { color: :white }
|
57
|
+
self.order_canceled = false
|
65
58
|
self.order_execute_win_active = false
|
66
59
|
self.order_execute_details_win_active = false
|
67
60
|
self.order_execute_index_offset = 0
|
@@ -69,14 +62,26 @@ module Cryptum
|
|
69
62
|
self.order_execute_max_records_available_to_display = 6
|
70
63
|
self.order_execute_row_to_select = order_execute_index_offset
|
71
64
|
self.order_execute_selected_data = { color: :white }
|
65
|
+
self.order_plan_win_active = true
|
66
|
+
self.order_plan_details_win_active = false
|
67
|
+
self.order_plan_index_offset = 0
|
68
|
+
self.order_plan_max_rows_to_display = 6
|
69
|
+
self.order_plan_max_records_available_to_display = 6
|
70
|
+
self.order_plan_row_to_select = order_plan_index_offset
|
71
|
+
self.order_plan_selected_data = { color: :white }
|
72
|
+
self.order_ready = false
|
73
|
+
self.order_submitted = false
|
74
|
+
self.plan_no = 1
|
75
|
+
self.reconnected = false
|
76
|
+
self.red_pill = false
|
72
77
|
self.recalculate_order_plan = false
|
78
|
+
self.start_time = start_time
|
73
79
|
|
74
|
-
#
|
75
|
-
# Default = 10 minutes
|
80
|
+
# FAST BUY = 10 minutes
|
76
81
|
self.time_between_orders = 600
|
77
82
|
self.time_between_orders_reset = time_between_orders
|
78
83
|
|
79
|
-
# 1 hour
|
84
|
+
# SLOW BUY = 1 hour
|
80
85
|
self.time_between_orders_max = 3_600
|
81
86
|
|
82
87
|
# 5 seconds
|
data/lib/cryptum/event.rb
CHANGED
@@ -35,7 +35,7 @@ module Cryptum
|
|
35
35
|
# order_history = event_history.order_book[:order_history]
|
36
36
|
this_product = event_history.order_book[:this_product]
|
37
37
|
fiat = this_product[:quote_currency]
|
38
|
-
fiat_portfolio_file = "#{option_choice.
|
38
|
+
fiat_portfolio_file = "#{option_choice.session_root}/order_books/#{fiat}_PORTFOLIO.json"
|
39
39
|
|
40
40
|
# Determine if Summary UI needs updated data
|
41
41
|
event_history = Cryptum::Portfolio::Balance.refresh(
|
data/lib/cryptum/option.rb
CHANGED
@@ -43,9 +43,9 @@ module Cryptum
|
|
43
43
|
|
44
44
|
options.on(
|
45
45
|
'-rPATH',
|
46
|
-
'--
|
47
|
-
'<Optional - Directory
|
48
|
-
) { |r| option_choice.
|
46
|
+
'--session-root=PATH',
|
47
|
+
'<Optional - Directory with etc && order_books (Defaults to ~/cryptum)>'
|
48
|
+
) { |r| option_choice.session_root = r }
|
49
49
|
|
50
50
|
options.on(
|
51
51
|
'-S',
|
@@ -82,11 +82,11 @@ module Cryptum
|
|
82
82
|
reason = :symbol
|
83
83
|
end
|
84
84
|
|
85
|
-
option_choice.
|
85
|
+
option_choice.session_root = "#{Dir.home}/cryptum" if option_choice.session_root.nil?
|
86
86
|
|
87
|
-
unless Dir.exist?(option_choice.
|
87
|
+
unless Dir.exist?(option_choice.session_root)
|
88
88
|
usage = true
|
89
|
-
reason = :
|
89
|
+
reason = :session_root
|
90
90
|
end
|
91
91
|
|
92
92
|
option_choice.market_trend_reset = 86_400 if option_choice.market_trend_reset.to_i.zero?
|
@@ -130,8 +130,8 @@ module Cryptum
|
|
130
130
|
case reason
|
131
131
|
when :symbol
|
132
132
|
puts "ERROR: --symbol Flag is Required.\n\n"
|
133
|
-
when :
|
134
|
-
puts "ERROR: #{option_choice.
|
133
|
+
when :session_root
|
134
|
+
puts "ERROR: #{option_choice.session_root} does not exist.\n\n"
|
135
135
|
when :market_trend_reset
|
136
136
|
puts "ERROR: #{option_choice.market_trend_reset} - Possible values are: 604_800 || 86_400 || 14_400 || 10_800 || 7_200 || 3_600 || 2_700 || 1_800 || 900 || 300 || 180 || 60\n\n"
|
137
137
|
end
|
@@ -168,7 +168,7 @@ module Cryptum
|
|
168
168
|
public_class_method def self.get_env(opts = {})
|
169
169
|
option_choice = opts[:option_choice]
|
170
170
|
|
171
|
-
yaml_conf_file = "#{option_choice.
|
171
|
+
yaml_conf_file = "#{option_choice.session_root}/etc/coinbase_pro.yaml"
|
172
172
|
yaml_conf = YAML.load_file(
|
173
173
|
yaml_conf_file,
|
174
174
|
symbolize_names: true
|
@@ -20,16 +20,9 @@ module Cryptum
|
|
20
20
|
option_choice = opts[:option_choice]
|
21
21
|
env = opts[:env]
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
if File.exist?(order_book_file)
|
27
|
-
last_order_book = Cryptum::OrderBook.analyze(
|
28
|
-
order_book_file: order_book_file,
|
29
|
-
option_choice: option_choice
|
30
|
-
)
|
31
|
-
order_history_meta = last_order_book[:order_history_meta] unless last_order_book[:order_history_meta].empty?
|
32
|
-
end
|
23
|
+
session_root = option_choice.session_root
|
24
|
+
symbol = option_choice.symbol
|
25
|
+
order_book_file = "#{session_root}/order_books/#{symbol}.ORDER_BOOK.json"
|
33
26
|
|
34
27
|
# Only need to retrieve a product list once / session.
|
35
28
|
products = Cryptum::API.get_products(
|
@@ -43,7 +36,7 @@ module Cryptum
|
|
43
36
|
|
44
37
|
order_book = {
|
45
38
|
path: order_book_file,
|
46
|
-
symbol:
|
39
|
+
symbol: symbol,
|
47
40
|
open_24h: 0.00,
|
48
41
|
high_24h: 0.00,
|
49
42
|
low_24h: 0.00,
|
@@ -51,8 +44,6 @@ module Cryptum
|
|
51
44
|
ticker_price: 0.00,
|
52
45
|
ticker_price_second_to_last: 0.00,
|
53
46
|
ticker_price_third_to_last: 0.00,
|
54
|
-
highest_pie_in_sky_buy_percent: 0.00,
|
55
|
-
highest_pie_in_sky_sell_percent: 0.00,
|
56
47
|
sequence: -1,
|
57
48
|
this_product: this_product,
|
58
49
|
portfolio: [],
|
@@ -70,7 +61,7 @@ module Cryptum
|
|
70
61
|
sell_end: '--'
|
71
62
|
},
|
72
63
|
order_history: [],
|
73
|
-
order_history_meta:
|
64
|
+
order_history_meta: []
|
74
65
|
}
|
75
66
|
|
76
67
|
# Order History Retention ---------------------------------------#
|
@@ -83,6 +74,13 @@ module Cryptum
|
|
83
74
|
order_book: order_book
|
84
75
|
)
|
85
76
|
|
77
|
+
if File.exist?(order_book_file)
|
78
|
+
order_book = JSON.parse(
|
79
|
+
File.read(order_book_file),
|
80
|
+
symbolize_names: true
|
81
|
+
)
|
82
|
+
end
|
83
|
+
|
86
84
|
event_history.order_book = order_book
|
87
85
|
|
88
86
|
event_history
|
data/lib/cryptum/order_book.rb
CHANGED
@@ -112,42 +112,6 @@ module Cryptum
|
|
112
112
|
raise e
|
113
113
|
end
|
114
114
|
|
115
|
-
# Supported Method Parameters::
|
116
|
-
# Cryptum::OrderBook.analyze(
|
117
|
-
# order_book_file: 'required - path to order book file'
|
118
|
-
# )
|
119
|
-
public_class_method def self.analyze(opts = {})
|
120
|
-
order_book_file = opts[:order_book_file]
|
121
|
-
option_choice = opts[:option_choice]
|
122
|
-
# TODO: Handle File that exists
|
123
|
-
# w/ Zero size...N number of
|
124
|
-
# attempts? Timeout may be better.
|
125
|
-
order_book = JSON.parse(
|
126
|
-
File.read(order_book_file),
|
127
|
-
symbolize_names: true
|
128
|
-
)
|
129
|
-
|
130
|
-
order_book[:option_choice] = option_choice
|
131
|
-
|
132
|
-
bot_conf = Cryptum::BotConf.read(option_choice: option_choice)
|
133
|
-
order_book[:bot_conf] = bot_conf
|
134
|
-
|
135
|
-
env = Cryptum::Option.get_env(option_choice: option_choice)
|
136
|
-
order_book[:env] = env
|
137
|
-
|
138
|
-
order_book
|
139
|
-
rescue JSON::ParserError => e
|
140
|
-
File.open('/tmp/cryptum-errors.txt', 'a') do |f|
|
141
|
-
f.puts Time.now.strftime('%Y-%m-%d %H:%M:%S.%N %z')
|
142
|
-
f.puts "Module: #{self}"
|
143
|
-
f.puts "#{e}\n\n\n"
|
144
|
-
end
|
145
|
-
|
146
|
-
retry
|
147
|
-
rescue StandardError => e
|
148
|
-
raise e
|
149
|
-
end
|
150
|
-
|
151
115
|
# Display Usage for this Module
|
152
116
|
public_class_method def self.help
|
153
117
|
constants.sort
|
@@ -157,6 +157,9 @@ module Cryptum
|
|
157
157
|
this_order[:color] = :cyan
|
158
158
|
order_history_meta.push(this_order)
|
159
159
|
end
|
160
|
+
|
161
|
+
# SAUCE 3
|
162
|
+
# Time between orders
|
160
163
|
# Increment n Seconds between buys to
|
161
164
|
# account for bearish and bullish trends
|
162
165
|
dynamic_time_increment = cast_margin_to_sec * -1
|
@@ -361,7 +364,11 @@ module Cryptum
|
|
361
364
|
total_to_sell = order_history.select do |oh|
|
362
365
|
oh[:status].to_sym == :open && oh[:side].to_sym == :sell
|
363
366
|
end.length
|
364
|
-
|
367
|
+
event_history.open_sell_orders = total_to_sell
|
368
|
+
# TODO: when event_history.open_sell_orders > event_history.open_sell_orders_max
|
369
|
+
# Capture highest amount to sell, cancel all orders, and create _one_ limit sell
|
370
|
+
# order set to a price of the previously captured highest amount to sell.
|
371
|
+
event_history.open_sell_orders_merge = true if total_to_sell > event_history.open_sell_orders_max
|
365
372
|
|
366
373
|
# TODO: Everything Above this Line Needs to be Indicators ^
|
367
374
|
|
@@ -566,8 +573,9 @@ module Cryptum
|
|
566
573
|
|
567
574
|
order_execute_win.refresh
|
568
575
|
|
569
|
-
# Reset Order Ready
|
576
|
+
# Reset Order Ready && Open Sell Orders Merge (If Applicable) Booleans
|
570
577
|
event_history.order_ready = false
|
578
|
+
event_history.open_sell_orders_merge = false
|
571
579
|
|
572
580
|
event_history
|
573
581
|
rescue Interrupt
|
@@ -16,10 +16,8 @@ module Cryptum
|
|
16
16
|
option_choice = opts[:option_choice]
|
17
17
|
order_plan_win = opts[:order_plan_win]
|
18
18
|
event_history = opts[:event_history]
|
19
|
-
# key_press_event = opts[:key_press_event]
|
20
19
|
indicator_status = opts[:indicator_status]
|
21
20
|
bot_conf = opts[:bot_conf]
|
22
|
-
# fiat_portfolio_file = opts[:fiat_portfolio_file]
|
23
21
|
|
24
22
|
ticker_price = event_history.order_book[:ticker_price].to_f
|
25
23
|
return event_history unless ticker_price.positive?
|
@@ -27,13 +25,9 @@ module Cryptum
|
|
27
25
|
market_trend_color = plan_color = :white
|
28
26
|
|
29
27
|
this_product = event_history.order_book[:this_product]
|
30
|
-
# symbol_out = this_product[:id]
|
31
|
-
# quote_increment = this_product[:quote_increment]
|
32
28
|
base_increment = this_product[:base_increment]
|
33
|
-
# base_min_size = this_product[:base_min_size].to_f
|
34
29
|
min_market_funds = this_product[:min_market_funds]
|
35
30
|
|
36
|
-
# fiat_smallest_decimal = quote_increment.to_s.split('.')[-1].length
|
37
31
|
crypto_smallest_decimal = base_increment.to_s.split('.')[-1].length
|
38
32
|
|
39
33
|
autotrade_percent = bot_conf[:autotrade_portfolio_percent].to_f
|
@@ -50,23 +44,11 @@ module Cryptum
|
|
50
44
|
raise "ID for Crypto Currency, #{crypto_currency} Not Found" if this_account.empty?
|
51
45
|
|
52
46
|
balance = format("%0.#{crypto_smallest_decimal}f", this_account.first[:balance])
|
53
|
-
# avail_for_trade = format("%0.#{crypto_smallest_decimal}f", this_account.first[:available])
|
54
|
-
|
55
47
|
fiat_portfolio = event_history.order_book[:fiat_portfolio]
|
56
48
|
total_holdings = format('%0.2f', fiat_portfolio.first[:total_holdings])
|
57
|
-
# fiat_balance = format('%0.2f', fiat_portfolio.first[:balance])
|
58
49
|
fiat_avail_for_trade = format('%0.2f', fiat_portfolio.first[:available])
|
59
50
|
|
60
51
|
fiat_budget = fiat_avail_for_trade.to_f
|
61
|
-
# current_fiat_invested_percent = (
|
62
|
-
# 1 - (fiat_budget / total_holdings.to_f)
|
63
|
-
# ) * 100
|
64
|
-
|
65
|
-
# order_history = event_history.order_book[:order_history]
|
66
|
-
# open_orders = order_history.select do |order|
|
67
|
-
# order[:status] == 'open'
|
68
|
-
# end
|
69
|
-
# total_open_orders = open_orders.length
|
70
52
|
|
71
53
|
order_plan = event_history.order_book[:order_plan]
|
72
54
|
|
@@ -75,10 +57,6 @@ module Cryptum
|
|
75
57
|
balance.to_f * ticker_price
|
76
58
|
)
|
77
59
|
|
78
|
-
# crypto_invested_percent = format(
|
79
|
-
# '%0.2f',
|
80
|
-
# (current_crypto_fiat_value.to_f / total_holdings.to_f) * 100
|
81
|
-
# )
|
82
60
|
crypto_invested_percent = format(
|
83
61
|
'%0.2f',
|
84
62
|
current_crypto_fiat_value.to_f.fdiv(total_holdings.to_f) * 100
|
@@ -86,6 +64,8 @@ module Cryptum
|
|
86
64
|
|
87
65
|
event_history.red_pill = true if crypto_invested_percent.to_f > autotrade_percent
|
88
66
|
|
67
|
+
# SAUCE 2
|
68
|
+
# Generating and/or recalculating order plan
|
89
69
|
if event_history.recalculate_order_plan || (
|
90
70
|
crypto_invested_percent.to_f <= autotrade_percent &&
|
91
71
|
autotrade_percent.positive? && (
|
@@ -114,6 +94,9 @@ module Cryptum
|
|
114
94
|
risk_target = fiat_budget * autotrade_cast_as_decimal
|
115
95
|
risk_alloc = risk_target
|
116
96
|
|
97
|
+
# TODO: Order Plan <= event_history.max_open_sell_orders
|
98
|
+
previous_slice_fiat_investing = 0.00
|
99
|
+
last_slice_detected = false
|
117
100
|
loop do
|
118
101
|
# Calculate min order size
|
119
102
|
allocation_decimal += 0.0001
|
@@ -121,21 +104,30 @@ module Cryptum
|
|
121
104
|
|
122
105
|
next unless fiat_investing > min_market_funds.to_f
|
123
106
|
|
107
|
+
# Increase amount invested in each slice as we increment
|
108
|
+
# plan numbers (i.e. slices) in the order plan cycle
|
109
|
+
slice_alloc = fiat_budget * allocation_decimal
|
110
|
+
fiat_investing = slice_alloc + previous_slice_fiat_investing
|
111
|
+
|
124
112
|
risk_alloc = fiat_budget * autotrade_cast_as_decimal
|
125
113
|
allocation_percent = allocation_decimal * 100
|
126
|
-
fiat_returning = fiat_investing + (
|
127
|
-
fiat_investing * tpm_cast_as_decimal
|
128
|
-
)
|
129
|
-
profit = fiat_returning - fiat_investing
|
130
114
|
|
131
115
|
break if order_plan.map { |op| op[:invest].to_f }.sum > risk_target ||
|
132
|
-
allocation_percent > 100
|
116
|
+
allocation_percent > 100 ||
|
117
|
+
last_slice_detected
|
133
118
|
|
134
|
-
# Avoid a bogus single order at the end when tradeable balances are low.
|
135
|
-
# TODO: Add remaining amount to last order
|
136
119
|
next unless fiat_budget >= min_market_funds.to_f
|
137
120
|
|
138
|
-
|
121
|
+
if fiat_investing > fiat_budget
|
122
|
+
last_slice_detected = true
|
123
|
+
fiat_investing = fiat_budget
|
124
|
+
end
|
125
|
+
|
126
|
+
fiat_returning = fiat_investing + (
|
127
|
+
fiat_investing * tpm_cast_as_decimal
|
128
|
+
)
|
129
|
+
profit = fiat_returning - fiat_investing
|
130
|
+
|
139
131
|
this_plan_no = "#{plan_no}.#{plan_no_slice}"
|
140
132
|
if event_history.recalculate_order_plan
|
141
133
|
order_slice = order_plan.find do |order|
|
@@ -156,19 +148,24 @@ module Cryptum
|
|
156
148
|
)
|
157
149
|
order_slice[:slice_alloc] = format('%0.2f', slice_alloc)
|
158
150
|
order_slice[:risk_target] = format('%0.2f', risk_target)
|
151
|
+
order_slice[:previous_slice_invest] = format(
|
152
|
+
'%0.2f',
|
153
|
+
previous_slice_fiat_investing
|
154
|
+
)
|
159
155
|
order_slice[:invest] = format('%0.2f', fiat_investing)
|
160
156
|
order_slice[:return] = format('%0.2f', fiat_returning)
|
161
157
|
order_slice[:profit] = format('%0.2f', profit)
|
162
158
|
order_slice[:tpm] = tpm
|
163
159
|
order_slice[:autotrade_percent] = autotrade_percent
|
164
160
|
order_slice[:color] = plan_color
|
161
|
+
order_slice[:last_slice] = last_slice_detected
|
165
162
|
|
166
163
|
order_plan.push(order_slice) unless event_history.recalculate_order_plan
|
167
164
|
fiat_budget -= fiat_investing
|
165
|
+
previous_slice_fiat_investing = fiat_investing
|
168
166
|
plan_no_slice += 1
|
169
167
|
end
|
170
168
|
event_history.order_book[:order_plan] = order_plan
|
171
|
-
# event_history.recalculate_order_plan = false
|
172
169
|
end
|
173
170
|
|
174
171
|
red_pill_alert = '| RED PILL ALERT |'
|
@@ -213,7 +210,6 @@ module Cryptum
|
|
213
210
|
|
214
211
|
# UI
|
215
212
|
col_just1 = (Curses.cols - Cryptum::UI.col_first) - 1
|
216
|
-
# col_just3 = (Curses.cols - Cryptum::UI.col_third) - 1
|
217
213
|
col_just4 = Curses.cols - Cryptum::UI.col_fourth
|
218
214
|
|
219
215
|
# ROW 1
|
@@ -294,6 +290,7 @@ module Cryptum
|
|
294
290
|
string: red_pill_alert
|
295
291
|
)
|
296
292
|
|
293
|
+
order_plan_win.setpos(out_line_no, Cryptum::UI.col_fourth)
|
297
294
|
Cryptum::UI.colorize(
|
298
295
|
ui_win: order_plan_win,
|
299
296
|
color: :red,
|
@@ -380,6 +377,9 @@ module Cryptum
|
|
380
377
|
slice_alloc_out = Cryptum.beautify_large_number(
|
381
378
|
value: order[:slice_alloc]
|
382
379
|
)
|
380
|
+
previous_slice_invest_out = Cryptum.beautify_large_number(
|
381
|
+
value: order[:previous_slice_invest]
|
382
|
+
)
|
383
383
|
invest_out = Cryptum.beautify_large_number(
|
384
384
|
value: order[:invest]
|
385
385
|
)
|
@@ -393,7 +393,9 @@ module Cryptum
|
|
393
393
|
plan_no = "#{order[:plan_no]}|"
|
394
394
|
fiat = "#{autotrade_percent}% of $#{fiat_avail_out} = "
|
395
395
|
alloc = "$#{risk_alloc_out} @ #{order[:allocation_percent]}% = "
|
396
|
-
|
396
|
+
alloc = "$#{risk_alloc_out}" if order[:last_slice]
|
397
|
+
invest = "$#{slice_alloc_out} + $#{previous_slice_invest_out} = $#{invest_out} + #{tpm_out}% = "
|
398
|
+
invest = " + #{tpm_out}% = " if order[:last_slice]
|
397
399
|
|
398
400
|
returns = "$#{return_out}|"
|
399
401
|
profit = "Profit: $#{profit_out}"
|
@@ -32,6 +32,9 @@ module Cryptum
|
|
32
32
|
slice_alloc_out = Cryptum.beautify_large_number(
|
33
33
|
value: order[:slice_alloc]
|
34
34
|
)
|
35
|
+
previous_slice_invest_out = Cryptum.beautify_large_number(
|
36
|
+
value: order[:previous_slice_invest]
|
37
|
+
)
|
35
38
|
invest_out = Cryptum.beautify_large_number(
|
36
39
|
value: order[:invest]
|
37
40
|
)
|
@@ -44,8 +47,13 @@ module Cryptum
|
|
44
47
|
)
|
45
48
|
autotrade_ln1_details = "1. Autotrade is set to #{autotrade_percent}% of $#{fiat_avail_out}, making $#{risk_alloc_out} available for this slice in"
|
46
49
|
autotrade_ln2_details = ' the order plan.'
|
47
|
-
|
48
|
-
|
50
|
+
if order[:last_slice]
|
51
|
+
slice_alloc_ln1_details = "2. Since $#{risk_alloc_out} is the remaining amount within the criteria defined in the Autotrade % above,"
|
52
|
+
slice_alloc_ln2_details = " $#{invest_out} will be allocated for this slice."
|
53
|
+
else
|
54
|
+
slice_alloc_ln1_details = "2. With $#{risk_alloc_out} available and a slice allocation of #{order[:allocation_percent]}%, $#{slice_alloc_out} plus the previous"
|
55
|
+
slice_alloc_ln2_details = " slice of $#{previous_slice_invest_out} results in $#{invest_out} being allocated for this slice."
|
56
|
+
end
|
49
57
|
profit_ln1_details = "3. With a slice allocation of $#{invest_out}, plus a TPM equal to #{tpm_out}%, $#{return_out} will be returned"
|
50
58
|
profit_ln2_details = " once sold. With $#{invest_out} invested, the gross profit equals $#{profit_out}, minus any Maker &"
|
51
59
|
profit_ln3_details = ' Taker (transaction) fees.'
|
data/lib/cryptum/version.rb
CHANGED
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.322
|
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-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: addressable
|
@@ -240,14 +240,14 @@ dependencies:
|
|
240
240
|
requirements:
|
241
241
|
- - '='
|
242
242
|
- !ruby/object:Gem::Version
|
243
|
-
version: 2.
|
243
|
+
version: 2.16.0
|
244
244
|
type: :runtime
|
245
245
|
prerelease: false
|
246
246
|
version_requirements: !ruby/object:Gem::Requirement
|
247
247
|
requirements:
|
248
248
|
- - '='
|
249
249
|
- !ruby/object:Gem::Version
|
250
|
-
version: 2.
|
250
|
+
version: 2.16.0
|
251
251
|
- !ruby/object:Gem::Dependency
|
252
252
|
name: ruby-prof
|
253
253
|
requirement: !ruby/object:Gem::Requirement
|