-4

私は HTTParty を使用して stockfighter.io の API に接続し、株式の相場を取得しています。それから 1 株あたりの価格を抽出し、$averageArr配列の末尾に追加します。

常に更新される配列の最後の 5 つの値を平均化しようとしている$averageArrので、変数sumをゼロに設定し、最後の 5 つの値を追加してから 5 で割って、動的で変化する値を取得すると考えました。平均。

これが私のコードです:

require 'rubygems'
require 'httparty'
require 'json'

apikey = 'API_KEY_FOR_LOGIN_HERE'
venue = "VENUEX"
stock = "FOOBAR"

base_url = "https://api.stockfighter.io/ob/api"

account = "MY_ACCOUNT_HERE"

$averageArr = []

$counter = 0

$currAve = 0


def getQuote(stock, venue, account)

    response = HTTParty.get("https://api.stockfighter.io/ob/api/venues/#{venue}/stocks/#{stock}/quote")

    orderbook = response.parsed_response

    puts orderbook["ok"]

    return orderbook["last"]
    puts orderbook["lastTrade"]

end


def getAverage(stock, venue, account)

    $averageArr.push(getQuote(stock, venue, account))
    $counter += 1

    if $counter > 5

        sum = 0

        #line 43
        for i in 1..5 do
            # this one is line 45
            sum += $averageArr[$averageArr.count - i]

        end


        return sum/5
        $currAve = sum/5

    else

        return 'WAITING FOR QUOTE. CURRENT:'

    end
end


# line 62
for i in 1..10 do

    # line 64
    getAverage(stock, venue, account)

    if $counter > 5

        if getQuote(stock, venue, account) < $currAve - 25 and numShares < 999

            order = {

                    "account" => account,
                    "venue" => venue,
                    "symbol" => stock,
                    "price" => 1,  #$250.00 -- probably ludicrously high
                    "qty" => 1,
                    "direction" => "buy",
                    "orderType" => "market"  # See the order docs for what a limit order is

                  }

            response = HTTParty.post("#{base_url}/venues/#{venue}/stocks/#{stock}/orders",
                                   :body => JSON.dump(order),
                                   :headers => {"X-Starfighter-Authorization" => apikey}
                                   )

        elsif getQuote(stock, venue, account) > $currAve + 25 and numShares > 0

            order = {

                    "account" => account,
                    "venue" => venue,
                    "symbol" => stock,
                    "price" => 1,  #$250.00 -- probably ludicrously high
                    "qty" => 1,
                    "direction" => "sell",
                    "orderType" => "market"  # See the order docs for what a limit order is

                  }

            response = HTTParty.post("#{base_url}/venues/#{venue}/stocks/#{stock}/orders",
                                   :body => JSON.dump(order),
                                   :headers => {"X-Starfighter-Authorization" => apikey}
                                   )

        end
    end
end

45 行目 (コメント済み) で問題が発生しており、次のエラーが表示さFixNumnilます。

/Users/kaichristensen/Dropbox/Kai/Stockfighter/level_three_selling.rb:45:in `+': nil can't be coerced into Fixnum (TypeError)
from /Users/kaichristensen/Dropbox/Kai/Stockfighter/level_three_selling.rb:45:in `block in getAverage'
from /Users/kaichristensen/Dropbox/Kai/Stockfighter/level_three_selling.rb:43:in `each'
from /Users/kaichristensen/Dropbox/Kai/Stockfighter/level_three_selling.rb:43:in `getAverage'
from /Users/kaichristensen/Dropbox/Kai/Stockfighter/level_three_selling.rb:64:in `block in <main>'
from /Users/kaichristensen/Dropbox/Kai/Stockfighter/level_three_selling.rb:62:in `each'
from /Users/kaichristensen/Dropbox/Kai/Stockfighter/level_three_selling.rb:62:in `<main>'

配列のスコープ外にアクセスしてインデックスを作成しようとしている可能性がありますが、それは問題ではないようです。どんな助けでも大歓迎です。

4

1 に答える 1

0

あなたの構文は問題ありません。問題は、メソッドがデータを検証していないことです。

a += bに展開され、 isa = a + bのときに直面しているエラーがスローされます。bnil

が常に数値を返すことを確認するか、getQuote数学演算を実行する前に、平均したいものを数値にキャストする必要があります。

前者の場合、次のように変更できreturn orderbook["last"]ますreturn orderbook["last"].to_f

後者については、 sum += $averageArr[$averageArr.count - i].to_f

于 2016-01-20T17:29:09.897 に答える