feat order.py

This commit is contained in:
2026-08-30 14:46:34 +08:00
parent cdccc48d8c
commit 6334f10904
19 changed files with 70 additions and 46 deletions

View File

@@ -1,12 +1,13 @@
from __future__ import annotations
import unittest
from datetime import datetime, timedelta
from tempfile import TemporaryDirectory
from types import SimpleNamespace
from unittest.mock import patch
from libs.grid_take_profit import GridState, GridTrailingTracker
from sdk import Assets, PositionItem, Tick
from sdk import Assets, OrderItem, PositionItem, Tick
from strategy.trend.order import OrderBook, PlaceOrderRequest
from strategy.trend.positions import LOSS_TIERS, handle_loss, manage_positions
from strategy.trend.boot import RunOnce
@@ -22,6 +23,18 @@ class FakeClient:
return {"status": "success", "order_ref": f"broker-{len(self.orders)}"}
class FakeOrderClient:
def __init__(self, orders):
self.orders = orders
self.canceled = []
def trade_detail_data(self, _datatype):
return self.orders
def cancel_by_id(self, order_id):
self.canceled.append(order_id)
class TrendTests(unittest.TestCase):
def test_grid_states_and_account_isolation(self):
tracker = GridTrailingTracker(1)
@@ -39,6 +52,22 @@ class TrendTests(unittest.TestCase):
self.assertTrue(book.place(request))
self.assertTrue(book.busy("000001.SZ", "BUY"))
def test_refresh_tracks_active_and_completed_and_cancels_expired(self):
old = datetime.now() - timedelta(seconds=20)
orders = [
OrderItem("active", "A", "BUY", "", "49", old, 100),
OrderItem("completed", "B", "SELL", "", "56", old, 100),
OrderItem("canceled", "C", "BUY", "", "54", old, 100),
OrderItem("failed", "D", "BUY", "", "57", old, 100),
]
client = FakeOrderClient(orders)
book = OrderBook(cancel_timeout_sec=10)
book.refresh(client)
self.assertEqual(set(book.data), {"BUY-A", "SELL-B"})
self.assertEqual(client.canceled, ["active"])
def test_position_dataclasses_execute_without_type_error(self):
with TemporaryDirectory() as directory:
state = State.for_strategy(directory, "trend", "A")
@@ -121,7 +150,7 @@ class TrendTests(unittest.TestCase):
client=client,
account_cfg=SimpleNamespace(min_cash_ratio=0.1),
global_cfg=SimpleNamespace(api_host="http://example"),
orders=SimpleNamespace(cancel_expired=lambda _client: None),
orders=SimpleNamespace(refresh=lambda _client: None),
state=SimpleNamespace(
codes=["A"],
unresolved_codes=[],