NotesWhat is notes.io?

Notes brand slogan

Notes - notes.io

package model;

import java.util.List;
import java.util.ArrayList;
import java.math.*;

/**
* ポートフォリオクラス。
* ポジションをArrayListで管理する。
*/
public class Portfolio{
private List<Position> positions;

/**
* コンストラクタ。Positionを格納するArrayListを生成する。
*/
public Portfolio(){
positions = new ArrayList<Position>();
}

/**
* このPortfolioに指定されたPositionを追加する。
* 同じBondのPositionがすでにある場合には、それに保有数量を加算し、簿価を移動平均簿価に更新する。
* @param position Portfolioに追加するPosition
*/
public void addPosition(Position position) throws IllegalArgumentException{

Position existingPosition = findPosition(position.getBond());
if(existingPosition == null){
positions.add(position);
}
else{
BigDecimal oldAmount = existingPosition.getAmount();
BigDecimal newAmount = position.getAmount();
BigDecimal sumAmount = oldAmount.add(newAmount);

existingPosition.setAmount(sumAmount);

BigDecimal oldBookValue = existingPosition.getBookValue();
BigDecimal newBookValue = position.getBookValue();
BigDecimal averageBookValue = oldAmount.multiply(oldBookValue).add(newAmount.multiply(newBookValue)).divide(sumAmount, 12, RoundingMode.DOWN);

existingPosition.setBookValue(averageBookValue);
}
}

/**
* このPortfolioに含まれるPositionから、Bondが同じPositionを探し出して返す。見つからない場合にはnullを返す。
* @param bond このBondを持つPositionを検索する。
* @return 指定されたBondと同じBondを持つPositionがあればそのPosition、なければnull。
*/
public Position findPosition(Bond bond){
for(Position position : positions){
if(position.getBond().equals(bond)){
return position;
}
}
return null;
}

/**
* このPortfolioから、指定されたBondを持つPositionを削除する。
* @param bond このBondを持つPositionが削除される
*/
public void removePosition(Bond bond){
positions.remove(positions.indexOf(findPosition(bond)));
}

/**
* このPortfolioに含まれるPositionをすべてListにして返す。
* @return このPortfolioに含まれるPositionがすべて含まれたList。
*/
public List<Position> getAllPositions(){
return positions;
}

/**
* このPortfolioに指定されたBondを持つ在庫の数量が指定されたamountだけ変化したとき、トータル保有数量がマイナスかどうかを判定する。
* @param bond このBondを持つ在庫について調べる。
* @param amount 保有数量の変化分
* @return トータル保有数量がマイナスであればtrue, そうでなければfalseを返す。
*/
public boolean isNegativeTotalAmount(Bond bond, BigDecimal amount){
Position position = findPosition(bond);
BigDecimal totalAmount;
if(position == null){
totalAmount = amount;
}
else{
totalAmount = position.getAmount().add(amount);
}
return totalAmount.compareTo(BigDecimal.ZERO) == -1;
}

/**
* 指定されたBond、数量、簿価を用いて、このPortfolioを更新する。
* @param bond 更新対象の債券
* @param amount 新規追加/削除数量
* @param bookValue 新規追加簿価
*/
public void update(Bond bond, BigDecimal amount, BigDecimal bookValue){
Position position;
if(amount.compareTo(BigDecimal.ZERO) == 0 || amount.compareTo(BigDecimal.ZERO) == 1){
position = new Position();
position.setBond(bond);
position.setAmount(amount);
position.setBookValue(bookValue);
addPosition();
}
else{
position = findPosition(bond);
BigDecimal newAmount = position.getAmount().subtract(amount)
position.setAmount(newAmount);
BigDecimal newBookValue = position.getAmount().multiply(position.getBookValue()).add(amount.multiply(bookValue)).divide(newAmount, 12, RoundingMode.DOWN);
position.setBookValue(newBookValue);
}
}

// /**
// * 指定されたPositionが適切なPositionかを判定する。
// * @param position 検査対象のPosition
// * @return 指定されたPositionの保有数量と簿価がともに正であればtrueを返す。
// */
// public boolean isValidNewPosition(Position position){
//
// BigDecimal amount = position.getAmount();
// BigDecimal bookValue = position.getBookValue();
//
// if(amount.compareTo(BigDecimal.ZERO) == 0 || amount.compareTo(BigDecimal.ZERO) == -1){
// return false;
// }
//
// if(bookValue.compareTo(BigDecimal.ZERO) == 0 || bookValue.compareTo(BigDecimal.ZERO) == -1){
// return false;
// }
//
// return true;
// }
//
// /**
// * 指定された取引(売り)を行った際の実現損益を計算する。実現損益=(取引価格-簿価)*取引数量。
// * @param deal この取引を行った際の実現損益を計算する
// * @throws IllegalArgumentException Dealが買い注文の場合。または取引数量が保有数量を上回っている場合。
// */
// public BigDecimal calcRealizedGainLoss(Deal deal) throws IllegalArgumentException{
//
// if(deal.getDealType() == DealType.BUY){
// throw new IllegalArgumentException("実現損益計算メソッドに買い注文が入力されています。");
// }
//
// Bond bond = deal.getBond();
// Position position = findPosition(bond);
//
// if(deal.getAmount().compareTo(position.getAmount()) == 1){
// throw new IllegalArgumentException("取引数量が保有数量を上回っています。");
// }
//
// BigDecimal bookValue = position.getBookValue();
// BigDecimal unitPrice = deal.getUnitPrice();
// BigDecimal amount = deal.getAmount();
//
// BigDecimal gainLoss = unitPrice.subtract(bookValue).multiply(amount);
//
// return gainLoss;
// }
//
// public void cancelDeal(Deal deal) throws IllegalArgumentException{
//
// Bond bond = deal.getBond();
// Position position = findPosition(bond);
//
// if(position == null){
// return;
// }
//
// BigDecimal positionAmount = position.getAmount();
// BigDecimal bookValue = position.getBookValue();
// BigDecimal dealAmount = deal.getAmount();
// BigDecimal unitPrice = deal.getUnitPrice();
//
// if(deal.getDealType() == DealType.BUY){
// if(positionAmount.subtract(dealAmount).compareTo(BigDecimal.ZERO) == 0){
// bookValue = BigDecimal.ZERO;
// }
// else{
// bookValue = positionAmount.multiply(bookValue).subtract(dealAmount.multiply(unitPrice)).divide(positionAmount.subtract(dealAmount), 12, RoundingMode.DOWN);
// }
// positionAmount = positionAmount.subtract(dealAmount);
// }
// else if(deal.getDealType() == DealType.SELL){
// positionAmount = positionAmount.add(dealAmount);
// }
//
// try{
// position.setAmount(positionAmount);
// position.setBookValue(bookValue);
// }
// catch(IllegalArgumentException e){
// throw e;
// }
// }
}
     
 
what is notes.io
 

