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:
@@ -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__":
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user