From c742a3e0d1222cb910a236f80fd3e56741350ffe Mon Sep 17 00:00:00 2001 From: Nick Bair Date: Mon, 27 Jan 2025 16:23:23 -0700 Subject: [PATCH] Add missing transactions (#47) * Add missing transactions * Fix types * Missed one --- README.md | 4 +- .../definitions/account/account_changes.ex | 70 +++++++++++++-- .../transaction/daily_financing.ex | 2 +- .../delayed_trade_closure_transaction.ex | 47 ++++++++++ .../dividend_adjustment_transaction.ex | 53 ++++++++++++ .../fixed_price_order_transaction.ex | 57 +++++++++++++ .../limit_order_reject_transaction.ex | 80 +++++++++++++++++ .../transaction/limit_order_transaction.ex | 82 ++++++++++++++++++ .../margin_call_enter_transaction.ex | 42 +++++++++ .../margin_call_exit_transaction.ex | 42 +++++++++ .../margin_call_extend_transaction.ex | 46 ++++++++++ ...ket_if_touched_order_reject_transaction.ex | 85 +++++++++++++++++++ .../market_if_touched_order_transaction.ex | 84 ++++++++++++++++++ .../transaction/order_reject_transaction.ex | 49 +++++++++++ .../reset_resettable_pl_transaction.ex | 42 +++++++++ .../transfer_funds_reject_transaction.ex | 51 +++++++++++ .../transaction/transfer_funds_transaction.ex | 52 ++++++++++++ mix.exs | 2 +- 18 files changed, 880 insertions(+), 10 deletions(-) create mode 100644 lib/models/definitions/transaction/delayed_trade_closure_transaction.ex create mode 100644 lib/models/definitions/transaction/dividend_adjustment_transaction.ex create mode 100644 lib/models/definitions/transaction/fixed_price_order_transaction.ex create mode 100644 lib/models/definitions/transaction/limit_order_reject_transaction.ex create mode 100644 lib/models/definitions/transaction/limit_order_transaction.ex create mode 100644 lib/models/definitions/transaction/margin_call_enter_transaction.ex create mode 100644 lib/models/definitions/transaction/margin_call_exit_transaction.ex create mode 100644 lib/models/definitions/transaction/margin_call_extend_transaction.ex create mode 100644 lib/models/definitions/transaction/market_if_touched_order_reject_transaction.ex create mode 100644 lib/models/definitions/transaction/market_if_touched_order_transaction.ex create mode 100644 lib/models/definitions/transaction/order_reject_transaction.ex create mode 100644 lib/models/definitions/transaction/reset_resettable_pl_transaction.ex create mode 100644 lib/models/definitions/transaction/transfer_funds_reject_transaction.ex create mode 100644 lib/models/definitions/transaction/transfer_funds_transaction.ex diff --git a/README.md b/README.md index b357e0a..5e773f7 100644 --- a/README.md +++ b/README.md @@ -12,14 +12,14 @@ Trading foreign exchange (forex) on margin carries a high level of risk and may This SDK is provided "as-is," without any warranty of any kind, either expressed or implied, including but not limited to the implied warranties of merchantability, fitness for a particular purpose, or non-infringement. The use of this SDK is at your own risk, and we make no guarantees regarding its accuracy, reliability, or suitability for any specific trading strategy or purpose. Users are responsible for their own trading decisions and should seek independent financial advice if necessary. ## TODO / Known Issues -1. Limited test coverage, validaiton of schemas +1. Limited test coverage, validation of schemas 2. Not yet available on hex ## Installation ```elixir def deps do [ - {:ex_oanda, git: "https://github.com/nicholasbair/ex_oanda.git", tag: "v0.0.9"} + {:ex_oanda, git: "https://github.com/nicholasbair/ex_oanda.git", tag: "v0.0.10"} ] end ``` diff --git a/lib/models/definitions/account/account_changes.ex b/lib/models/definitions/account/account_changes.ex index 0fbc31a..7deb0a7 100644 --- a/lib/models/definitions/account/account_changes.ex +++ b/lib/models/definitions/account/account_changes.ex @@ -8,14 +8,43 @@ defmodule ExOanda.AccountChanges do import PolymorphicEmbed alias ExOanda.{ - Order, - Position, - TradeSummary, + ClientConfigureRejectTransaction, + ClientConfigureTransaction, DailyFinancing, - MarketOrderTransaction, + DelayedTradeClosureTransaction, + DividendAdjustmentTransaction, + FixedPriceOrderTransaction, + GuaranteedStopLossOrderRejectTransaction, + GuaranteedStopLossOrderTransaction, + LimitOrderRejectTransaction, + LimitOrderTransaction, + MarginCallEnterTransaction, + MarginCallExtendTransaction, + MarginCallExitTransaction, + MarketIfTouchedOrderRejectTransaction, + MarketIfTouchedOrderTransaction, MarketOrderRejectTransaction, + MarketOrderTransaction, + Order, + OrderCancelRejectTransaction, + OrderCancelTransaction, + OrderClientExtensionsModifyRejectTransaction, + OrderClientExtensionsModifyTransaction, OrderFillTransaction, - TradeClientExtensionsModifyTransaction + OrderRejectTransaction, + Position, + ResetResettablePLTransaction, + StopLossOrderRejectTransaction, + StopLossOrderTransaction, + TakeProfitOrderRejectTransaction, + TakeProfitOrderTransaction, + TradeClientExtensionsModifyRejectTransaction, + TradeClientExtensionsModifyTransaction, + TradeSummary, + TrailingStopLossOrderRejectTransaction, + TrailingStopLossOrderTransaction, + TransferFundsRejectTransaction, + TransferFundsTransaction } @primary_key false @@ -31,13 +60,42 @@ defmodule ExOanda.AccountChanges do embeds_many :positions, Position polymorphic_embeds_many :transactions, types: [ + CLIENT_CONFIGURE: ClientConfigureTransaction, + CLIENT_CONFIGURE_REJECT: ClientConfigureRejectTransaction, DAILY_FINANCING: DailyFinancing, + DELAYED_TRADE_CLOSURE: DelayedTradeClosureTransaction, + DIVIDEND_ADJUSTMENT: DividendAdjustmentTransaction, + FIXED_PRICE_ORDER: FixedPriceOrderTransaction, + GUARANTEED_STOP_LOSS_ORDER: GuaranteedStopLossOrderTransaction, + GUARANTEED_STOP_LOSS_ORDER_REJECT: GuaranteedStopLossOrderRejectTransaction, + LIMIT_ORDER: LimitOrderTransaction, + LIMIT_ORDER_REJECT: LimitOrderRejectTransaction, + MARGIN_CALL_ENTER: MarginCallEnterTransaction, + MARGIN_CALL_EXTEND: MarginCallExtendTransaction, + MARGIN_CALL_EXIT: MarginCallExitTransaction, + MARKET_IF_TOUCHED_ORDER: MarketIfTouchedOrderTransaction, + MARKET_IF_TOUCHED_ORDER_REJECT: MarketIfTouchedOrderRejectTransaction, MARKET_ORDER: MarketOrderTransaction, MARKET_ORDER_REJECT: MarketOrderRejectTransaction, + ORDER_CANCEL: OrderCancelTransaction, + ORDER_CANCEL_REJECT: OrderCancelRejectTransaction, + ORDER_CLIENT_EXTENSIONS_MODIFY: OrderClientExtensionsModifyTransaction, + ORDER_CLIENT_EXTENSIONS_MODIFY_REJECT: OrderClientExtensionsModifyRejectTransaction, ORDER_FILL: OrderFillTransaction, + ORDER_REJECT: OrderRejectTransaction, + RESET_RESETTABLE_PL: ResetResettablePLTransaction, + STOP_LOSS_ORDER: StopLossOrderTransaction, + STOP_LOSS_ORDER_REJECT: StopLossOrderRejectTransaction, + TAKE_PROFIT_ORDER: TakeProfitOrderTransaction, + TAKE_PROFIT_ORDER_REJECT: TakeProfitOrderRejectTransaction, TRADE_CLIENT_EXTENSIONS_MODIFY: TradeClientExtensionsModifyTransaction, + TRADE_CLIENT_EXTENSIONS_MODIFY_REJECT: TradeClientExtensionsModifyRejectTransaction, + TRAILING_STOP_LOSS_ORDER: TrailingStopLossOrderTransaction, + TRAILING_STOP_LOSS_ORDER_REJECT: TrailingStopLossOrderRejectTransaction, + TRANSFER_FUNDS: TransferFundsTransaction, + TRANSFER_FUNDS_REJECT: TransferFundsRejectTransaction ], - on_type_not_found: :changeset_error, + on_type_not_found: :raise, on_replace: :delete, type_field_name: :type end diff --git a/lib/models/definitions/transaction/daily_financing.ex b/lib/models/definitions/transaction/daily_financing.ex index ac287ab..4b9e91b 100644 --- a/lib/models/definitions/transaction/daily_financing.ex +++ b/lib/models/definitions/transaction/daily_financing.ex @@ -17,7 +17,7 @@ defmodule ExOanda.DailyFinancing do field(:batch_id, :string) field(:request_id, :string) field(:type, Atom, default: :DAILY_FINANCING) - field(:financing, :integer) + field(:financing, :float) field(:account_balance, :float) field(:position_financings, {:array, :map}) end diff --git a/lib/models/definitions/transaction/delayed_trade_closure_transaction.ex b/lib/models/definitions/transaction/delayed_trade_closure_transaction.ex new file mode 100644 index 0000000..2b2315f --- /dev/null +++ b/lib/models/definitions/transaction/delayed_trade_closure_transaction.ex @@ -0,0 +1,47 @@ +defmodule Oanda.Transaction.DelayedTradeClosureTransaction do + @moduledoc """ + A DelayedTradeClosureTransaction represents the immediate closure of a Trade that was + requested to be delayed. + """ + + use TypedEctoSchema + import Ecto.Changeset + alias ExOanda.Type.Atom + + @primary_key false + + embedded_schema do + field(:id, :string) + field(:time, :utc_datetime_usec) + field(:user_id, :integer) + field(:account_id, :string) + field(:batch_id, :string) + field(:request_id, :string) + field(:type, Atom, default: :DELAYED_TRADE_CLOSURE) + field(:reason, :string) + field(:trade_ids, {:array, :string}) + end + + def changeset(struct, data) do + struct + |> cast(data, [ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :request_id, + :type, + :reason, + :trade_ids + ]) + |> validate_required([ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :type + ]) + end +end diff --git a/lib/models/definitions/transaction/dividend_adjustment_transaction.ex b/lib/models/definitions/transaction/dividend_adjustment_transaction.ex new file mode 100644 index 0000000..06c7a99 --- /dev/null +++ b/lib/models/definitions/transaction/dividend_adjustment_transaction.ex @@ -0,0 +1,53 @@ +defmodule Oanda.Transaction.DividendAdjustmentTransaction do + @moduledoc """ + A DividendAdjustmentTransaction represents a dividend adjustment made to an Account. + """ + + use TypedEctoSchema + import Ecto.Changeset + alias ExOanda.Type.Atom + + @primary_key false + + embedded_schema do + field(:id, :string) + field(:time, :utc_datetime_usec) + field(:user_id, :integer) + field(:account_id, :string) + field(:batch_id, :string) + field(:request_id, :string) + field(:type, Atom, default: :DIVIDEND_ADJUSTMENT) + field(:instrument, Atom) + field(:dividend_rate, :float) + field(:quote_units, :float) + field(:home_conversion_factors, :map) + field(:account_balance, :float) + end + + def changeset(struct, data) do + struct + |> cast(data, [ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :request_id, + :type, + :instrument, + :dividend_rate, + :quote_units, + :home_conversion_factors, + :account_balance + ]) + |> validate_required([ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :type, + :instrument + ]) + end +end diff --git a/lib/models/definitions/transaction/fixed_price_order_transaction.ex b/lib/models/definitions/transaction/fixed_price_order_transaction.ex new file mode 100644 index 0000000..dfc82f7 --- /dev/null +++ b/lib/models/definitions/transaction/fixed_price_order_transaction.ex @@ -0,0 +1,57 @@ +defmodule Oanda.Transaction.FixedPriceOrderTransaction do + @moduledoc """ + A FixedPriceOrderTransaction represents the creation of a Fixed Price Order in the user's Account. + """ + + use TypedEctoSchema + import Ecto.Changeset + alias ExOanda.Type.Atom + + @primary_key false + + embedded_schema do + field(:id, :string) + field(:time, :utc_datetime_usec) + field(:user_id, :integer) + field(:account_id, :string) + field(:batch_id, :string) + field(:request_id, :string) + field(:type, Atom, default: :FIXED_PRICE_ORDER) + field(:instrument, Atom) + field(:units, :float) + field(:price, :float) + field(:position_fill, :string) + field(:trade_state, :string) + field(:reason, :string) + end + + def changeset(struct, data) do + struct + |> cast(data, [ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :request_id, + :type, + :instrument, + :units, + :price, + :position_fill, + :trade_state, + :reason + ]) + |> validate_required([ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :type, + :instrument, + :units, + :price + ]) + end +end diff --git a/lib/models/definitions/transaction/limit_order_reject_transaction.ex b/lib/models/definitions/transaction/limit_order_reject_transaction.ex new file mode 100644 index 0000000..a9662a5 --- /dev/null +++ b/lib/models/definitions/transaction/limit_order_reject_transaction.ex @@ -0,0 +1,80 @@ +defmodule Oanda.Transaction.LimitOrderRejectTransaction do + @moduledoc """ + A LimitOrderRejectTransaction represents the rejection of the creation of a Limit Order. + """ + + use TypedEctoSchema + import Ecto.Changeset + alias ExOanda.Type.Atom + + alias Oanda.Transaction.{ + ClientExtensions, + TakeProfitDetails, + StopLossDetails, + TrailingStopLossDetails, + GuaranteedStopLossDetails + } + + @primary_key false + + embedded_schema do + field(:id, :string) + field(:time, :utc_datetime_usec) + field(:user_id, :integer) + field(:account_id, :string) + field(:batch_id, :string) + field(:request_id, :string) + field(:type, Atom, default: :LIMIT_ORDER_REJECT) + field(:instrument, Atom) + field(:units, :float) + field(:price, :float) + field(:time_in_force, Ecto.Enum, values: ~w(GTC GTD GFD FOK IOC)a) + field(:gtd_time, :utc_datetime_usec) + field(:position_fill, :string, default: "DEFAULT") + field(:trigger_condition, Ecto.Enum, values: ~w(DEFAULT INVERSE BID ASK MID)a) + field(:reason, :string) + field(:reject_reason, :string) + + embeds_one :client_extensions, ClientExtensions + embeds_one :take_profit_on_fill, TakeProfitDetails + embeds_one :stop_loss_on_fill, StopLossDetails + embeds_one :trailing_stop_loss_on_fill, TrailingStopLossDetails + embeds_one :guaranteed_stop_loss_on_fill, GuaranteedStopLossDetails + end + + def changeset(struct, data) do + struct + |> cast(data, [ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :request_id, + :type, + :instrument, + :units, + :price, + :time_in_force, + :gtd_time, + :position_fill, + :trigger_condition, + :reason, + :reject_reason + ]) + |> cast_embed(:client_extensions) + |> cast_embed(:take_profit_on_fill) + |> cast_embed(:stop_loss_on_fill) + |> cast_embed(:trailing_stop_loss_on_fill) + |> cast_embed(:guaranteed_stop_loss_on_fill) + |> validate_required([ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :type, + :reject_reason + ]) + end +end diff --git a/lib/models/definitions/transaction/limit_order_transaction.ex b/lib/models/definitions/transaction/limit_order_transaction.ex new file mode 100644 index 0000000..81f0006 --- /dev/null +++ b/lib/models/definitions/transaction/limit_order_transaction.ex @@ -0,0 +1,82 @@ +defmodule Oanda.Transaction.LimitOrderTransaction do + @moduledoc """ + A LimitOrderTransaction represents the creation of a Limit Order in the user's Account. + """ + + use TypedEctoSchema + import Ecto.Changeset + alias ExOanda.Type.Atom + + alias Oanda.Transaction.{ + ClientExtensions, + TakeProfitDetails, + StopLossDetails, + TrailingStopLossDetails, + GuaranteedStopLossDetails + } + + @primary_key false + + embedded_schema do + field(:id, :string) + field(:time, :utc_datetime_usec) + field(:user_id, :integer) + field(:account_id, :string) + field(:batch_id, :string) + field(:request_id, :string) + field(:type, Atom, default: :LIMIT_ORDER) + field(:instrument, Atom) + field(:units, :integer) + field(:price, :float) + field(:time_in_force, Ecto.Enum, values: ~w(GTC GTD GFD FOK IOC)a) + field(:gtd_time, :utc_datetime_usec) + field(:position_fill, :string, default: "DEFAULT") + field(:trigger_condition, Ecto.Enum, values: ~w(DEFAULT INVERSE BID ASK MID)a) + field(:reason, :string) + field(:partial_fill, :string) + + embeds_one :client_extensions, ClientExtensions + embeds_one :take_profit_on_fill, TakeProfitDetails + embeds_one :stop_loss_on_fill, StopLossDetails + embeds_one :trailing_stop_loss_on_fill, TrailingStopLossDetails + embeds_one :guaranteed_stop_loss_on_fill, GuaranteedStopLossDetails + end + + def changeset(struct, data) do + struct + |> cast(data, [ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :request_id, + :type, + :instrument, + :units, + :price, + :time_in_force, + :gtd_time, + :position_fill, + :trigger_condition, + :reason, + :partial_fill + ]) + |> cast_embed(:client_extensions) + |> cast_embed(:take_profit_on_fill) + |> cast_embed(:stop_loss_on_fill) + |> cast_embed(:trailing_stop_loss_on_fill) + |> cast_embed(:guaranteed_stop_loss_on_fill) + |> validate_required([ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :type, + :instrument, + :units, + :price + ]) + end +end diff --git a/lib/models/definitions/transaction/margin_call_enter_transaction.ex b/lib/models/definitions/transaction/margin_call_enter_transaction.ex new file mode 100644 index 0000000..f098eba --- /dev/null +++ b/lib/models/definitions/transaction/margin_call_enter_transaction.ex @@ -0,0 +1,42 @@ +defmodule Oanda.Transaction.MarginCallEnterTransaction do + @moduledoc """ + A MarginCallEnterTransaction is created when an Account enters the margin call state. + """ + + use TypedEctoSchema + import Ecto.Changeset + alias ExOanda.Type.Atom + + @primary_key false + + embedded_schema do + field(:id, :string) + field(:time, :utc_datetime_usec) + field(:user_id, :integer) + field(:account_id, :string) + field(:batch_id, :string) + field(:request_id, :string) + field(:type, Atom, default: :MARGIN_CALL_ENTER) + end + + def changeset(struct, data) do + struct + |> cast(data, [ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :request_id, + :type + ]) + |> validate_required([ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :type + ]) + end +end diff --git a/lib/models/definitions/transaction/margin_call_exit_transaction.ex b/lib/models/definitions/transaction/margin_call_exit_transaction.ex new file mode 100644 index 0000000..bcdd1c7 --- /dev/null +++ b/lib/models/definitions/transaction/margin_call_exit_transaction.ex @@ -0,0 +1,42 @@ +defmodule Oanda.Transaction.MarginCallExitTransaction do + @moduledoc """ + A MarginCallExitTransaction is created when an Account exits the margin call state. + """ + + use TypedEctoSchema + import Ecto.Changeset + alias ExOanda.Type.Atom + + @primary_key false + + embedded_schema do + field(:id, :string) + field(:time, :utc_datetime_usec) + field(:user_id, :integer) + field(:account_id, :string) + field(:batch_id, :string) + field(:request_id, :string) + field(:type, Atom, default: :MARGIN_CALL_EXIT) + end + + def changeset(struct, data) do + struct + |> cast(data, [ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :request_id, + :type + ]) + |> validate_required([ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :type + ]) + end +end diff --git a/lib/models/definitions/transaction/margin_call_extend_transaction.ex b/lib/models/definitions/transaction/margin_call_extend_transaction.ex new file mode 100644 index 0000000..d65ffd9 --- /dev/null +++ b/lib/models/definitions/transaction/margin_call_extend_transaction.ex @@ -0,0 +1,46 @@ +defmodule Oanda.Transaction.MarginCallExtendTransaction do + @moduledoc """ + A MarginCallExtendTransaction is created when the margin call state for an Account + has been extended. + """ + + use TypedEctoSchema + import Ecto.Changeset + alias ExOanda.Type.Atom + + @primary_key false + + embedded_schema do + field(:id, :string) + field(:time, :utc_datetime_usec) + field(:user_id, :integer) + field(:account_id, :string) + field(:batch_id, :string) + field(:request_id, :string) + field(:type, Atom, default: :MARGIN_CALL_EXTEND) + field(:extension_number, :integer) + end + + def changeset(struct, data) do + struct + |> cast(data, [ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :request_id, + :type, + :extension_number + ]) + |> validate_required([ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :type, + :extension_number + ]) + end +end diff --git a/lib/models/definitions/transaction/market_if_touched_order_reject_transaction.ex b/lib/models/definitions/transaction/market_if_touched_order_reject_transaction.ex new file mode 100644 index 0000000..ce783b4 --- /dev/null +++ b/lib/models/definitions/transaction/market_if_touched_order_reject_transaction.ex @@ -0,0 +1,85 @@ +defmodule Oanda.Transaction.MarketIfTouchedOrderRejectTransaction do + @moduledoc """ + A MarketIfTouchedOrderRejectTransaction represents the rejection of the creation of a + MarketIfTouched Order. + """ + + use TypedEctoSchema + import Ecto.Changeset + alias ExOanda.Type.Atom + + alias Oanda.Transaction.{ + ClientExtensions, + TakeProfitDetails, + StopLossDetails, + TrailingStopLossDetails, + GuaranteedStopLossDetails + } + + @primary_key false + + embedded_schema do + field(:id, :string) + field(:time, :utc_datetime_usec) + field(:user_id, :integer) + field(:account_id, :string) + field(:batch_id, :string) + field(:request_id, :string) + field(:type, Atom, default: :MARKET_IF_TOUCHED_ORDER_REJECT) + field(:instrument, Atom) + field(:units, :float) + field(:price, :float) + field(:price_bound, :float) + field(:time_in_force, Ecto.Enum, values: ~w(GTC GTD GFD FOK IOC)a) + field(:gtd_time, :utc_datetime_usec) + field(:position_fill, :string, default: "DEFAULT") + field(:trigger_condition, Ecto.Enum, values: ~w(DEFAULT INVERSE BID ASK MID)a) + field(:reason, :string) + field(:reject_reason, :string) + field(:initial_market_price, :float) + + embeds_one :client_extensions, ClientExtensions + embeds_one :take_profit_on_fill, TakeProfitDetails + embeds_one :stop_loss_on_fill, StopLossDetails + embeds_one :trailing_stop_loss_on_fill, TrailingStopLossDetails + embeds_one :guaranteed_stop_loss_on_fill, GuaranteedStopLossDetails + end + + def changeset(struct, data) do + struct + |> cast(data, [ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :request_id, + :type, + :instrument, + :units, + :price, + :price_bound, + :time_in_force, + :gtd_time, + :position_fill, + :trigger_condition, + :reason, + :reject_reason, + :initial_market_price + ]) + |> cast_embed(:client_extensions) + |> cast_embed(:take_profit_on_fill) + |> cast_embed(:stop_loss_on_fill) + |> cast_embed(:trailing_stop_loss_on_fill) + |> cast_embed(:guaranteed_stop_loss_on_fill) + |> validate_required([ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :type, + :reject_reason + ]) + end +end diff --git a/lib/models/definitions/transaction/market_if_touched_order_transaction.ex b/lib/models/definitions/transaction/market_if_touched_order_transaction.ex new file mode 100644 index 0000000..922810d --- /dev/null +++ b/lib/models/definitions/transaction/market_if_touched_order_transaction.ex @@ -0,0 +1,84 @@ +defmodule Oanda.Transaction.MarketIfTouchedOrderTransaction do + @moduledoc """ + A MarketIfTouchedOrderTransaction represents the creation of a MarketIfTouched Order in the user's Account. + """ + + use TypedEctoSchema + import Ecto.Changeset + alias ExOanda.Type.Atom + + alias Oanda.Transaction.{ + ClientExtensions, + TakeProfitDetails, + StopLossDetails, + TrailingStopLossDetails, + GuaranteedStopLossDetails + } + + @primary_key false + + embedded_schema do + field(:id, :string) + field(:time, :utc_datetime_usec) + field(:user_id, :integer) + field(:account_id, :string) + field(:batch_id, :string) + field(:request_id, :string) + field(:type, Atom, default: :MARKET_IF_TOUCHED_ORDER) + field(:instrument, Atom) + field(:units, :float) + field(:price, :float) + field(:price_bound, :float) + field(:time_in_force, Ecto.Enum, values: ~w(GTC GTD GFD FOK IOC)a) + field(:gtd_time, :utc_datetime_usec) + field(:position_fill, :string, default: "DEFAULT") + field(:trigger_condition, Ecto.Enum, values: ~w(DEFAULT INVERSE BID ASK MID)a) + field(:reason, :string) + field(:initial_market_price, :float) + + embeds_one :client_extensions, ClientExtensions + embeds_one :take_profit_on_fill, TakeProfitDetails + embeds_one :stop_loss_on_fill, StopLossDetails + embeds_one :trailing_stop_loss_on_fill, TrailingStopLossDetails + embeds_one :guaranteed_stop_loss_on_fill, GuaranteedStopLossDetails + end + + def changeset(struct, data) do + struct + |> cast(data, [ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :request_id, + :type, + :instrument, + :units, + :price, + :price_bound, + :time_in_force, + :gtd_time, + :position_fill, + :trigger_condition, + :reason, + :initial_market_price + ]) + |> cast_embed(:client_extensions) + |> cast_embed(:take_profit_on_fill) + |> cast_embed(:stop_loss_on_fill) + |> cast_embed(:trailing_stop_loss_on_fill) + |> cast_embed(:guaranteed_stop_loss_on_fill) + |> validate_required([ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :type, + :instrument, + :units, + :price + ]) + end +end diff --git a/lib/models/definitions/transaction/order_reject_transaction.ex b/lib/models/definitions/transaction/order_reject_transaction.ex new file mode 100644 index 0000000..75efefc --- /dev/null +++ b/lib/models/definitions/transaction/order_reject_transaction.ex @@ -0,0 +1,49 @@ +defmodule Oanda.Transaction.OrderRejectTransaction do + @moduledoc """ + An OrderRejectTransaction represents the rejection of an Order creation request. + """ + + use TypedEctoSchema + import Ecto.Changeset + alias ExOanda.Type.Atom + + @primary_key false + + embedded_schema do + field(:id, :string) + field(:time, :utc_datetime_usec) + field(:user_id, :integer) + field(:account_id, :string) + field(:batch_id, :string) + field(:request_id, :string) + field(:type, Atom, default: :ORDER_REJECT) + field(:order_id, :string) + field(:client_order_id, :string) + field(:reject_reason, :string) + end + + def changeset(struct, data) do + struct + |> cast(data, [ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :request_id, + :type, + :order_id, + :client_order_id, + :reject_reason + ]) + |> validate_required([ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :type, + :reject_reason + ]) + end +end diff --git a/lib/models/definitions/transaction/reset_resettable_pl_transaction.ex b/lib/models/definitions/transaction/reset_resettable_pl_transaction.ex new file mode 100644 index 0000000..ead735b --- /dev/null +++ b/lib/models/definitions/transaction/reset_resettable_pl_transaction.ex @@ -0,0 +1,42 @@ +defmodule Oanda.Transaction.ResetResettablePLTransaction do + @moduledoc """ + A ResetResettablePLTransaction represents the resetting of the Account's resettable PL counters. + """ + + use TypedEctoSchema + import Ecto.Changeset + alias ExOanda.Type.Atom + + @primary_key false + + typed_embedded_schema do + field(:id, :string) + field(:time, :utc_datetime_usec) + field(:user_id, :integer) + field(:account_id, :string) + field(:batch_id, :string) + field(:request_id, :string) + field(:type, Atom, default: :RESET_RESETTABLE_PL) + end + + def changeset(struct, data) do + struct + |> cast(data, [ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :request_id, + :type + ]) + |> validate_required([ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :type + ]) + end +end diff --git a/lib/models/definitions/transaction/transfer_funds_reject_transaction.ex b/lib/models/definitions/transaction/transfer_funds_reject_transaction.ex new file mode 100644 index 0000000..b903f6e --- /dev/null +++ b/lib/models/definitions/transaction/transfer_funds_reject_transaction.ex @@ -0,0 +1,51 @@ +defmodule Oanda.Transaction.TransferFundsRejectTransaction do + @moduledoc """ + A TransferFundsRejectTransaction represents the rejection of the transfer of funds in/out of an Account. + """ + + use TypedEctoSchema + import Ecto.Changeset + alias ExOanda.Type.Atom + + @primary_key false + + typed_embedded_schema do + field(:id, :string) + field(:time, :utc_datetime_usec) + field(:user_id, :integer) + field(:account_id, :string) + field(:batch_id, :string) + field(:request_id, :string) + field(:type, Atom, default: :TRANSFER_FUNDS_REJECT) + field(:amount, :float) + field(:funding_reason, :string) + field(:comment, :string) + field(:reject_reason, :string) + end + + def changeset(struct, data) do + struct + |> cast(data, [ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :request_id, + :type, + :amount, + :funding_reason, + :comment, + :reject_reason + ]) + |> validate_required([ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :type, + :reject_reason + ]) + end +end diff --git a/lib/models/definitions/transaction/transfer_funds_transaction.ex b/lib/models/definitions/transaction/transfer_funds_transaction.ex new file mode 100644 index 0000000..adeedaf --- /dev/null +++ b/lib/models/definitions/transaction/transfer_funds_transaction.ex @@ -0,0 +1,52 @@ +defmodule Oanda.Transaction.TransferFundsTransaction do + @moduledoc """ + A TransferFundsTransaction represents the transfer of funds in/out of an Account. + """ + + use TypedEctoSchema + import Ecto.Changeset + alias ExOanda.Type.Atom + + @primary_key false + + typed_embedded_schema do + field(:id, :string) + field(:time, :utc_datetime_usec) + field(:user_id, :integer) + field(:account_id, :string) + field(:batch_id, :string) + field(:request_id, :string) + field(:type, Atom, default: :TRANSFER_FUNDS) + field(:amount, :float) + field(:funding_reason, :string) + field(:comment, :string) + field(:account_balance, :float) + end + + def changeset(struct, data) do + struct + |> cast(data, [ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :request_id, + :type, + :amount, + :funding_reason, + :comment, + :account_balance + ]) + |> validate_required([ + :id, + :time, + :user_id, + :account_id, + :batch_id, + :type, + :amount, + :funding_reason + ]) + end +end diff --git a/mix.exs b/mix.exs index 67b207b..1a7f9fd 100644 --- a/mix.exs +++ b/mix.exs @@ -4,7 +4,7 @@ defmodule ExOanda.MixProject do def project do [ app: :ex_oanda, - version: "0.0.9", + version: "0.0.10", elixir: "~> 1.14", start_permanent: Mix.env() == :prod, deps: deps(),