2016-01-20 2 views
-4

Я использую HTTParty для подключения к API-интерфейсу Stockfighter.io и получения котировки акций, которые затем извлекаю из цены за акцию и добавьте ее в конец массива $averageArr.`+ 'nil не может быть принудительно введен в FixNum (TypeError) не исчезнет

Я пытаюсь усреднить последние пять значений постоянно обновляемого массива, $averageArr, и поэтому я думал, что сделаю переменную sum, установив ее в ноль, добавив к ней последние пять значений, а затем разделим ее на 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 (комментировал), в котором я получаю ошибки о FixNum и nil:

/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>' 

я мог бы пытаться доступ и индекс из области действия в массиве, но это, похоже, не является проблемой. Любая помощь будет оценена по достоинству.

+1

Ваш код имеет много ошибок. Чтобы избавиться от этой ошибки, вы можете добавить '.to_i'' в конец этой строки следующим образом:' '$ averageArr.last.to_i''. Ставка это не поможет вам. –

+0

Спасибо! Я попробую это! –

+0

@lurker Взгляните на предыдущую строку. '' puts'' никогда не будет вызван. –

ответ

0

Ваш синтаксис в порядке. Проблема в том, что ваши методы не проверяют данные.

a += b расширился до a = a + b, что вызовет ошибку, с которой вы столкнулись, когда b - nil.

Вы должны убедиться, что getQuote всегда возвращает число или выполняет то, что вы хотите усреднить, в число перед выполнением математических операций.

Для первых, вы можете изменить return orderbook["last"] к return orderbook["last"].to_f

Для последнего sum += $averageArr[$averageArr.count - i].to_f

Смежные вопросы