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;
    }
}

コメント

タイトルとURLをコピーしました