Current section
17 Versions
Jump to
Current section
17 Versions
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…