crypto-service 0.0.0 → 0.0.1
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/lib/crypto/base.rb +57 -1
- data/lib/crypto/resources/buy.rb +58 -0
- data/lib/crypto/resources/exchanges/cx.rb +34 -0
- data/lib/crypto/resources/listing.rb +3 -1
- data/lib/crypto/resources/loss.rb +13 -0
- data/lib/crypto/resources/profit.rb +13 -0
- data/lib/crypto/resources/sell.rb +27 -0
- data/lib/crypto/resources/stop.rb +31 -0
- data/lib/crypto/resources/top.rb +3 -1
- data/lib/crypto/version.rb +1 -1
- data/lib/crypto.rb +8 -0
- metadata +37 -4
- data/lib/crypto/resources/request.rb +0 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ed5769c8ed79cd6a12e10aabd5035776ea6ef5cdcc2f32812e65e86a1464ab1d
|
4
|
+
data.tar.gz: 9e547251610c7f066564c4af4d7ff87cb2b5c1a0e0a3ec90ee9bdad3aee464ea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1a06fc3a72160c2ce570e91725fcf8b3d749088a13b322b55e630a70a6ba40c2cc075f003f9dbe6e1ca29445782227b89f0a3b7902a55abdc296c915a9eae0f7
|
7
|
+
data.tar.gz: c3c7dc4526dc42383a968db113aad034aaf7da46e310e0436e6c4ed00a893ef7e897ac87a49b6999f5ffa130295f6ac8abe6986821f9d87e8f742421f93f9beb
|
data/lib/crypto/base.rb
CHANGED
@@ -3,14 +3,70 @@
|
|
3
3
|
require 'uri'
|
4
4
|
require 'net/http'
|
5
5
|
require 'json'
|
6
|
+
require 'coinex'
|
7
|
+
require 'request'
|
6
8
|
|
7
9
|
module Crypto
|
8
10
|
class Base
|
9
11
|
class << self
|
10
|
-
attr_accessor :app_info, :path_prefix
|
12
|
+
attr_accessor :app_info, :path_prefix, :development
|
13
|
+
|
14
|
+
def calculate_win_or_lost(avg_price:, exchange:, settings:)
|
15
|
+
percentages = percentage(exchange: exchange, settings: settings)
|
16
|
+
profit = percentages.first
|
17
|
+
lost = percentages[1]
|
18
|
+
|
19
|
+
win_price = avg_price.to_f + ((avg_price.to_f * profit.to_f) / 100)
|
20
|
+
lost_price = avg_price.to_f - ((avg_price.to_f * lost.to_f) / 100)
|
21
|
+
|
22
|
+
[win_price, lost_price]
|
23
|
+
end
|
24
|
+
|
25
|
+
def binance?(exchange)
|
26
|
+
exchange == 'Binance'
|
27
|
+
end
|
28
|
+
|
29
|
+
def percentage(exchange:, settings:)
|
30
|
+
if binance?(exchange)
|
31
|
+
profit = settings[:perc_profit_exchange]
|
32
|
+
loss = settings[:perc_lost_exchange]
|
33
|
+
else
|
34
|
+
profit = settings[:perc_profit_all]
|
35
|
+
loss = settings[:perc_lost_all]
|
36
|
+
end
|
37
|
+
|
38
|
+
[profit, loss]
|
39
|
+
end
|
40
|
+
|
41
|
+
def correct(result)
|
42
|
+
{ 'status' => :success, 'code' => 200, 'payload' => result }
|
43
|
+
end
|
44
|
+
|
45
|
+
def error(result)
|
46
|
+
{ 'status' => :failed, 'code' => result['code'], 'message' => result['message'] }
|
47
|
+
end
|
48
|
+
|
49
|
+
def coinex_keys(settings)
|
50
|
+
Crypto::Exchanges::Cx.access_id(settings[:access_id])
|
51
|
+
Crypto::Exchanges::Cx.secret_key(settings[:secret_key])
|
52
|
+
end
|
53
|
+
|
54
|
+
def response_correct?(result)
|
55
|
+
(result['code']).zero?
|
56
|
+
end
|
57
|
+
|
58
|
+
def calculate_signature(params)
|
59
|
+
data_signature = Coinex::Signature.calculate(params: params)
|
60
|
+
|
61
|
+
params[:tonce] = Crypto.development ? '1672669323219' : data_signature[:tonce]
|
62
|
+
params[:signature] = data_signature[:signature]
|
63
|
+
|
64
|
+
params
|
65
|
+
end
|
11
66
|
end
|
12
67
|
|
13
68
|
self.app_info = ::ENV['APP_INFO'] || "#{::Crypto::NAME} V#{::Crypto.version}"
|
14
69
|
self.path_prefix = 'https://www.binance.com/bapi/composite/v1/public/promo/cmc/cryptocurrency'
|
70
|
+
self.development = false
|
15
71
|
end
|
16
72
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Class that buy crypto, set TP & SL and return their responses
|
4
|
+
# Parameter of order:
|
5
|
+
# Payload: Hash of Crypto::Listing.info or Crypto::Top.info
|
6
|
+
# Settings: contact settings
|
7
|
+
# Exchange: exchange where crypto is listed or buy, (Binance → 20%, Other exchange → 10% )
|
8
|
+
|
9
|
+
module Crypto
|
10
|
+
class Buy < Base
|
11
|
+
class << self
|
12
|
+
# rubocop: disable Metrics/MethodLength, Lint/MissingCopEnableDirective
|
13
|
+
def order(payload:, settings:, exchange:, count:)
|
14
|
+
coinex_keys(settings)
|
15
|
+
result = Coinex::Order.market(params: params(
|
16
|
+
symbol: payload['symbol'],
|
17
|
+
count: count
|
18
|
+
))
|
19
|
+
|
20
|
+
Crypto::Exchanges::Cx.clean_keys
|
21
|
+
|
22
|
+
if response_correct?(result)
|
23
|
+
prices = calculate_win_or_lost(avg_price: result['data']['avg_price'], exchange: exchange, settings: settings)
|
24
|
+
divert(payload: payload, result: result, prices: prices, settings: settings)
|
25
|
+
else
|
26
|
+
error(result)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def balance(count)
|
31
|
+
params = Coinex::Signature.calculate
|
32
|
+
params[:tonce] = '1672669323219' if Crypto.development
|
33
|
+
|
34
|
+
balance = Coinex::Balance.info(params: params)
|
35
|
+
balance['data']['USDT']['available'].to_i / count.to_i
|
36
|
+
end
|
37
|
+
|
38
|
+
def params(symbol:, count:)
|
39
|
+
params = { market: "#{symbol}USDT", type: 'buy', amount: balance(count) }
|
40
|
+
calculate_signature(params)
|
41
|
+
end
|
42
|
+
|
43
|
+
def divert(payload:, result:, prices:, settings:)
|
44
|
+
operations = []
|
45
|
+
operations << result
|
46
|
+
|
47
|
+
loss = Crypto::Loss.limit(payload: payload, result: result, prices: prices, settings: settings)
|
48
|
+
operations << loss
|
49
|
+
return operations if payload['mode'] == :top
|
50
|
+
|
51
|
+
profit = Crypto::Profit.limit(payload: payload, result: result, prices: prices, settings: settings)
|
52
|
+
operations << profit
|
53
|
+
|
54
|
+
operations
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Exchange -> Coinex
|
4
|
+
|
5
|
+
module Crypto
|
6
|
+
module Exchanges
|
7
|
+
class Cx < Base
|
8
|
+
class << self
|
9
|
+
def access_id(access_id)
|
10
|
+
return unless ping
|
11
|
+
|
12
|
+
Coinex.access_id = access_id
|
13
|
+
end
|
14
|
+
|
15
|
+
def secret_key(secret_key)
|
16
|
+
return unless ping
|
17
|
+
|
18
|
+
Coinex.secret_key = secret_key
|
19
|
+
end
|
20
|
+
|
21
|
+
def clean_keys
|
22
|
+
return unless ping
|
23
|
+
|
24
|
+
Coinex.access_id = nil
|
25
|
+
Coinex.secret_key = nil
|
26
|
+
end
|
27
|
+
|
28
|
+
def ping
|
29
|
+
Coinex.ping == { status: 200 }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
require 'active_support/all'
|
4
4
|
|
5
|
+
# Class that return crypto listed in a interval of MINUTES
|
6
|
+
|
5
7
|
module Crypto
|
6
8
|
class Listing < Base
|
7
9
|
MINUTES = 15
|
@@ -34,7 +36,7 @@ module Crypto
|
|
34
36
|
|
35
37
|
def detail
|
36
38
|
uri = URI("#{Crypto.path}/listings/new?limit=100&start=1")
|
37
|
-
|
39
|
+
Request::Http.request(uri: uri, method: 'GET')
|
38
40
|
end
|
39
41
|
|
40
42
|
def status?(payload)
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Crypto
|
4
|
+
class Sell < Base
|
5
|
+
class << self
|
6
|
+
def order(payload:, settings:)
|
7
|
+
coinex_keys(settings)
|
8
|
+
result = Coinex::Order.market(params: params(payload))
|
9
|
+
|
10
|
+
Crypto::Exchanges::Cx.clean_keys
|
11
|
+
|
12
|
+
if response_correct?(result)
|
13
|
+
correct(result)
|
14
|
+
else
|
15
|
+
error(result)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def params(payload)
|
22
|
+
params = { market: "#{payload['symbol']}USDT", type: 'sell', amount: payload['balance'] }
|
23
|
+
calculate_signature(params)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Crypto
|
4
|
+
class Stop < Base
|
5
|
+
class << self
|
6
|
+
def limit(payload:, result:, prices:, settings:)
|
7
|
+
coinex_keys(settings)
|
8
|
+
|
9
|
+
result = Coinex::Order.limit(params: params(
|
10
|
+
payload: payload, result: result, prices: prices
|
11
|
+
))
|
12
|
+
|
13
|
+
Crypto::Exchanges::Cx.clean_keys
|
14
|
+
if response_correct?(result)
|
15
|
+
correct(result)
|
16
|
+
else
|
17
|
+
error(result)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def params(payload:, result:, prices:)
|
24
|
+
params = { market: "#{payload['symbol']}USDT", type: 'sell', amount: result['data']['amount'],
|
25
|
+
stop_price: what_price(prices) }
|
26
|
+
|
27
|
+
calculate_signature(params)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/crypto/resources/top.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# Class that return crypto after a percentage in top gainers
|
4
|
+
|
3
5
|
module Crypto
|
4
6
|
class Top < Base
|
5
7
|
PERCENTAGE = 20.0
|
@@ -32,7 +34,7 @@ module Crypto
|
|
32
34
|
|
33
35
|
def detail
|
34
36
|
uri = URI("#{Crypto.path}/trending/gainers-losers?limit=100&sort_dir=desc&start=1")
|
35
|
-
|
37
|
+
Request::Http.request(uri: uri, method: 'GET')
|
36
38
|
end
|
37
39
|
|
38
40
|
def status?(payload)
|
data/lib/crypto/version.rb
CHANGED
data/lib/crypto.rb
CHANGED
@@ -27,6 +27,14 @@ module Crypto
|
|
27
27
|
def version
|
28
28
|
VERSION
|
29
29
|
end
|
30
|
+
|
31
|
+
def development=(boolean)
|
32
|
+
@mutex.synchronize { ::Crypto::Base.development = boolean }
|
33
|
+
end
|
34
|
+
|
35
|
+
def development
|
36
|
+
@mutex.synchronize { ::Crypto::Base.development }
|
37
|
+
end
|
30
38
|
end
|
31
39
|
end
|
32
40
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crypto-service
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefano Baldazzi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-01-
|
11
|
+
date: 2023-01-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -24,6 +24,34 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 7.0.4
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: aga-request
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.0.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.0.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: coinex
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.0.3
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.0.3
|
27
55
|
- !ruby/object:Gem::Dependency
|
28
56
|
name: zeitwerk
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -162,8 +190,13 @@ files:
|
|
162
190
|
- lib/crypto.rb
|
163
191
|
- lib/crypto/autoloader.rb
|
164
192
|
- lib/crypto/base.rb
|
193
|
+
- lib/crypto/resources/buy.rb
|
194
|
+
- lib/crypto/resources/exchanges/cx.rb
|
165
195
|
- lib/crypto/resources/listing.rb
|
166
|
-
- lib/crypto/resources/
|
196
|
+
- lib/crypto/resources/loss.rb
|
197
|
+
- lib/crypto/resources/profit.rb
|
198
|
+
- lib/crypto/resources/sell.rb
|
199
|
+
- lib/crypto/resources/stop.rb
|
167
200
|
- lib/crypto/resources/top.rb
|
168
201
|
- lib/crypto/version.rb
|
169
202
|
homepage: https://github.com/Baldaz02/crypto-ruby
|
@@ -188,5 +221,5 @@ requirements: []
|
|
188
221
|
rubygems_version: 3.3.24
|
189
222
|
signing_key:
|
190
223
|
specification_version: 4
|
191
|
-
summary: crypto0.0.
|
224
|
+
summary: crypto0.0.1
|
192
225
|
test_files: []
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Crypto
|
4
|
-
class Request < Base
|
5
|
-
class << self
|
6
|
-
def request(uri:, method:)
|
7
|
-
req = get_method(name: method, uri: uri)
|
8
|
-
req['Content-Type'] = 'application/json'
|
9
|
-
|
10
|
-
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
|
11
|
-
http.request(req)
|
12
|
-
end
|
13
|
-
|
14
|
-
JSON.parse(res.body)
|
15
|
-
end
|
16
|
-
|
17
|
-
def get_method(name:, uri:)
|
18
|
-
case name
|
19
|
-
when 'GET'
|
20
|
-
req = Net::HTTP::Get.new(uri)
|
21
|
-
# when 'POST'
|
22
|
-
# req = Net::HTTP::Post.new(uri)
|
23
|
-
# when 'DELETE'
|
24
|
-
# req = Net::HTTP::Delete.new(uri)
|
25
|
-
end
|
26
|
-
|
27
|
-
req
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|