nobrick / bitmex

BitMEX client library for Elixir.
MIT License
9 stars 5 forks source link

Bitmex.Rest.RateLimiter ArgumentError #7

Open masterkain opened 5 years ago

masterkain commented 5 years ago

I'm trying a simple Bitmex.Rest.Order.delete(order_ids) against bitmex live:

04:08:06.439 [error] GenServer Bitmex.Rest.RateLimiter terminating
** (ArgumentError) argument error
    :erlang.element(2, nil)
    (bitmex) lib/bitmex/rest/rate_limiter.ex:57: Bitmex.Rest.RateLimiter.parse_to_int/2
    (bitmex) lib/bitmex/rest/rate_limiter.ex:35: Bitmex.Rest.RateLimiter.handle_call/3
    (stdlib) gen_server.erl:661: :gen_server.try_handle_call/4
    (stdlib) gen_server.erl:690: :gen_server.handle_msg/6
    (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
Last message (from #PID<0.1411.0>): {:set_rate, [{"Date", "Sat, 02 Mar 2019 03:08:06 GMT"}, {"Content-Type", "application/json; charset=utf-8"}, {"Content-Length", "86"}, {"Connection", "keep-alive"}, {"Set-Cookie", "AWSALB=xxxx+; Expires=Sat, 09 Mar 2019 03:08:06 GMT; Path=/"}, {"ETag", "W/\"56-ClBa+ONjQwDiPDbsrZZF0fLcWX4\""}, {"Strict-Transport-Security", "max-age=31536000; includeSubDomains"}]}
State: %{rate: %{limit: 300, remaining: 300, reset: nil}}
Client #PID<0.1411.0> is alive

    (stdlib) gen.erl:169: :gen.do_call/4
    (elixir) lib/gen_server.ex:986: GenServer.call/3
    (bitmex) lib/bitmex/rest/requester.ex:46: Bitmex.Rest.Requester.handle_info/2
    (stdlib) gen_server.erl:637: :gen_server.try_dispatch/4
    (stdlib) gen_server.erl:711: :gen_server.handle_msg/6
    (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
04:08:06.443 [error] GenServer #PID<0.1411.0> terminating
** (stop) exited in: GenServer.call(Bitmex.Rest.RateLimiter, {:set_rate, [{"Date", "Sat, 02 Mar 2019 03:08:06 GMT"}, {"Content-Type", "application/json; charset=utf-8"}, {"Content-Length", "86"}, {"Connection", "keep-alive"}, {"Set-Cookie", "AWSALB=xxxx+; Expires=Sat, 09 Mar 2019 03:08:06 GMT; Path=/"}, {"ETag", "W/\"56-ClBa+ONjQwDiPDbsrZZF0fLcWX4\""}, {"Strict-Transport-Security", "max-age=31536000; includeSubDomains"}]}, 5000)
    ** (EXIT) an exception was raised:
        ** (ArgumentError) argument error
            :erlang.element(2, nil)
            (bitmex) lib/bitmex/rest/rate_limiter.ex:57: Bitmex.Rest.RateLimiter.parse_to_int/2
            (bitmex) lib/bitmex/rest/rate_limiter.ex:35: Bitmex.Rest.RateLimiter.handle_call/3
            (stdlib) gen_server.erl:661: :gen_server.try_handle_call/4
            (stdlib) gen_server.erl:690: :gen_server.handle_msg/6
            (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
    (elixir) lib/gen_server.ex:989: GenServer.call/3
    (bitmex) lib/bitmex/rest/requester.ex:46: Bitmex.Rest.Requester.handle_info/2
    (stdlib) gen_server.erl:637: :gen_server.try_dispatch/4
    (stdlib) gen_server.erl:711: :gen_server.handle_msg/6
    (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
Last message: %HTTPoison.AsyncHeaders{headers: [{"Date", "Sat, 02 Mar 2019 03:08:06 GMT"}, {"Content-Type", "application/json; charset=utf-8"}, {"Content-Length", "86"}, {"Connection", "keep-alive"}, {"Set-Cookie", "AWSALB=xxxx+; Expires=Sat, 09 Mar 2019 03:08:06 GMT; Path=/"}, {"ETag", "W/\"56-ClBa+ONjQwDiPDbsrZZF0fLcWX4\""}, {"Strict-Transport-Security", "max-age=31536000; includeSubDomains"}], id: #Reference<0.994756842.2994995206.103419>}
State: %{async_id: #Reference<0.994756842.2994995206.103419>, client: {#PID<0.1201.0>, #Reference<0.994756842.2994995206.103385>}, request_url: "https://www.bitmex.com/api/v1/order", response: "", status_code: 400, user: {#PID<0.1227.0>, #Reference<0.994756842.2994995206.103384>}}
04:08:06.444 [error] GenServer #PID<0.1227.0> terminating
** (stop) exited in: GenServer.call(Bitmex.Rest.Client, {:auth_delete, "/order", "647811ea-f93a-6ce6-e1a4-55c6821cd8aa"}, :infinity)
    ** (EXIT) exited in: GenServer.call(Bitmex.Rest.RateLimiter, {:set_rate, [{"Date", "Sat, 02 Mar 2019 03:08:06 GMT"}, {"Content-Type", "application/json; charset=utf-8"}, {"Content-Length", "86"}, {"Connection", "keep-alive"}, {"Set-Cookie", "AWSALB=xxxx+; Expires=Sat, 09 Mar 2019 03:08:06 GMT; Path=/"}, {"ETag", "W/\"56-ClBa+ONjQwDiPDbsrZZF0fLcWX4\""}, {"Strict-Transport-Security", "max-age=31536000; includeSubDomains"}]}, 5000)
        ** (EXIT) an exception was raised:
            ** (ArgumentError) argument error
                :erlang.element(2, nil)
                (bitmex) lib/bitmex/rest/rate_limiter.ex:57: Bitmex.Rest.RateLimiter.parse_to_int/2
                (bitmex) lib/bitmex/rest/rate_limiter.ex:35: Bitmex.Rest.RateLimiter.handle_call/3
                (stdlib) gen_server.erl:661: :gen_server.try_handle_call/4
                (stdlib) gen_server.erl:690: :gen_server.handle_msg/6
                (stdlib) proc_lib.erl:249: :proc_lib.init_p_do_apply/3
    (elixir) lib/gen_server.ex:989: GenServer.call/3
    (myproj) lib/myproj/order.ex:102: Myproj.Order.ensure_stop_loss/2
    (myproj) lib/myproj/brain.ex:8: Myproj.Brain.make_decision/1
    (elixir) lib/enum.ex:769: Enum."-each/2-lists^foreach/1-0-"/2
    (elixir) lib/enum.ex:769: Enum.each/2
    (myproj) lib/myproj/brain_scheduler.ex:28: Myproj.Brain.Scheduler.handle_info/2
    (stdlib) gen_server.erl:637: :gen_server.try_dispatch/4
    (stdlib) gen_server.erl:711: :gen_server.handle_msg/6
Last message: :tick
State: []

any idea? thanks

masterkain commented 5 years ago

on testnet (in my case MIX_ENV=dev) it seems to work:

{:ok,
 %HTTPoison.Response{
   body: %{"error" => %{"message" => "Not Found", "name" => "HTTPError"}},
   headers: [
     {"Date", "Sat, 02 Mar 2019 16:46:22 GMT"},
     {"Content-Type", "application/json; charset=utf-8"},
     {"Content-Length", "52"},
     {"Connection", "keep-alive"},
     {"X-RateLimit-Limit", "300"},
     {"X-RateLimit-Remaining", "294"},
     {"X-RateLimit-Reset", "1551545183"},
     {"X-Powered-By", "Profit"},
     {"ETag", "W/\"34-RQXM2uXYmuIoWfjaEE+8njrbtb0\""},
     {"Strict-Transport-Security", "max-age=31536000; includeSubDomains"}
   ],
   request: nil,
   request_url: "https://testnet.bitmex.com/api/v1/order",
   status_code: 404
 }}

maybe in live there are no X-RateLimit headers at the moment? not sure.

another issue with async httpoison requests is that at present time it makes not possible to work out specs with exvcr due to this: https://github.com/parroty/exvcr/issues/75