Add file-prefix isolation and strict split-order parsing
This commit is contained in:
@@ -11,6 +11,7 @@ DEFAULT_USER_NAME = "new"
|
||||
DEFAULT_TERMINAL_ID = "5BDB0B60344C088C2FA5CA35699BAAFD"
|
||||
ENV_MT5_FILES_DIR = "MT5_FILES_DIR"
|
||||
ENV_MT5_DATA_PATH = "MT5_DATA_PATH"
|
||||
ENV_MT5_EA_FILE_PREFIX = "MT5_EA_FILE_PREFIX"
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
@@ -21,6 +22,7 @@ class Mt5PathSettings:
|
||||
data_path: Path | None = None
|
||||
user_name: str | None = None
|
||||
terminal_id: str | None = None
|
||||
file_prefix: str | None = None
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
@@ -68,6 +70,39 @@ def files_dir_from_data_path(data_path: Path) -> Path:
|
||||
return resolved / "MQL5" / "Files"
|
||||
|
||||
|
||||
def sanitize_file_prefix(prefix: str) -> str:
|
||||
"""EAから渡されたファイル接頭辞を安全なファイル名トークンへ丸める。"""
|
||||
stripped = prefix.strip()
|
||||
if not stripped:
|
||||
return ""
|
||||
|
||||
safe_chars = []
|
||||
for char in stripped:
|
||||
if (char.isascii() and char.isalnum()) or char in {"_", "-"}:
|
||||
safe_chars.append(char)
|
||||
else:
|
||||
safe_chars.append("_")
|
||||
|
||||
return "".join(safe_chars)
|
||||
|
||||
|
||||
def mt5_file_prefix(settings: Mt5PathSettings | None = None) -> str:
|
||||
"""MT5連携ファイル名へ付けるEA固有接頭辞を返す。"""
|
||||
if settings and settings.file_prefix is not None:
|
||||
return sanitize_file_prefix(settings.file_prefix)
|
||||
|
||||
return sanitize_file_prefix(os.getenv(ENV_MT5_EA_FILE_PREFIX, ""))
|
||||
|
||||
|
||||
def prefixed_file_name(base_name: str, settings: Mt5PathSettings | None = None) -> str:
|
||||
"""接頭辞がある場合だけ `prefix_base_name` 形式にする。"""
|
||||
prefix = mt5_file_prefix(settings)
|
||||
if not prefix:
|
||||
return base_name
|
||||
|
||||
return f"{prefix}_{base_name}"
|
||||
|
||||
|
||||
def terminal_files_dir(settings: Mt5PathSettings | None = None) -> Path:
|
||||
"""MT5のMQL5/Filesディレクトリを返す。
|
||||
|
||||
@@ -127,11 +162,11 @@ def build_trend_paths(settings: Mt5PathSettings | None = None) -> TrendPaths:
|
||||
"""H4トレンド判定用の入出力パスをまとめて返す。"""
|
||||
base_dir = terminal_files_dir(settings)
|
||||
return TrendPaths(
|
||||
input_csv=base_dir / "ohlc_H4.csv",
|
||||
trend_state=base_dir / "trend_state.txt",
|
||||
done_trend=base_dir / "process_done_trend.txt",
|
||||
tmp_chart=base_dir / "tmp_chart_trend.png",
|
||||
debug_reason=base_dir / "debug_trend.txt",
|
||||
input_csv=base_dir / prefixed_file_name("ohlc_H4.csv", settings),
|
||||
trend_state=base_dir / prefixed_file_name("trend_state.txt", settings),
|
||||
done_trend=base_dir / prefixed_file_name("process_done_trend.txt", settings),
|
||||
tmp_chart=base_dir / prefixed_file_name("tmp_chart_trend.png", settings),
|
||||
debug_reason=base_dir / prefixed_file_name("debug_trend.txt", settings),
|
||||
)
|
||||
|
||||
|
||||
@@ -139,12 +174,12 @@ def build_entry_paths(settings: Mt5PathSettings | None = None) -> EntryPaths:
|
||||
"""H1エントリー候補生成用の入出力パスをまとめて返す。"""
|
||||
base_dir = terminal_files_dir(settings)
|
||||
return EntryPaths(
|
||||
input_csv=base_dir / "ohlc_H1.csv",
|
||||
output_prices=base_dir / "target_prices.txt",
|
||||
output_zones=base_dir / "target_zones.txt",
|
||||
trend_state=base_dir / "trend_state.txt",
|
||||
done_entry=base_dir / "process_done_entry.txt",
|
||||
tmp_short_chart=base_dir / "tmp_chart_short.png",
|
||||
tmp_long_chart=base_dir / "tmp_chart_long.png",
|
||||
debug_reason=base_dir / "debug_entry.txt",
|
||||
input_csv=base_dir / prefixed_file_name("ohlc_H1.csv", settings),
|
||||
output_prices=base_dir / prefixed_file_name("target_prices.txt", settings),
|
||||
output_zones=base_dir / prefixed_file_name("target_zones.txt", settings),
|
||||
trend_state=base_dir / prefixed_file_name("trend_state.txt", settings),
|
||||
done_entry=base_dir / prefixed_file_name("process_done_entry.txt", settings),
|
||||
tmp_short_chart=base_dir / prefixed_file_name("tmp_chart_short.png", settings),
|
||||
tmp_long_chart=base_dir / prefixed_file_name("tmp_chart_long.png", settings),
|
||||
debug_reason=base_dir / prefixed_file_name("debug_entry.txt", settings),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user