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;
}
}
コメント