fix(trend): remove inferred DCA fill prices across all exchanges

Unify display on trend_leg_display_price: use recorded fills or grid triggers only; last done row avg comes from live entry, never back-solve trigger prices.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-07 18:10:33 +08:00
parent 6a4ec69dba
commit 08082eb88f
4 changed files with 90 additions and 118 deletions
+22 -4
View File
@@ -10,7 +10,10 @@ ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))
from strategy_snapshot_lib import attach_trend_dca_levels # noqa: E402
from strategy_trend_lib import calc_trend_plan_money_metrics # noqa: E402
from strategy_trend_lib import ( # noqa: E402
calc_trend_plan_money_metrics,
trend_leg_display_price,
)
class TestTrendDcaEnrichFills(unittest.TestCase):
@@ -62,8 +65,8 @@ class TestTrendDcaEnrichFills(unittest.TestCase):
self.assertEqual(dca2["status"], "pending")
self.assertAlmostEqual(dca2["price"], 0.343, places=4)
def test_missing_dca_fills_align_last_avg_with_header(self):
"""缺补仓成交价时,末档加仓后均价对齐计划头部 avg_entry_price"""
def test_missing_dca_fills_use_grid_trigger_not_inferred_price(self):
"""缺补仓成交价时:触发价用计划网格,末档均价对齐头部,禁止反推离谱成交价"""
plan = self._base_plan(
legs_done=2,
avg_entry_price=0.3507,
@@ -73,10 +76,25 @@ class TestTrendDcaEnrichFills(unittest.TestCase):
)
enriched = attach_trend_dca_levels(plan)
levels = enriched["dca_levels"]
dca1 = levels[1]
dca2 = levels[2]
self.assertEqual(dca1["status"], "done")
self.assertAlmostEqual(dca1["price"], 0.343, places=4)
self.assertEqual(dca2["status"], "done")
self.assertAlmostEqual(dca2["price"], 0.343, places=4)
self.assertAlmostEqual(dca2["avg_entry"], 0.3507, places=4)
self.assertGreater(dca2["price"], 0.343)
self.assertLess(dca2["price"], 0.36)
def test_display_price_never_infers_from_target_avg(self):
"""四所共用:缺记录时只用网格,不因均价反推离谱触发价。"""
plan = self._base_plan(
legs_done=2,
avg_entry_price=0.3507,
leg_fill_prices_json=json.dumps([0.3436]),
grid_prices_json=json.dumps([0.343, 0.343, 0.3395, 0.336, 0.3325]),
)
self.assertAlmostEqual(trend_leg_display_price(plan, 2), 0.343, places=4)
self.assertLess(trend_leg_display_price(plan, 2), 0.36)
if __name__ == "__main__":
+2
View File
@@ -81,7 +81,9 @@ class TestTrendHubEnrichUnified(unittest.TestCase):
self.assertIn("dca_levels", hub)
last_done = hub["dca_levels"][2]
self.assertEqual(last_done["status"], "done")
self.assertAlmostEqual(last_done["price"], 0.343, places=4)
self.assertAlmostEqual(last_done["avg_entry"], 0.3507, places=4)
self.assertLess(last_done["price"], 0.36)
self.assertEqual(hub.get("monitor_source"), "趋势回调计划")
self.assertEqual(hub.get("add_count"), 2)