defmodule Ibex.Message do
require Logger
def make_field(f) do
f <> <<0>>
end
def make_msg(fields, l) do
<<l::size(32)>> <> fields <> <<0>>
end
def get_msg_length(msg) do
byte_size(msg) + 1
end
def message_version() do
<<2>>
end
end
defprotocol IBMessage do
def to_ib_api(msg)
end
defimpl IBMessage, for: List do
require Logger
def to_ib_api(msg) do
fields =
Enum.reduce(msg, <<>>, fn f, acc ->
acc <> Ibex.Message.make_field(f)
end)
Logger.debug("Print: #{inspect(fields)}")
length = Ibex.Message.get_msg_length(to_string(fields))
Ibex.Message.make_msg(fields, length)
end
end
defmodule Ibex.Messages.Inbound do
require Logger
def parse(m) do
<<l::size(32), rest::binary>> = m
fields = String.split(rest, <<0>>)
code = Enum.at(fields, 0)
code = Ibex.Messages.Types.Inbound.parse(String.to_integer(code))
{l, code, fields}
end
end
defmodule Ibex.Messages.Outbound do
require Logger
defmodule ReqIds do
alias Ibex.Messages.Types.Outbound, as: Outbound
def t() do
code = to_string(Outbound.parse(:req_ids))
[
code,
<<"1">>,
<<"1">>
]
end
end
defmodule ReqContractDetails do
alias Ibex.Messages.Types.Outbound, as: Outbound
def t(req_id, symbol, sec_type) do
code = to_string(Outbound.parse(:req_contract_data))
[
code,
<<"8">>,
req_id,
symbol,
sec_type
]
end
end
defmodule ReqMatchingSymbols do
alias Ibex.Messages.Types.Outbound, as: Outbound
def t(reqId, symbol) do
code = to_string(Outbound.parse(:req_matching_symbols))
[
code,
reqId,
symbol
]
end
end
defmodule ReqHistoricalData do
alias Ibex.Messages.Types.Outbound, as: Outbound
@version <<"6">>
def t(
req_id,
contract,
end_date_time,
duration_str,
bar_size_setting,
what_to_show,
useRTH,
formatDate,
keepUpToDate,
chartOption
) do
code = to_string(Outbound.parse(:req_historical_data))
contract_fields = contract.to_fields()
[
code,
@version,
req_id,
contract[:con_id]
]
end
end
end