Как мне следует подумать о реализации закрытия открытой позиции в моем портфельном приложении? - PullRequest
0 голосов
/ 17 мая 2019

У меня есть модель PortStock, схема которой выглядит следующим образом:

# == Schema Information
#
# Table name: port_stocks
#
#  id                :bigint(8)        not null, primary key
#  portfolio_id      :integer
#  stock_id          :integer
#  volume            :integer
#  transaction_price :float
#  current_price     :float
#  percent_change    :float
#  created_at        :datetime         not null
#  updated_at        :datetime         not null
#  current_value     :float
#  dollar_change     :float
#  total_spend       :float
#  transaction_date  :datetime
#  action            :integer
#  position          :integer          default("open")
#  ticker            :string
#  slug              :string
#

Когда кто-то покупает акции, приложение создает port_stock с position: "open", action: :buy в * 1007.*.

Когда они sell этой позиции, по сути, происходит то, что они создают еще один port_stock, но он просто имеет position: "closed", action: :sell.

У меня есть несколько вопросов:

  1. Это действительно самая оптимальная структура?В связи с этим я сразу вижу одну проблему: мне нужно close положение buy.Таким образом, по сути, полными completed position будут две closed buy и sell port_stock записи.Если есть только один, то позиция считается открытой.Но имеет ли это смысл?
  2. Должен ли я создать метод в моей модели для закрытия и открытия позиций?Первоначально я делал это только в своих контроллерах, но теперь, когда я пишу модульные тесты, у меня нет чистого способа закрыть существующую открытую позицию.

Должен ли я подходить к покупке и продажеport_stock иначе?

Мысли?

Ответы [ 3 ]

0 голосов
/ 31 мая 2019

Вопрос представляет два разных понятия. Первая концепция - это «позиция», а вторая - «транзакция». Позиция - это количество акций, которые фактически принадлежат. Это число может быть положительным (длинным) для акции, которая принадлежит, или отрицательным (коротким) для акции, которую вы продали, но должны выкупить в определенный момент времени.

Позиция будет иметь одну или несколько транзакций против нее. Каждая транзакция будет открыта, выполнена или закрыта со связанными атрибутами, такими как открытое, выполненное и, возможно, закрытое для транзакций, которые были открыты, но никогда не выполнялись.

Открытая транзакция может представлять собой заявку на покупку акций по определенной цене. Но если предложение никогда не будет выполнено, и пользователь решит отменить эту транзакцию, у вас останется запись о ней, даже если она никогда не привела к покупке акций.

При такой структуре объект позиции отслеживает только сводную информацию обо всех завершенных транзакциях, а не информацию о транзакциях, что облегчает отслеживание всех транзакций, которые были выполнены по конкретной позиции, то есть множественных покупок для накопления долей. акции, чтобы построить позицию или несколько продаж, чтобы урезать позицию.

0 голосов
/ 31 мая 2019
  1. Есть одна концепция, которая пропущена.Это делает ваш подход неоптимальным.Сделки с акциями в реальном мире также имеют частичные исполнения, которые здесь не рассматриваются.Частичные казни могут происходить как при покупке, так и при продаже.

Например.Если вы создали лимитный ордер на покупку 1000 акций за 1 $.Единственный порядок сопоставления, который может найти система ROMS (или любая система сопоставления сделок, которую вы используете), составляет 500 акций.В этом случае вам нужно поддерживать переменную с количеством: 500, действие: частичное

Кроме того, частичное выполнение может происходить во время рыночного ордера.

Например,Вы инициировали продажу 1000 акций по рыночной цене.Первые 200 акций продаются по 1 $, а остальные 800 акций по 0,8 $.Действие: закрытие может произойти только после завершения продажи.

Я согласен, что метод должен быть сохранен в модели для покупки и продажи.
0 голосов
/ 31 мая 2019

Я думаю, что вам нужно сохранять каждую транзакцию.

Если вы купили 100 акций Acme и хотите продать 20 акций позже; Вы должны сохранить обе транзакции в своем портфеле.

Чтобы узнать, сколько у вас действий, вы должны суммировать транзакции для каждого действия. Может быть, это повторяется, но это лучший вариант для отслеживания стоимости портфеля.

Например, если вы хотите вычислить ваш P & L, вы должны суммировать (price*volume*spot_change) для каждой транзакции, если action = sell вы умножаете на -1, иначе вы умножаете на 1.

Какова конечная цель вашего кода? Скажи мне, если я могу помочь тебе больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...