Current section

17 Versions

Jump to

Compare versions

8 files changed
+207 additions
-9 deletions
  @@ -12,7 +12,7 @@ An api library for [Stockfighter](https://www.stockfighter.io/) in Elixir, provi
12 12 1. Add dealer to your list of dependencies in `mix.exs`:
13 13
14 14 def deps do
15 - [{:dealer, "~> 0.4.1"}]
15 + [{:dealer, "~> 0.5.0"}]
16 16 end
17 17
18 18 2. Ensure dealer is started before your application:
  @@ -41,6 +41,8 @@ If the api request is successful, the response will be a `Dealer.Response` struc
41 41
42 42 Or something bad might happen during the reuqest, the response will be: `{:error, term}`.
43 43
44 + Websocket response will be either a `Dealer.Websocket.Response` struct or `{:error, term}`.
45 +
44 46 ## API Documentation
45 47
46 48 ### Check The Api Is Up
  @@ -124,6 +126,38 @@ Documentation link: https://starfighter.readme.io/docs/status-for-all-orders-in-
124 126 iex> Dealer.Orders.status("LBPTEX", "ACCOUNT_NAME", "GVOE")
125 127 ```
126 128
129 + ## Websocket Documentation
130 +
131 + ### Quotes (Ticket Tape)
132 +
133 + Documentation link: https://starfighter.readme.io/docs/quotes-ticker-tape-websocket
134 +
135 + ``` elixir
136 + iex> {account, venue, stock} = {"MSB5372858", "TYAMEX", "PTC"}
137 + iex> socket = Dealer.Websocket.Quotes.connect(account, venue)
138 + iex> Dealer.Websocket.Quotes.recv!(socket)
139 + iex> Dealer.Websocket.Quotes.close(socket)
140 +
141 + iex> socket = Dealer.Websocket.Quotes.connect(account, venue, stock)
142 + iex> Dealer.Websocket.Quotes.recv!(socket)
143 + iex> Dealer.Websocket.Quotes.close(socket)
144 + ```
145 +
146 + ### Executions (Fills)
147 +
148 + Documentation link: https://starfighter.readme.io/docs/executions-fills-websocket
149 +
150 + ``` elixir
151 + iex> {account, venue, stock} = {"MSB5372858", "TYAMEX", "PTC"}
152 + iex> socket = Dealer.Websocket.Executions.connect(account, venue)
153 + iex> Dealer.Websocket.Executions.recv!(socket)
154 + iex> Dealer.Websocket.Executions.close(socket)
155 +
156 + iex> socket = Dealer.Websocket.Executions.connect(account, venue, stock)
157 + iex> Dealer.Websocket.Executions.recv!(socket)
158 + iex> Dealer.Websocket.Executions.close(socket)
159 + ```
160 +
127 161 ## GM Documentation
128 162
129 163 ### Start a level
  @@ -9,7 +9,10 @@
9 9 <<"lib/dealer/orders.ex">>,<<"lib/dealer/orders_status.ex">>,
10 10 <<"lib/dealer/quote.ex">>,<<"lib/dealer/response.ex">>,
11 11 <<"lib/dealer/stock.ex">>,<<"lib/dealer/stocks.ex">>,
12 - <<"lib/dealer/venue.ex">>,<<"mix.exs">>,<<"README.md">>]}.
12 + <<"lib/dealer/venue.ex">>,<<"lib/dealer/websocket.ex">>,
13 + <<"lib/dealer/websocket_executions.ex">>,
14 + <<"lib/dealer/websocket_quotes.ex">>,<<"lib/dealer/websocket_response.ex">>,
15 + <<"mix.exs">>,<<"README.md">>]}.
13 16 {<<"licenses">>,[<<"MIT">>]}.
14 17 {<<"links">>,
15 18 [{<<"Docs">>,<<"https://github.com/larrylv/dealer">>},
  @@ -24,5 +27,9 @@
24 27 {<<"poison">>,
25 28 [{<<"app">>,<<"poison">>},
26 29 {<<"optional">>,false},
27 - {<<"requirement">>,<<"~> 1.5">>}]}]}.
28 - {<<"version">>,<<"0.4.1">>}.
30 + {<<"requirement">>,<<"~> 1.5">>}]},
31 + {<<"socket">>,
32 + [{<<"app">>,<<"socket">>},
33 + {<<"optional">>,false},
34 + {<<"requirement">>,<<"~> 0.3.1">>}]}]}.
35 + {<<"version">>,<<"0.5.0">>}.
  @@ -29,7 +29,7 @@ defmodule Dealer.Response do
29 29 It returns `Dealer.Response` struct in case of success,
30 30 otherwise `{:error, term}`.
31 31 """
32 - @spec new(map, map) :: __MODULE__ | {:error, term}
32 + @spec new(tuple, map) :: __MODULE__ | {:error, term}
33 33 def new({:ok, response}, options) do
34 34 case parse_body(response, options) do
35 35 {:ok, data} ->
  @@ -39,12 +39,11 @@ defmodule Dealer.Response do
39 39 status_code: response.status_code
40 40 }
41 41 {:error, error} ->
42 - IO.inspect response
43 42 {:error, error}
44 43 end
45 44 end
46 45
47 - @spec new(map, map) :: {:error, term}
46 + @spec new(tuple, map) :: {:error, term}
48 47 def new({:error, %HTTPoison.Error{reason: reason}}, _options) do
49 48 {:error, reason}
50 49 end
  @@ -0,0 +1,17 @@
1 + defmodule Dealer.Websocket do
2 + @moduledoc false
3 +
4 + @doc "Close the websocket"
5 + @spec close(Socket.Web.t) :: atom
6 + def close(socket) do
7 + Socket.Web.close(socket)
8 + end
9 +
10 + @doc "Receive message from websocket"
11 + @spec recv!(Socket.Web.t) :: Dealer.Websocket.Response
12 + def recv!(socket) do
13 + socket
14 + |> Socket.Web.recv!
15 + |> Dealer.Websocket.Response.new
16 + end
17 + end
  @@ -0,0 +1,41 @@
1 + defmodule Dealer.Websocket.Executions do
2 + @moduledoc """
3 + Dealing with executions websocket.
4 + """
5 +
6 + @domain "www.stockfighter.io"
7 +
8 + @executions_path "/ob/api/ws/:trading_account/venues/:venue/executions"
9 + @executions_stock_path "/ob/api/ws/:trading_account/venues/:venue/executions/stocks/:stock"
10 +
11 + import Dealer, only: [build_path: 2]
12 +
13 + @doc "Executions (Fills) Websocket"
14 +
15 + @spec connect(String.t, String.t) :: Socket.Web.t
16 + def connect(trading_account, venue) do
17 + path = build_path(@executions_path, %{trading_account: trading_account, venue: venue})
18 +
19 + Socket.Web.connect!(@domain, path: path, secure: true)
20 + end
21 +
22 + @spec connect(String.t, String.t, String.t) :: Socket.Web.t
23 + def connect(trading_account, venue, stock) do
24 + path = build_path(@executions_stock_path, %{trading_account: trading_account, venue: venue, stock: stock})
25 +
26 + Socket.Web.connect!(@domain, path: path, secure: true)
27 + end
28 +
29 + @doc "Close the websocket"
30 + @spec close(Socket.Web.t) :: atom
31 + def close(socket) do
32 + Dealer.Websocket.close(socket)
33 + end
34 +
35 + @doc "Receive message from websocket"
36 + @spec recv!(Socket.Web.t) :: Dealer.Websocket.Response
37 + def recv!(socket) do
38 + Dealer.Websocket.recv!(socket)
39 + end
40 + end
41 +
Loading more files…