2016-07-21 10 views
1

Я новичок в Ruby, и я пытаюсь закодировать «простую» систему, поэтому я могу отслеживать транзакцию акций. Вычисляя среднюю цену, и в будущем я попытаюсь получить информацию о дивидендах.Ruby: Отслеживание транзакций с использованием Hash

До сих пор мой код выглядит следующим образом (ПОЖАЛУЙСТА, не стесняйтесь предлагать лучшие способы сделать свой код, как я уже сказал, я новичок).

require 'money' 
require 'money/bank/google_currency' 
require 'monetize' 
require 'date' 
require 'ystock' 
require 'ostruct' 

# (optional) 
# set the seconds after than the current rates are automatically expired 
# by default, they never expire 
Money::Bank::GoogleCurrency.ttl_in_seconds = 86400 
I18n.enforce_available_locales = false #erro no formatting... 
# set default bank to instance of GoogleCurrency 
Money.default_bank = Money::Bank::GoogleCurrency.new 

class Stock 

attr_accessor :code, :quantity, :price, :transactions, :spotprice 

    def initialize(code:) 
     @code = code 
     @quantity =00 
     @price = 00.to_money(:BRL) 
     @transactions = [] 
     @spotprice = 0.to_money(:BRL) 
    end  

    def spotprice 
     begin 
      asset_temp = Ystock.quote(@code.to_s + ".sa") # since it is South America. 
      asset_info = OpenStruct.new asset_temp # organize it. 
      @spotprice = asset_info.price.to_money(:BRL) # get the price. And transform it to Money, local currency 
     rescue => @error #Is there an TCP/IP error? 
      @spotprice = 0.to_money(:BRL) 
     end 
    end 

    def buy (quantity:, price:, fees:, date:0) 
     transactions.push type: "BUY", date: Date.strptime(date.to_s, '%d/%m/%Y'), quantity: quantity, price: price.to_money(:BRL), fees: fees.to_money(:BRL) 
     #Lets calculate the average price that we bought: 
     new_price = (((@quantity * @price.to_money(:BRL))) + ((quantity * price.to_money(:BRL)) + fees.to_money(:BRL)))/(@quantity + quantity) 
     @quantity += quantity 
     @price = new_price.to_money(:BRL) # new price is the average price. 
    end 

    def sell (quantity:,price:, fees:, date:) 
     transactions.push type: "SELL", date: Date.strptime(date.to_s,  '%d/%m/%Y'), quantity: quantity, price: price.to_money(:BRL), fees:  fees.to_money(:BRL) 
     @quantity -= quantity 
    end 
end 

Например, я могу создать актив, и сделать покупает и продает:

ciel3 = Stock.new(code: "CIEL3") 
ciel3.buy(quantity: 100, price: 9.00, fees: 21.5, date: "12/05/2015") 
p ciel3 
ciel3.buy(quantity: 100,price: 12, fees: 21.7, date: "12/06/2015") 
ciel3.sell(quantity: 50,price: 11.5,fees: 20.86, date: "20/06/2015") 
p ciel3 
ciel3.buy(quantity: 200,price: 15,fees: 23.6, date: "12/07/2015") 
puts ciel3.price.format 
puts 
puts 
# puts ciel3.spotprice.format 
p ciel3.transactions 

До сих пор, это нормально (но я думаю, что есть более чистый и более читаемым способ сделать он ... не уверен).

Но давайте предположим, что я хочу просмотреть все транзакции типа «ПРОДАВАТЬ». Как я могу это сделать? Как заглянуть внутрь массива ciel3.transaction, который имеет hash: type ?? Tnks

ответ

3

Вместо использования хэша вы, вероятно, хотите класс Transaction.

Если вы поддерживаете его с помощью БД и используете ActiveRecord, поиск будет очень простым.

Если нет, то вы можете сделать ciel3.transactions.select{|t| t[:type] == 'SELL'}

+0

B. Семь, спасибо !! Это идеально. Я не знаю (пока) о классе Transaction. Я взгляну. Не могли бы вы дать какой-либо другой намек на мой код? –

+0

Мне не удалось найти класс Transaction для Ruby. Только для Rails, это то же самое? –

+0

Вы бы сделали свой собственный класс 'Transaction':' class Transaction'. –

0

Я написал простой командной строки приложение управления запасами в Ruby. Вероятно, вы можете повторно использовать много кода для своего проекта.

Это на моем GitHub: https://github.com/brunofacca/udacity-inventory-manager

+0

«В уме новичка есть много возможностей, в уме эксперта их мало». ;-) –