2016-07-21 21 views
1

Ich bin neu in Ruby, und ich versuche, ein "einfaches" System zu kodieren, damit ich die Aktientransaktionen verfolgen kann. Den Durchschnittspreis errechnend, und in der Zukunft werde ich versuchen, Dividendeninformationen zu erhalten.Ruby: Verfolgung von Stock Transaction mit Hash

So weit sieht mein Code so aus (bitte zögern Sie nicht, bessere Möglichkeiten vorzuschlagen, um meinen Code zu machen, wie ich sagte, ich bin neu).

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 

Zum Beispiel kann ich den Vermögenswert, erstellen und kauft machen und verkauft:

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 

weit Also, es in Ordnung ist (aber ich denke, dass eine saubere und lesbare Weise gibt es zu tun es ... nicht sicher).

Aber nehmen wir an, ich möchte alle Transaktionen des Typs "SELL" anzeigen. Wie kann ich das tun? Wie man in das ciel3.transaction Array schaut, das den Hash hat: type ?? Tnks

Antwort

3

Anstatt einen Hash zu verwenden, möchten Sie wahrscheinlich eine Transaction Klasse.

Wenn Sie es mit einer Datenbank sichern und ActiveRecord verwenden, wird die Suche sehr einfach.

Wenn nicht, können Sie ciel3.transactions.select{|t| t[:type] == 'SELL'} tun

+0

B. Sieben, danke !! Es ist perfekt. Ich weiß (noch) nicht über die Transaction-Klasse. Ich werde nachsehen. Würden Sie meinem Code einen anderen Hinweis geben? –

+0

Ich konnte die Transaktionsklasse für Ruby nicht finden. Nur für Rails, ist es das Gleiche? –

+0

Sie würden Ihre eigene 'Transaction' Klasse erstellen:' class Transaction'. –

0

ich ein einfaches Kommandozeilen-Inventar-Management-app in Ruby geschrieben. Sie können wahrscheinlich viel Code für Ihr Projekt wiederverwenden.

Es ist auf meinem GitHub: https://github.com/brunofacca/udacity-inventory-manager

+0

"Im Anfängergeist gibt es viele Möglichkeiten, in der Meinung des Experten gibt es wenige." ;-) –