Notes.io is a web-based application for taking notes. You can take your notes and share with others people. If you like taking long notes, notes.io is designed for you. To date, over 8,000,000,000 notes created and continuing...

With notes.io;

  • * You can take a note from anywhere and any device with internet connection.
  • * You can share the notes in social platforms (YouTube, Facebook, Twitter, instagram etc.).
  • * You can quickly share your contents without website, blog and e-mail.
  • * You don't need to create any Account to share a note. As you wish you can use quick, easy and best shortened notes with sms, websites, e-mail, or messaging services (WhatsApp, iMessage, Telegram, Signal).
  • * Notes.io has fabulous infrastructure design for a short link and allows you to share the note as an easy and understandable link.

Fast: Notes.io is built for speed and performance. You can take a notes quickly and browse your archive.

Easy: Notes.io doesn’t require installation. Just write and share note!

Short: Notes.io’s url just 8 character. You’ll get shorten link of your note when you want to share. (Ex: notes.io/q )

Free: Notes.io works for 12 years and has been free since the day it was started.


You immediately create your first note and start sharing with the ones you wish. If you want to contact us, you can use the following communication channels;


Email: [email protected]

Twitter: http://twitter.com/notesio

Instagram: http://instagram.com/notes.io

Facebook: http://facebook.com/notesio



Regards;
Notes.io Team

     
 
Shortened Note Link
 
 
Looding Image
 
     
 
Long File
 
 

For written notes was greater than 18KB Unable to shorten.

To be smaller than 18KB, please organize your notes, or sign in.