Ruby:使用Hash跟踪股票交易

我是Ruby的新手,我正在尝试编写一个“简单”系统,因此我可以跟踪股票交易。 计算平均价格,将来我会尝试获得股息信息。

到目前为止,我的代码看起来像这样(请随意提出更好的方法来执行我的代码,正如我所说,我是新的)。

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

您可能想要一个Transaction类,而不是使用哈希。

如果您使用数据库备份它并使用ActiveRecord,那么搜索将非常简单。

如果没有,你可以做ciel3.transactions.select{|t| t[:type] == 'SELL'} ciel3.transactions.select{|t| t[:type] == 'SELL'}

我在Ruby中编写了一个简单的命令行库存管理应用程序。 您可以为项目重用大量代码。

它在我的GitHub上: https : //github.com/brunofacca/udacity-inventory-manager