package simplex.bn25.makino335926.trading.Position;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
/**
* クラス: DisplayPosition
* 保有ポジションを表形式で表示するクラス。
* 各ポジションの数量、評価額、評価損益などを計算して表示。
*/
public class DisplayPosition {
/**
* 保有ポジションを表示するメインメソッド。
*
* @param positions 保有ポジションのリスト
*/
public static void displayPositions(List<Position> positions) {
// 時価データをCSVファイルから読み込む
Map<String, BigDecimal> marketPrices = CsvReader.loadMarketPrices();
// 表ヘッダーを出力
System.out.println("|==============================================================================================|");
System.out.println("| Ticker | Name | Quantity | Avg Unit Price | Realized PnL | Valuation | Unrealized PnL |");
System.out.println("|--------+----------------------------+----------+----------------+---------------+------------+----------------|");
// 各ポジションのデータを計算・表示
for (Position position : positions) {
String ticker = position.getTicker();
String name = position.getName();
long quantity = position.getQuantity();
BigDecimal avgUnitPrice = position.getAverageUnitPrice();
BigDecimal realizedPnL = position.getRealizedPnL();
// Valuation(評価額)とUnrealized PnL(評価損益)の計算
BigDecimal marketPrice = marketPrices.get(ticker); // 時価データを取得
String valuation;
String unrealizedPnL;
if (marketPrice != null) {
// 時価データが存在する場合
BigDecimal valuationValue = marketPrice.multiply(BigDecimal.valueOf(quantity));
BigDecimal unrealizedPnLValue = valuationValue.subtract(avgUnitPrice.multiply(BigDecimal.valueOf(quantity)));
valuation = formatCurrency(valuationValue);
unrealizedPnL = formatCurrency(unrealizedPnLValue);
} else {
// 時価データが存在しない場合
valuation = "N/A";
unrealizedPnL = "N/A";
}
// 表示フォーマットに従い出力
System.out.printf("| %-6s | %-26s | %8s | %14s | %13s | %10s | %14s |\n",
ticker,
name,
String.format("%,d", quantity),
formatCurrency(avgUnitPrice),
formatCurrency(realizedPnL),
valuation,
unrealizedPnL);
}
System.out.println("|==============================================================================================|");
}
/**
* 金額データをフォーマット(3桁区切り、小数点以下2桁)。
*
* @param value フォーマット対象の金額
* @return フォーマット済みの文字列
*/
private static String formatCurrency(BigDecimal value) {
return value != null ? String.format("%,.2f", value) : "N/A";
}
}
package simplex.bn25.makino335926.trading.Position;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
/**
* クラス: CsvReader
* 時価情報をCSVファイルから読み込むクラス。
*/
public class CsvReader {
private static final String MARKET_PRICE_FILE = "market_prices.csv"; // 時価データのCSVファイル名
/**
* CSVファイルから時価情報を読み込む。
*
* @return 銘柄コードと時価情報のマップ
*/
public static Map<String, BigDecimal> loadMarketPrices() {
Map<String, BigDecimal> marketPrices = new HashMap<>();
try (BufferedReader br = new BufferedReader(new FileReader(MARKET_PRICE_FILE))) {
String line;
// ヘッダー行をスキップ
br.readLine();
// データ行を処理
while ((line = br.readLine()) != null) {
String[] parts = line.split(",");
if (parts.length == 2) {
try {
String ticker = parts[0]; // 銘柄コード
BigDecimal price = new BigDecimal(parts[1]); // 時価
marketPrices.put(ticker, price); // マップに登録
} catch (NumberFormatException ignored) {
// 時価が不正な場合は無視
}
}
}
} catch (IOException ignored) {
// ファイル読み込みエラーは無視(エラー表示しない)
}
return marketPrices;
}
}
コメント