class Holdings::Simple
Attributes
fee[RW]
Public Class Methods
legacy_new(ltc_val, btc_val, usd_val, rur_val=0)
click to toggle source
# File lib/holdings/simple.rb, line 5 def self.legacy_new(ltc_val, btc_val, usd_val, rur_val=0) @ltc_bal = ltc_val @btc_bal = btc_val @usd_bal = usd_val @rur_bal = rur_val acc = self.new(%w(btc_usd ltc_usd ltc_btc btc_rur usd_rur), {ltc: ltc_val, btc: btc_val, usd: usd_val, rur: rur_val }) end
new(pairs, balances)
click to toggle source
# File lib/holdings/simple.rb, line 13 def initialize(pairs, balances) @fee = 0.2 pairs.each do |pair| base_currency, quote_currency = pair.split("_") define_singleton_method "#{quote_currency}_to_#{base_currency}", lambda { |exchange_rate, amount, fee=0.2| sell(base_currency, quote_currency, exchange_rate, amount, fee) } define_singleton_method "#{base_currency}_to_#{quote_currency}", lambda { |exchange_rate, amount, fee=0.2| buy(base_currency, quote_currency, exchange_rate, amount, fee) } end @balances = balances currencies = pairs.join("_").split("_").uniq currencies.each do |currency| define_singleton_method "#{currency}_bal", lambda { get(currency) } @balances[currency.to_sym] ||= 0.0 end end
Public Instance Methods
credit(currency, value)
click to toggle source
# File lib/holdings/simple.rb, line 44 def credit(currency, value) @balances[currency.to_sym] += value end
debit(currency, value)
click to toggle source
# File lib/holdings/simple.rb, line 48 def debit(currency, value) @balances[currency.to_sym] -= value end
get(currency)
click to toggle source
# File lib/holdings/simple.rb, line 40 def get(currency) @balances[currency.to_sym] end
largest_balance()
click to toggle source
# File lib/holdings/simple.rb, line 52 def largest_balance inverted_balances = @balances.invert highest = inverted_balances.keys.sort.last inverted_balances[highest].to_s end
set(currency, value)
click to toggle source
# File lib/holdings/simple.rb, line 36 def set(currency, value) @balances[currency.to_sym] = value end
Private Instance Methods
buy(base_currency, quote_currency, exchange_rate, amount, fee=0.2)
click to toggle source
Buy the quote currency for the base currency
# File lib/holdings/simple.rb, line 61 def buy(base_currency, quote_currency, exchange_rate, amount, fee=0.2) debit(base_currency, amount) quote_amount_before_fee = amount * exchange_rate quote_amount_after_fee = quote_amount_before_fee - calculate_fee(fee, quote_amount_before_fee) credit(quote_currency, quote_amount_after_fee) puts "#{base_currency}#{amount} @ #{quote_currency}#{exchange_rate} -> USD#{quote_amount_after_fee}" if ENV['DEBUG'] end
calculate_fee(fee, value)
click to toggle source
# File lib/holdings/simple.rb, line 82 def calculate_fee(fee, value) (value.to_f * fee) / 100 end
has_enough_money?(balance, amount)
click to toggle source
# File lib/holdings/simple.rb, line 78 def has_enough_money?(balance, amount) balance >= amount end
sell(base_currency, quote_currency, exchange_rate, amount, fee=0.2)
click to toggle source
Sell the quote currency for the base currency
# File lib/holdings/simple.rb, line 70 def sell(base_currency, quote_currency, exchange_rate, amount, fee=0.2) debit(quote_currency, amount) base_amount_before_fee = amount / exchange_rate base_amount_after_fee = base_amount_before_fee - calculate_fee(fee, base_amount_before_fee) credit(base_currency, base_amount_after_fee) puts "#{base_currency}#{amount} @ #{quote_currency}#{exchange_rate} -> USD#{base_amount_after_fee}" if ENV['DEBUG'] end