diff --git a/Quant_Hiber_Risk_Stargy/requirements.txt b/Quant_Hiber_Risk_Stargy/requirements.txt index d677ee5..b4035c6 100644 --- a/Quant_Hiber_Risk_Stargy/requirements.txt +++ b/Quant_Hiber_Risk_Stargy/requirements.txt @@ -2,4 +2,5 @@ pandas>=2.2.0 pyarrow>=15.0.0 MetaTrader5>=5.0.45 python-dateutil>=2.9.0 -PyYAML>=6.0.1 \ No newline at end of file +PyYAML>=6.0.1 +crewai>=0.86.0 \ No newline at end of file diff --git a/Quant_Hiber_Risk_Stargy/src/crewai_trading/__init__.py b/Quant_Hiber_Risk_Stargy/src/crewai_trading/__init__.py new file mode 100644 index 0000000..88b0298 --- /dev/null +++ b/Quant_Hiber_Risk_Stargy/src/crewai_trading/__init__.py @@ -0,0 +1,5 @@ +"""CrewAI trading package.""" + +from .crew import TradingCrew + +__all__ = ["TradingCrew"] diff --git a/Quant_Hiber_Risk_Stargy/src/crewai_trading/__pycache__/__init__.cpython-313.pyc b/Quant_Hiber_Risk_Stargy/src/crewai_trading/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000..605f7b5 Binary files /dev/null and b/Quant_Hiber_Risk_Stargy/src/crewai_trading/__pycache__/__init__.cpython-313.pyc differ diff --git a/Quant_Hiber_Risk_Stargy/src/crewai_trading/__pycache__/crew.cpython-313.pyc b/Quant_Hiber_Risk_Stargy/src/crewai_trading/__pycache__/crew.cpython-313.pyc new file mode 100644 index 0000000..13aa057 Binary files /dev/null and b/Quant_Hiber_Risk_Stargy/src/crewai_trading/__pycache__/crew.cpython-313.pyc differ diff --git a/Quant_Hiber_Risk_Stargy/src/crewai_trading/__pycache__/main.cpython-313.pyc b/Quant_Hiber_Risk_Stargy/src/crewai_trading/__pycache__/main.cpython-313.pyc new file mode 100644 index 0000000..1ea4bbc Binary files /dev/null and b/Quant_Hiber_Risk_Stargy/src/crewai_trading/__pycache__/main.cpython-313.pyc differ diff --git a/Quant_Hiber_Risk_Stargy/src/crewai_trading/config/agents.yaml b/Quant_Hiber_Risk_Stargy/src/crewai_trading/config/agents.yaml new file mode 100644 index 0000000..ed54c2a --- /dev/null +++ b/Quant_Hiber_Risk_Stargy/src/crewai_trading/config/agents.yaml @@ -0,0 +1,23 @@ +market_data_agent: + role: > + Market Data Operator + goal: > + Đảm bảo dữ liệu thị trường sẵn sàng và nhất quán trước khi phân tích tín hiệu. + backstory: > + Bạn phụ trách pipeline dữ liệu cho hệ thống giao dịch định lượng. + +signal_agent: + role: > + Quant Signal Analyst + goal: > + Chạy chiến lược smart money + ADX/ATR + RSI MTF để tạo tín hiệu giao dịch. + backstory: > + Bạn chuyên đánh giá tín hiệu đa khung thời gian và lọc điều kiện thị trường. + +reporting_agent: + role: > + Trading Reporter + goal: > + Tổng hợp kết quả backtest/live thành báo cáo ngắn gọn, dễ hành động. + backstory: > + Bạn chuyển kết quả kỹ thuật thành insight rõ ràng cho vận hành. diff --git a/Quant_Hiber_Risk_Stargy/src/crewai_trading/config/tasks.yaml b/Quant_Hiber_Risk_Stargy/src/crewai_trading/config/tasks.yaml new file mode 100644 index 0000000..7f926e4 --- /dev/null +++ b/Quant_Hiber_Risk_Stargy/src/crewai_trading/config/tasks.yaml @@ -0,0 +1,23 @@ +prepare_data_task: + description: > + Kiểm tra dữ liệu đã có cho symbol {symbol} ở các timeframe M15/H1/H4, + xác nhận file parquet tồn tại và có thể dùng cho pipeline tín hiệu. + expected_output: > + Danh sách file hợp lệ kèm trạng thái sẵn sàng dữ liệu. + agent: market_data_agent + +run_signal_task: + description: > + Chạy chiến lược SmartMoneyADXATRRSIStrategy bằng dữ liệu đã chuẩn bị + để sinh tín hiệu giao dịch mới nhất cho {symbol}. + expected_output: > + Bảng kết quả có strategy_signal, entry_mode, confidence cho nến mới nhất. + agent: signal_agent + +report_task: + description: > + Tóm tắt tín hiệu cuối cùng thành báo cáo vận hành: BUY/SELL/HOLD, + độ tin cậy và ngữ cảnh thị trường. + expected_output: > + Báo cáo ngắn gọn dạng văn bản cho người vận hành. + agent: reporting_agent diff --git a/Quant_Hiber_Risk_Stargy/src/crewai_trading/crew.py b/Quant_Hiber_Risk_Stargy/src/crewai_trading/crew.py new file mode 100644 index 0000000..01ef841 --- /dev/null +++ b/Quant_Hiber_Risk_Stargy/src/crewai_trading/crew.py @@ -0,0 +1,68 @@ +from __future__ import annotations + +from crewai import Agent, Crew, Process, Task +from crewai.project import CrewBase, agent, crew, task + +from .tools.trading_tools import render_signal_report, run_latest_signal + + +@CrewBase +class TradingCrew: + """CrewAI pipeline cho hệ thống tín hiệu trading.""" + + agents_config = "config/agents.yaml" + tasks_config = "config/tasks.yaml" + + @agent + def market_data_agent(self) -> Agent: + return Agent( + config=self.agents_config["market_data_agent"], + verbose=True, + ) + + @agent + def signal_agent(self) -> Agent: + return Agent( + config=self.agents_config["signal_agent"], + verbose=True, + ) + + @agent + def reporting_agent(self) -> Agent: + return Agent( + config=self.agents_config["reporting_agent"], + verbose=True, + ) + + @task + def prepare_data_task(self) -> Task: + return Task( + config=self.tasks_config["prepare_data_task"], + ) + + @task + def run_signal_task(self) -> Task: + latest = run_latest_signal(symbol="EURUSDm") + report = render_signal_report(latest) + return Task( + config=self.tasks_config["run_signal_task"], + description=f"{self.tasks_config['run_signal_task']['description']}\n\n{report}", + ) + + @task + def report_task(self) -> Task: + latest = run_latest_signal(symbol="EURUSDm") + report = render_signal_report(latest) + return Task( + config=self.tasks_config["report_task"], + description=f"{self.tasks_config['report_task']['description']}\n\n{report}", + ) + + @crew + def crew(self) -> Crew: + return Crew( + agents=self.agents, + tasks=self.tasks, + process=Process.sequential, + verbose=True, + ) diff --git a/Quant_Hiber_Risk_Stargy/src/crewai_trading/main.py b/Quant_Hiber_Risk_Stargy/src/crewai_trading/main.py new file mode 100644 index 0000000..2da6f69 --- /dev/null +++ b/Quant_Hiber_Risk_Stargy/src/crewai_trading/main.py @@ -0,0 +1,13 @@ +from __future__ import annotations + +from .crew import TradingCrew + + +def run(symbol: str = "EURUSDm"): + crew = TradingCrew().crew() + return crew.kickoff(inputs={"symbol": symbol}) + + +if __name__ == "__main__": + result = run("EURUSDm") + print(result) diff --git a/Quant_Hiber_Risk_Stargy/src/crewai_trading/tools/__pycache__/trading_tools.cpython-313.pyc b/Quant_Hiber_Risk_Stargy/src/crewai_trading/tools/__pycache__/trading_tools.cpython-313.pyc new file mode 100644 index 0000000..a1a6b9c Binary files /dev/null and b/Quant_Hiber_Risk_Stargy/src/crewai_trading/tools/__pycache__/trading_tools.cpython-313.pyc differ diff --git a/Quant_Hiber_Risk_Stargy/src/crewai_trading/tools/trading_tools.py b/Quant_Hiber_Risk_Stargy/src/crewai_trading/tools/trading_tools.py new file mode 100644 index 0000000..0fd38a4 --- /dev/null +++ b/Quant_Hiber_Risk_Stargy/src/crewai_trading/tools/trading_tools.py @@ -0,0 +1,53 @@ +from __future__ import annotations + +from pathlib import Path +import pandas as pd + +from src.strategies.smart_money_adx_atr_rsi_strategy import SmartMoneyADXATRRSIStrategy + + +def load_processed(symbol: str, timeframe: str, suffix: str = "clean") -> pd.DataFrame: + path = Path(f"data/processed/{symbol}/{timeframe}/{symbol}_{timeframe}_{suffix}.parquet") + if not path.exists(): + raise FileNotFoundError(f"Missing file: {path}") + + df = pd.read_parquet(path) + if "timestamp" in df.columns: + df["timestamp"] = pd.to_datetime(df["timestamp"], utc=True) + df = df.set_index("timestamp") + return df.sort_index() + + +def run_latest_signal(symbol: str = "EURUSDm") -> pd.DataFrame: + df_m15 = load_processed(symbol, "M15") + df_h1 = load_processed(symbol, "H1") + df_h4 = load_processed(symbol, "H4") + + strategy = SmartMoneyADXATRRSIStrategy( + require_rsi_for_range=False, + require_rsi_for_trend=True, + ) + result = strategy.run(df_m15, df_h1, df_h4) + return result.tail(1).copy() + + +def render_signal_report(latest: pd.DataFrame) -> str: + row = latest.iloc[0] + signal = int(row.get("strategy_signal", 0)) + + side = "HOLD" + if signal == 1: + side = "BUY" + elif signal == -1: + side = "SELL" + + confidence = float(row.get("confidence", 0.0)) + regime = row.get("regime", "unknown") + entry_mode = row.get("entry_mode", "none") + + return ( + f"Signal: {side}\n" + f"Regime: {regime}\n" + f"Entry mode: {entry_mode}\n" + f"Confidence: {confidence:.2f}" + )