feat order.py
This commit is contained in:
@@ -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=[],
|
||||
|
||||
Reference in New Issue
Block a user