コメント追加

package simplex.bn25.makino335926.trading.position;

import simplex.bn25.makino335926.trading.trade.Trade;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * クラス: Validation
 * 取引データに対するバリデーション(検証)処理を提供するクラス。
 * - 取引内容が正しいかどうかをチェックし、問題がある場合にはエラーメッセージを表示。
 * - 現在の保有数量や取引時刻の適正性を検証するメソッドを提供。
 */
public class Validation {

    /**
     * メソッド: validateQuantity
     * 保有数量が負にならないかを検証するメソッド。
     * 
     * @param ticker   銘柄コード(取引対象の銘柄を特定)
     * @param side     取引区分("BUY" または "SELL")
     * @param quantity 取引数量(正の整数)
     * @param trades   過去の取引データのリスト
     * @return boolean 検証が成功すれば true、不正であれば false
     */
    public static boolean validateQuantity(String ticker, String side, int quantity, List<Trade> trades) {
        // 現在の保有ポジションを計算
        // CalculationPosition.calculationPosition(): 取引データから各銘柄の保有ポジションを計算
        List<Position> positions = CalculationPosition.calculationPosition(trades, Map.of());

        // ストリームAPIを使用して指定された銘柄の保有数量を取得
        long currentQuantity = positions.stream()
                .filter(position -> position.getTicker().equals(ticker)) // 銘柄コードが一致するものをフィルタ
                .mapToLong(Position::getQuantity)                      // 保有数量を取得
                .findFirst()                                           // 最初の一致する値を取得
                .orElse(0L);                                           // 該当なしの場合は保有数量を0とする

        // 売り取引の場合("SELL")かつ、保有数量を超える売却数量が指定された場合にエラー
        if (side.equals("SELL") && currentQuantity - quantity < 0) {
            System.out.println("> 銘柄の保有数量が負の値となるため不正です。"); // エラーメッセージを表示
            return false; // バリデーション失敗
        }

        // 保有数量が妥当であれば true を返す
        return true;
    }

    /**
     * メソッド: validateTradeTime
     * 指定された取引時刻が適切であるかを検証するメソッド。
     * - 過去の同じ銘柄の取引時刻よりも後であることを確認。
     * 
     * @param ticker         銘柄コード(取引対象の銘柄を特定)
     * @param tradedDatetime 検証対象の取引時刻
     * @param trades         過去の取引データのリスト
     * @return boolean 検証が成功すれば true、不正であれば false
     */
    public static boolean validateTradeTime(String ticker, LocalDateTime tradedDatetime, List<Trade> trades) {
        // 過去の取引データの中から以下の条件を満たす取引を検索:
        // - 銘柄コードが一致する
        // - 現在の取引時刻より後の取引が存在する場合、不正とみなす
        boolean isInvalidTime = trades.stream()
                .filter(t -> t.ticker().equals(ticker))                 // 銘柄コードが一致するものをフィルタ
                .anyMatch(t -> !tradedDatetime.isAfter(t.tradedDatetime())); // 過去または同時刻の取引が存在するかを確認

        // 過去の最新取引時刻よりも過去または同時刻の場合、エラーメッセージを表示して false を返す
        if (isInvalidTime) {
            System.out.println("> 過去の最新の取引時刻と同じ、またはそれより過去であるため不正です。");
            return false;
        }

        // 時刻が妥当であれば true を返す
        return true;
    }
}

コメント

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