From 22271822b1400331a148249a9c20f29984b0c5e3 Mon Sep 17 00:00:00 2001 From: tinh Date: Sat, 21 Mar 2026 18:04:39 +0700 Subject: [PATCH] push code update --- Quant_Hiber_Risk_Stargy/requirements.txt | 3 +- .../src/crewai_trading/__init__.py | 5 ++ .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 273 bytes .../__pycache__/crew.cpython-313.pyc | Bin 0 -> 3146 bytes .../__pycache__/main.cpython-313.pyc | Bin 0 -> 657 bytes .../src/crewai_trading/config/agents.yaml | 23 ++++++ .../src/crewai_trading/config/tasks.yaml | 23 ++++++ .../src/crewai_trading/crew.py | 68 ++++++++++++++++++ .../src/crewai_trading/main.py | 13 ++++ .../__pycache__/trading_tools.cpython-313.pyc | Bin 0 -> 2607 bytes .../src/crewai_trading/tools/trading_tools.py | 53 ++++++++++++++ 11 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 Quant_Hiber_Risk_Stargy/src/crewai_trading/__init__.py create mode 100644 Quant_Hiber_Risk_Stargy/src/crewai_trading/__pycache__/__init__.cpython-313.pyc create mode 100644 Quant_Hiber_Risk_Stargy/src/crewai_trading/__pycache__/crew.cpython-313.pyc create mode 100644 Quant_Hiber_Risk_Stargy/src/crewai_trading/__pycache__/main.cpython-313.pyc create mode 100644 Quant_Hiber_Risk_Stargy/src/crewai_trading/config/agents.yaml create mode 100644 Quant_Hiber_Risk_Stargy/src/crewai_trading/config/tasks.yaml create mode 100644 Quant_Hiber_Risk_Stargy/src/crewai_trading/crew.py create mode 100644 Quant_Hiber_Risk_Stargy/src/crewai_trading/main.py create mode 100644 Quant_Hiber_Risk_Stargy/src/crewai_trading/tools/__pycache__/trading_tools.cpython-313.pyc create mode 100644 Quant_Hiber_Risk_Stargy/src/crewai_trading/tools/trading_tools.py 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 0000000000000000000000000000000000000000..605f7b5cd85502118fe7c7b56198ce4843ce7cfc GIT binary patch literal 273 zcmey&%ge<81nO1$GGl@CV-N=hn4pZ$Qb5L3hG2#whG52ECT~VBrXnT#GIV?_>~NwL6+ZgOtsR_P0Y;GO{>rkEKSTSiTB7%N-c^H$}G-~ z4=zb8O0U!}E=tx1nUI(n54ArgK0Y%qvm`!Vub}c4hfQvNN@-52T@lEqAO{r-0f`UH ZjEsyo8DyU_$Ufkf=+JLuFX8|S0{{vUN>Ts- literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..13aa057804d986a007b8b10223679f65968625ed GIT binary patch literal 3146 zcmdT`O>7fa5PtjPwY`q*7#j$&C~icenv#SH5=bZ@`Xf=Nq>xRjstH|foQ+v<)?s$t z5>BXxwpR`aRlRT|Qn^>ER8{JQqgNb=o~R0HCB)4rhe|zl=B<<32?7pWx`)|$^XC1` z_r96;){{w{;kW17FU}89#{Q(n#uo_{Y28KTCNr2JO|X&#Qh{`NLM|zwlvGel5r~vD z(1cx?h?ZgyE5#vR(m^jJAc1z(h)i^ql8`K=AXQ*FZkgML)UhcYwn^`85ZbzLo3!&^;)K7BalN=nV{bIh(!pW zw0;Pcn{0NoZ-z~^PJY9c{)R*Y4B1e|1($8#T(Er06bnzU%3KRq<yy~&igzK%}p^&-{P;&ccSO9{b#g@Tupu=+y<7kjQ_L4}5OoFyUsJuFD z$0Q`Jf}~x>y;xv}tfkZ_O0W~BD$0O$mhmo;E-jjFJD`4Y>0sKn`N+ki2D4Op%FZa$MhjMjDP0k$sIydt`=W$YYW#&98l7D_vcAmhw`3n7A~@ zmd{Yg;YEFhN**a@L}ug^JFFO*Nb%?-kA65aHDi3Rgz2hzD@*gWDo;~EZn2V};)w;@ zD}%F4H^D!$u4BRzo-l}FRfQDkNfHDv43JfUUi@(_tm|A0>ETg$g+d`rg@feLNuth$ z-$n;-8U^B<>AO=5GDp7C9%lM)FW%1#qSk@^XplX+mf!ave=x`&Yz&?Z@~3`H2KmWG z?C#`Nb6W46&V_g@kCKb#H}F?cvYI3+>^O*#+(JWzJPFbOK}@D7Sjd`Hp3cW+Np zF~<>dKab+&*xtSnWDjpbd*?!sKmOC%AYW?qPTV`vIQQwjtBsz|UIZ-BLeTyTRN86( z{CfzkR06hqvzx@9if!q_rbr-F6o6@bjcDOj#3Lfrd2~5^t-vmHE#i|2e=tU3oCM9x zb={o90q&p?1EHcjZESt%cZ9v|Wo6&Dat{e}dIeiD?4Ky(2S=}y!1 z=-pQ~E#C)czK(A*ob4nz(7h9;FWt95g68(VNAV4Nte$$5d+Ykywd}z4j~_+!by-EB zFfGv}t=WazE81|Z5{}iIq&0P>p-tPgq1NnvsZERscTIbpEOrx;i**DakpwD8_@EJw z4sjMCH;578WswT|hLAy*?6MEUy%0@;N?^#deyvvZhWzlUW{Or=5JhPeKy`x0WABEC zc@j!E4OM#Y5Q?TENz(7E?+F{c&j$Zsqxae96LzMlF9_}+Z;ee>STq)^C%iuewXFo+57 zy(EqtidrVkM%q|AXtcY{rek1E?V^6t$WWWqax%|(Gl>)QIY<3aY47Q5 z>8)BXyil>yLO)76vCQ-^5b)=E89O?Xz(P%+=KJFC6HRD*ylh literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..a1a6b9ca00ae6a10d3ff6c73f05e67a0b3657583 GIT binary patch literal 2607 zcmZ`*O>7fK6yAUT#de$o5&}vLR4GncM}g2nD71tmf+U3E!G$WRR*QFS7VKFwyC!ky z!BQ_tIm8?gQ7_FgsFxf$RUA16`A}<`N|g!+ZfQ|D^wPdr|AbH&dEdVG_U$*b^S<}S zuYy582jj2e&t^j5xIdWD7-CJ~UwsA20}gSBpW-HY!bh1dObL@B5nWxJl86jGX-b*& z5D)mg$cN-^?xu8;Ctl=70i@I|A8J7!rW1cgj0In^Nn$(=Xc$|L=9m_?!IZw#oEtNs z>_<6`I2SE!6wi)bJ9{OOKo^ihG{?vkQ}q=x2rdX0*!-(eo~?EkWNjcm$%SCON#2!A z7hPRU3ZP5J0>|sISWJqEH!WO=IoOF{+9|lSk6@l1td`vo%mOSxU`s(BqD>rGt8dv9!S}l z7a}6NpE9fQr5|uH-^^lI*BosyPpp(-+lD?!dHAV|-gsUkw+n`|7`kZMwuv**w3#(V zqSWV@Im33eT>c8APAoX7n2$(+OBG|mv>ls9CLnUgawe<-*2f942o>@=Z6SuHt94lF zNmO=B``W+U#kfL9AjI(rI&nN_n6W z74)>t_9)5*oi;`WbDD`iPA?2zE@;?M&zsi`q9#oHmWmvWWQv0}Ne!lmF|U~_a7~9# zoO3KIYtPj!)wSaJA`N9Nw(`avk$o_a4=(#5h!VFI2$u)f`qsMEBkL#E2R1Hm+}XJC zSbO4oeD~?WrxQ<4Y@*rC*11aHo6=Y{5MDX8d}`(N^69Nm?^=ALV?)`Dep(5g*z}%w z?hCB+e&4&=QStSZMysB-^7V%|@87I=qFdbuevJPRUvFEVder+^f7X3&Nmx3y9Igh# zD|5?ps{@r_-;z)b1R3zX&o`y+SFkiL)hrM&*zUN+^8}PPizf+1e_Q}349xEo75Igw zU)bdrn|^V&SxiVmGEz^ih4AblXAkd^Q@sEPlLV*w!?3YH>m5K zq2k4%<5W051lRDym6$;H5aV{iB!)_CQ%ze$B^u5c|93mY!1_zJH!;~wCSj|kA}L@h zIhvWJQp(B~V+v_!enn5KIhaa@`;DR6ZJ2uPdWWJ4G3-Ltu~`+n^ox=%_Fe?=)GScj zc2wKUU@c4f!M_JCTLl5k3GQE=SR1bd`%4pBE#0f1tPNLMj+DmV)Srj@t38LSJ%|33 z#a5+se%s51_PR;$Ti;U&4wfdWfe7PN`S!gtzXW=o1$ruh=%y4U-7v>42CyA<8PEma z{(wtz32?kU5YILPc+kvil7Ck=k+8#>M$WK+L};)Al18pUYXbx%WATy~Jc{c9mLU%o zXPcRS4>lYv4Td$brT4_b!PAHZR=sAX}3P$OtsmwlH_h3r(?o zhOlCw;YNb%$)nQwOVeZIAbTc`Ccl39FAOT7@#$&mPgyu^>IP03nZ|}PUSwEP^Azwc zY|UfpH?TvBYR=LPDq%S87QM*j#Yl9~=TErNpa%WpEH298T=QHL9858OG#!(uWM-`t z6;13=F=IGXPD7J&Vjim07zb>&=AlQr_*AlCabyUVMvgKu48mqfsPVN<*bY_~&?Rdx zsl>=b3nphE>=29p2}Fsj`de29mIun(a=dhIE7)3Yf7p4yb8}z+`q@e(?h^9%KmYrcefhuSeB~3aQW!H1J&@JCFyx&Z`po0e}8`U+jUgw9I8Z)mL{vg)|IQvSIgH{ zi`lwsH+Fo?f__Ma$Dg7?d9Qe-!{kZYp=HND<1)Ee`mGxU^xrgVWzDe-rU=_ z?Gb%PwnbT1T>irmC8x56hGX7ZF^iB@(g9yWzF>kCqpPuOIR%3MY02yHF*p+^*dYV2 zd&ZNABpS=bBp0Ce+FAD6C`pn!;Yz}dA)vC<~6Kq zHevs0C_9Scb+(y?9kwFn-QCXDcI-bbj9`cW literal 0 HcmV?d00001 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}" + )