Skip to content

Commit 19c535c

Browse files
committed
fix: onclose cover
1 parent a7f9239 commit 19c535c

File tree

3 files changed

+56
-19
lines changed

3 files changed

+56
-19
lines changed

sjtrade/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
trading with shioaji
33
"""
44

5-
__version__ = "0.4.2"
5+
__version__ = "0.4.3"
66

77
def inject_env():
88
import os

sjtrade/strategy.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ def cover_price_set_onclose(self, position: Position):
2828
return []
2929
return [
3030
PriceSet(
31-
price=position.contract.limit_up
31+
price=position.contract.limit_down
3232
if position.status.open_quantity > 0
33-
else position.contract.limit_down,
34-
quantity=position.cond.quantity * -1,
33+
else position.contract.limit_up,
34+
quantity=position.status.open_quantity*-1,
3535
price_type=TFTStockPriceType.LMT,
3636
)
3737
]

sjtrade/trader.py

+52-15
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import time
12
import datetime
23
import operator
34
from typing import Callable, Dict, List, Optional, Union
@@ -299,23 +300,18 @@ def place_cover_order(
299300
)
300301
if cover_quantity == 0:
301302
return
302-
elif cover_quantity < 0:
303-
action = Action.Buy
304-
op = max
305-
else:
306-
action = Action.Sell
307-
op = min
308303
for price_set in price_sets:
309-
cover_quantity_set = op(cover_quantity, price_set.quantity)
310-
if cover_quantity_set:
311-
quantity_s = quantity_split(cover_quantity_set, threshold=499)
304+
if price_set.quantity:
305+
quantity_s = quantity_split(price_set.quantity, threshold=499)
312306
for q in quantity_s:
313307
trade = api.place_order(
314308
contract=position.contract,
315309
order=sj.order.TFTStockOrder(
316310
price=price_set.price,
317311
quantity=abs(q),
318-
action=action,
312+
action=Action.Buy
313+
if position.cond.quantity < 0
314+
else Action.Sell,
319315
price_type=price_set.price_type,
320316
order_type=TFTOrderType.ROD,
321317
custom_field=self.name,
@@ -332,7 +328,7 @@ def open_position_cover(self, onclose: bool = True):
332328
else:
333329
api = self.api
334330
api.update_status()
335-
logger.info("start place cover order.")
331+
logger.info(f"start place cover order. onclose: {onclose}")
336332
for code, position in self.positions.items():
337333
if position.status.cover_order_quantity and (
338334
position.status.cover_order_quantity != position.status.cover_quantity
@@ -355,6 +351,18 @@ def open_position_cover(self, onclose: bool = True):
355351
]:
356352
api.cancel_order(trade, timeout=0)
357353
# event wait cancel
354+
for code, position in self.positions.items():
355+
for _ in range(10):
356+
if (
357+
position.status.cover_quantity
358+
!= position.status.cover_order_quantity
359+
):
360+
time.sleep(1)
361+
if position.status.cover_quantity != position.status.cover_order_quantity:
362+
logger.error(
363+
f"{code} | cancel not work, position cover order "
364+
f"{position.status.cover_order_quantity}, position cover {position.status.cover_quantity}"
365+
)
358366
if onclose:
359367
self.positions = self.stratagy.cover_positions_onclose(self.positions)
360368
else:
@@ -379,27 +387,40 @@ def order_handler(self, msg: Dict, position: Position):
379387
with position.lock:
380388
if msg["operation"]["op_type"] == "New":
381389
order_quantity = msg["status"].get("order_quantity", 0)
390+
order_pirce = msg["order"].get("price", 0)
382391
if msg["order"]["action"] == Action.Sell:
383392
if position.cond.quantity < 0:
384393
position.status.entry_order_quantity -= order_quantity
385394
logger.info(
386-
f"{position.contract.code} | place short entry order with {order_quantity}"
395+
f"{position.contract.code} | place short entry order with quantity {order_quantity}, price: {order_pirce}"
396+
)
397+
logger.debug(
398+
f"{position.contract.code} | {position.status}"
387399
)
388400
else:
389401
position.status.cover_order_quantity -= order_quantity
390402
logger.info(
391-
f"{position.contract.code} | place long cover order with {order_quantity}"
403+
f"{position.contract.code} | place long cover order with quantity {order_quantity}, price: {order_pirce}"
404+
)
405+
logger.debug(
406+
f"{position.contract.code} | {position.status}"
392407
)
393408
else:
394409
if position.cond.quantity < 0:
395410
position.status.cover_order_quantity += order_quantity
396411
logger.info(
397-
f"{position.contract.code} | place short cover order with {order_quantity}"
412+
f"{position.contract.code} | place short cover order with quantity {order_quantity}, price: {order_pirce}"
413+
)
414+
logger.debug(
415+
f"{position.contract.code} | {position.status}"
398416
)
399417
else:
400418
position.status.entry_order_quantity += order_quantity
401419
logger.info(
402-
f"{position.contract.code} | place long entry order with {order_quantity}"
420+
f"{position.contract.code} | place long entry order with quantity {order_quantity}, price: {order_pirce}"
421+
)
422+
logger.debug(
423+
f"{position.contract.code} | {position.status}"
403424
)
404425
else:
405426
cancel_quantity = msg["status"].get("cancel_quantity", 0)
@@ -409,22 +430,34 @@ def order_handler(self, msg: Dict, position: Position):
409430
logger.info(
410431
f"{position.contract.code} | canceled short entry order with {cancel_quantity}"
411432
)
433+
logger.debug(
434+
f"{position.contract.code} | {position.status}"
435+
)
412436
else:
413437
position.status.cover_order_quantity += cancel_quantity
414438
logger.info(
415439
f"{position.contract.code} | canceled long cover order with {cancel_quantity}"
416440
)
441+
logger.debug(
442+
f"{position.contract.code} | {position.status}"
443+
)
417444
else:
418445
if position.cond.quantity < 0:
419446
position.status.cover_order_quantity -= cancel_quantity
420447
logger.info(
421448
f"{position.contract.code} | canel short cover order with {cancel_quantity}"
422449
)
450+
logger.debug(
451+
f"{position.contract.code} | {position.status}"
452+
)
423453
else:
424454
position.status.entry_order_quantity -= cancel_quantity
425455
logger.info(
426456
f"{position.contract.code} | canel long entry order with {cancel_quantity}"
427457
)
458+
logger.debug(
459+
f"{position.contract.code} | {position.status}"
460+
)
428461
position.status.cancel_quantity += cancel_quantity
429462
else:
430463
logger.error(f"Please Check: {msg}")
@@ -440,20 +473,24 @@ def deal_handler(self, msg: Dict, position: Position):
440473
logger.info(
441474
f"{position.contract.code} | short entry order deal with {deal_quantity}, price: {deal_price}"
442475
)
476+
logger.debug(f"{position.contract.code} | {position.status}")
443477
else:
444478
position.status.cover_quantity -= deal_quantity
445479
logger.info(
446480
f"{position.contract.code} | long cover order deal with {deal_quantity}, price: {deal_price}"
447481
)
482+
logger.debug(f"{position.contract.code} | {position.status}")
448483
else:
449484
position.status.open_quantity += deal_quantity
450485
if position.cond.quantity < 0:
451486
position.status.cover_quantity += deal_quantity
452487
logger.info(
453488
f"{position.contract.code} | short cover order deal with {deal_quantity}, price: {deal_price}"
454489
)
490+
logger.debug(f"{position.contract.code} | {position.status}")
455491
else:
456492
position.status.entry_quantity += deal_quantity
457493
logger.info(
458494
f"{position.contract.code} | long entry order deal with {deal_quantity}, price: {deal_price}"
459495
)
496+
logger.debug(f"{position.contract.code} | {position.status}")

0 commit comments

Comments
 (0)