85 lines
3.1 KiB
Python
85 lines
3.1 KiB
Python
import json
|
||
import os
|
||
import sys
|
||
|
||
sys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))
|
||
|
||
from app.core.opportunity_lifecycle import apply_entry_quality_gate
|
||
from legacy import price_tracker_ws
|
||
|
||
|
||
def test_risk_reward_false_blocks_buy_now():
|
||
action, plan, reasons = apply_entry_quality_gate(
|
||
action_status='可即刻买入',
|
||
entry_plan={
|
||
'entry_action': '等回踩',
|
||
'entry_price': 0.072,
|
||
'current_price': 0.0758,
|
||
'risk_reward_ok': False,
|
||
'rr1': 0.4,
|
||
},
|
||
signals=['1H 起爆点↑(强度56×)', '⚠️ 等回踩降权(-3分)'],
|
||
current_price=0.0758,
|
||
market_context={'change_24h': 9.0},
|
||
)
|
||
assert action in ('等回踩', '观察')
|
||
assert action != '可即刻买入'
|
||
assert plan['entry_quality_gate']['blocked_action'] == '可即刻买入'
|
||
assert any('risk_reward_ok=false' in r for r in reasons)
|
||
|
||
|
||
def test_breakout_distance_over_60_forces_observe():
|
||
action, plan, reasons = apply_entry_quality_gate(
|
||
action_status='可即刻买入',
|
||
entry_plan={'entry_action': '即刻买入', 'risk_reward_ok': True, 'rr1': 2.0, 'entry_price': 0.164},
|
||
signals=['日线站稳突破位 +66.7%', '日线站稳突破位 +71.7%'],
|
||
current_price=0.168,
|
||
market_context={'change_24h': 5.0},
|
||
)
|
||
assert action == '观察'
|
||
assert plan['entry_quality_gate']['breakout_distance_pct'] == 71.7
|
||
assert any('严禁现价追' in r for r in reasons)
|
||
|
||
|
||
def test_low_static_accumulation_builds_ambush_plan():
|
||
action, plan, reasons = apply_entry_quality_gate(
|
||
action_status='等回踩',
|
||
entry_plan={'entry_action': '等回踩', 'entry_price': 2.393, 'risk_reward_ok': True, 'rr1': 1.6, 'support': 2.2, 'resistance': 3.0},
|
||
signals=['4H静K蓄力观察(3静K,量比1.4x)', '大户偏多 62%'],
|
||
current_price=2.393,
|
||
market_context={'change_24h': 3.0},
|
||
derivatives_context={'top_trader_long_pct': 62},
|
||
)
|
||
assert action == '等回踩'
|
||
lifecycle = plan.get('opportunity_lifecycle')
|
||
assert lifecycle['stage'] == '低位潜伏'
|
||
assert lifecycle['plan_type'] == 'ambush'
|
||
assert lifecycle['static_count'] >= 3
|
||
|
||
|
||
def test_ws_tracker_does_not_push_when_gate_downgrades_buy_now():
|
||
rec = {
|
||
'id': 1,
|
||
'symbol': 'WLFI/USDT',
|
||
'status': 'active',
|
||
'entry_price': 0.0758,
|
||
'stop_loss': 0.070,
|
||
'tp1': 0.080,
|
||
'tp2': 0.085,
|
||
'entry_plan': {
|
||
'entry_action': '等回踩',
|
||
'entry_price': 0.072,
|
||
'risk_reward_ok': False,
|
||
'rr1': 0.4,
|
||
},
|
||
'signals': json.dumps(['1H 起爆点↑(强度56×)', '⚠️ 等回踩降权(-3分)'], ensure_ascii=False),
|
||
'market_context': {'change_24h': 9.0},
|
||
'derivatives_context': {},
|
||
'sector_context': {},
|
||
'action_status': '持有',
|
||
}
|
||
trigger = price_tracker_ws.check_triggers('WLFI/USDT', rec, 0.0719)
|
||
assert trigger is not None
|
||
assert trigger['action_status'] != '可即刻买入'
|
||
assert trigger['pushable'] is False
|