package simplex.bn25.datemasa335859.trading.trade;
import simplex.bn25.datemasa335859.trading.a.Position;
import simplex.bn25.datemasa335859.trading.common.DateInputValidator;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class TradeInputHandler {
public static Trade registerTrade(Set<String> validTickers, Map<String, String> tickerToNameMap, Map<String, Position> currentPositions) {
Scanner scanner = new Scanner(System.in);
// 取引日時を入力
LocalDateTime tradeDate = DateInputValidator.promptForValidDate(scanner);
// 銘柄コードと銘柄名を取得
String ticker = TradeInputPrompter.promptForValidTickerAndName(validTickers, tickerToNameMap, scanner);
String tickerName = tickerToNameMap.get(ticker);
// 売買区分を取得
String side = TradeInputPrompter.promptForSide(scanner);
// 取引数量を取得
int quantity = TradeInputPrompter.promptForQuantity(scanner);
// 取引単価を取得
BigDecimal tradePrice = TradeInputPrompter.promptForTradePrice(scanner);
LocalDateTime entryTimestamp = LocalDateTime.now();
// 保有ポジションのチェック
Position position = currentPositions.get(ticker);
if ("SELL".equals(side)) {
if (position == null || position.quantity() < quantity) {
System.out.println("エラー: 保有株式数を超える売却は許可されていません。");
return null; // 入力を拒否
}
}
return new Trade(tradeDate, ticker, tickerName, side, quantity, tradePrice, entryTimestamp);
}
}
package simplex.bn25.datemasa335859.trading;
import simplex.bn25.datemasa335859.trading.a.PositionCalculator;
import simplex.bn25.datemasa335859.trading.a.TradeDataLoader;
import simplex.bn25.datemasa335859.trading.common.ShowMenu;
import simplex.bn25.datemasa335859.trading.stock.DisplayStockMaster;
import simplex.bn25.datemasa335859.trading.stock.RegisterStock;
import simplex.bn25.datemasa335859.trading.stock.TickerManager;
import simplex.bn25.datemasa335859.trading.trade.Trade;
import simplex.bn25.datemasa335859.trading.trade.TradeDisplay;
import simplex.bn25.datemasa335859.trading.trade.TradeInputHandler;
import simplex.bn25.datemasa335859.trading.trade.TradeWriter;
import java.util.Scanner;
import static simplex.bn25.datemasa335859.trading.a.MarketPriceLoader.loadMarketPrices;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
boolean isRunning = true;
// 必要なクラスのインスタンスを初期化
TradeDataLoader tradeDataLoader = new TradeDataLoader(); // 取引データローダー
PositionCalculator positionCalculator = new PositionCalculator(tradeDataLoader); // ポジション計算機
// アプリケーション起動時に時価情報をロード
loadMarketPrices();
System.out.println("時価情報をロードしました。");
System.out.println("株式取引管理システムを開始します。");
while (isRunning) {
// メニューを表示
ShowMenu.showMenu();
String input = scanner.nextLine();
switch (input) {
case "1":
System.out.println(" >「銘柄マスタ一覧表示」が選択されました。");
DisplayStockMaster.displayStockMaster();
break;
case "2":
System.out.println(" >「銘柄マスタ新規登録」が選択されました。");
RegisterStock.registerStock();
break;
case "3":
System.out.println(" >「取引入力」が選択されました。");
try {
Trade trade = TradeInputHandler.registerTrade(
TickerManager.getExistingTickers(),
TickerManager.getTickerToNameMap(),
tradeDataLoader.calculatePositions());
if (trade != null) {
TradeWriter.writeTradeToCSV(trade); // 取引データをCSVに保存
System.out.println("取引データが登録されました。");
} else {
System.out.println("取引が無効であるため、登録されませんでした。");
}
} catch (Exception e) {
System.out.println("エラー: 取引入力中に問題が発生しました。詳細: " + e.getMessage());
}
break;
case "4":
System.out.println(" >「取引一覧の表示」が選択されました。");
TradeDisplay.displayTradeList(); // 取引一覧を表示
break;
case "5":
System.out.println(" >「保有ポジション表示」が選択されました。");
try {
positionCalculator.displayPositions(); // ポジションを表示
} catch (Exception e) {
System.out.println("エラー: 保有ポジション表示中に問題が発生しました。詳細: " + e.getMessage());
}
break;
case "6":
System.out.println(" >「時価情報更新」が選択されました。");
loadMarketPrices(); // 時価情報を再ロード
System.out.println("時価情報を更新しました。");
break;
case "9":
System.out.println(" > アプリケーションを終了します。");
isRunning = false; // 終了フラグを設定
break;
default:
System.out.println(input + "に対応するメニューは存在しません。");
break;
}
}
scanner.close(); // スキャナーを閉じる
}
}
コメント