Skip to content

Commit 2c69076

Browse files
committed
Refactor following jobs
1 parent 69853ba commit 2c69076

File tree

8 files changed

+99
-107
lines changed

8 files changed

+99
-107
lines changed

shipane_sdk/base_quant_client.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# -*- coding: utf-8 -*-
2+
3+
from datetime import date, timedelta, datetime
4+
5+
6+
class BaseQuantClient(object):
7+
def __init__(self, name):
8+
self._name = name
9+
self._last_login_time = datetime.now() - timedelta(1)
10+
11+
@property
12+
def name(self):
13+
return self._name
14+
15+
def login(self):
16+
self._last_login_time = datetime.now()
17+
18+
def is_login(self):
19+
return self._last_login_time >= datetime.combine(date.today(), datetime.min.time())
20+
21+
def query(self):
22+
return []

shipane_sdk/jobs/joinquant_following.py renamed to shipane_sdk/jobs/online_quant_following.py

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,15 @@
33
import logging
44
from datetime import datetime
55

6-
from shipane_sdk.joinquant.client import JoinQuantClient
7-
from shipane_sdk.joinquant.transaction import JoinQuantTransaction
86
from shipane_sdk.market_utils import MarketUtils
97

108

11-
class JoinQuantFollowingJob(object):
12-
def __init__(self, config, client):
9+
class OnlineQuantFollowingJob(object):
10+
def __init__(self, shipane_client, quant_client, name=None):
1311
self._log = logging.getLogger()
14-
self._config = config
15-
self._shipane_client = client
16-
self._jq_client = JoinQuantClient(username=self._config.get('JoinQuant', 'username'),
17-
password=self._config.get('JoinQuant', 'password'),
18-
backtest_id=self._config.get('JoinQuant', 'backtest_id'))
19-
self._jq_client.login()
12+
self._shipane_client = shipane_client
13+
self._quant_client = quant_client
14+
self._name = name
2015
self._start_datatime = datetime.now()
2116
self._processed_transactions = []
2217

@@ -27,19 +22,21 @@ def __call__(self):
2722
del self._processed_transactions[:]
2823
return
2924

25+
if not self._quant_client.is_login():
26+
self._log.info("登录 {}".format(self._quant_client.name))
27+
self._quant_client.login()
28+
3029
self._log.info("********** 开始跟单 **********")
3130
try:
32-
transaction_detail = self._jq_client.query()
33-
raw_transactions = transaction_detail['data']['transaction']
34-
self._log.info("获取到 {} 条委托".format(len(raw_transactions)))
31+
all_transactions = self._quant_client.query()
32+
self._log.info("获取到 {} 条委托".format(len(all_transactions)))
3533

3634
transactions = []
37-
for raw_transaction in raw_transactions:
38-
transaction = JoinQuantTransaction(raw_transaction).normalize()
35+
for transaction in all_transactions:
3936
if self._is_expired(transaction):
4037
continue
41-
4238
transactions.append(transaction)
39+
4340
self._log.info("获取到 {} 条有效委托".format(len(transactions)))
4441

4542
for tx in transactions:
@@ -59,6 +56,10 @@ def __call__(self):
5956
self._log.exception("跟单异常")
6057
self._log.info("********** 结束跟单 **********\n")
6158

59+
@property
60+
def name(self):
61+
return self._name
62+
6263
def _is_expired(self, transaction):
6364
if transaction.completed_at < self._start_datatime:
6465
return True

shipane_sdk/jobs/ricequant_following.py

Lines changed: 0 additions & 67 deletions
This file was deleted.

shipane_sdk/joinquant/client.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,16 @@
44

55
import requests
66

7+
from shipane_sdk.base_quant_client import BaseQuantClient
8+
from shipane_sdk.joinquant.transaction import JoinQuantTransaction
79

8-
class JoinQuantClient(object):
10+
11+
class JoinQuantClient(BaseQuantClient):
912
BASE_URL = 'https://www.joinquant.com'
1013

1114
def __init__(self, **kwargs):
15+
super(JoinQuantClient, self).__init__('JoinQuant')
16+
1217
self._session = requests.Session()
1318
self._username = kwargs.pop('username')
1419
self._password = kwargs.pop('password')
@@ -35,11 +40,20 @@ def login(self):
3540
'cookie': response.headers['Set-Cookie']
3641
})
3742

43+
super(JoinQuantClient, self).login()
44+
3845
def query(self):
3946
today_str = datetime.today().strftime('%Y-%m-%d')
4047
response = self._session.get('{}/algorithm/live/transactionDetail'.format(self.BASE_URL), params={
4148
'backtestId': self._backtest_id,
4249
'data': today_str,
4350
'ajax': 1
4451
})
45-
return response.json()
52+
transaction_detail = response.json()
53+
raw_transactions = transaction_detail['data']['transaction']
54+
transactions = []
55+
for raw_transaction in raw_transactions:
56+
transaction = JoinQuantTransaction(raw_transaction).normalize()
57+
transactions.append(transaction)
58+
59+
return transactions

shipane_sdk/ricequant/client.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,27 @@
22

33
from rqopen_client import RQOpenClient
44

5+
from shipane_sdk.base_quant_client import BaseQuantClient
6+
from shipane_sdk.ricequant.transaction import RiceQuantTransaction
57

6-
class RiceQuantClient(object):
8+
9+
class RiceQuantClient(BaseQuantClient):
710
def __init__(self, **kwargs):
11+
super(RiceQuantClient, self).__init__('RiceQuant')
12+
813
self._run_id = kwargs.pop('run_id')
914
self._rq_client = RQOpenClient(kwargs.pop('username'), kwargs.pop('password'))
1015

1116
def login(self):
1217
self._rq_client.login()
18+
super(RiceQuantClient, self).login()
1319

1420
def query(self):
15-
return self._rq_client.get_day_trades(self._run_id)
21+
response = self._rq_client.get_day_trades(self._run_id)
22+
raw_transactions = response['resp']['trades']
23+
transactions = []
24+
for raw_transaction in raw_transactions:
25+
transaction = RiceQuantTransaction(raw_transaction).normalize()
26+
transactions.append(transaction)
27+
28+
return transactions

shipane_sdk/scheduler.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@
1111

1212
from shipane_sdk import Client
1313
from shipane_sdk.ap import APCronParser
14-
from shipane_sdk.jobs.joinquant_following import JoinQuantFollowingJob
1514
from shipane_sdk.jobs.new_stock_purchase import NewStockPurchaseJob
16-
from shipane_sdk.jobs.ricequant_following import RiceQuantFollowingJob
15+
from shipane_sdk.jobs.online_quant_following import OnlineQuantFollowingJob
16+
from shipane_sdk.joinquant.client import JoinQuantClient
17+
from shipane_sdk.ricequant.client import RiceQuantClient
1718

1819
if six.PY2:
1920
ConfigParser = configparser.RawConfigParser
@@ -34,10 +35,16 @@ def __init__(self):
3435
self._client = Client(host=self._config.get('ShiPanE', 'host'),
3536
port=self._config.get('ShiPanE', 'port'),
3637
key=self._config.get('ShiPanE', 'key'))
38+
self._jq_client = JoinQuantClient(username=self._config.get('JoinQuant', 'username'),
39+
password=self._config.get('JoinQuant', 'password'),
40+
backtest_id=self._config.get('JoinQuant', 'backtest_id'))
41+
self._rq_client = RiceQuantClient(username=self._config.get('RiceQuant', 'username'),
42+
password=self._config.get('RiceQuant', 'password'),
43+
run_id=self._config.get('RiceQuant', 'run_id'))
3744

3845
self._new_stock_purchase_job = NewStockPurchaseJob(self._config, self._client)
39-
self._joinquant_following_job = JoinQuantFollowingJob(self._config, self._client)
40-
self._ricequant_following_job = RiceQuantFollowingJob(self._config, self._client)
46+
self._jq_following_job = OnlineQuantFollowingJob(self._client, self._jq_client, 'JoinQuantFollowingJob')
47+
self._rq_following_job = OnlineQuantFollowingJob(self._client, self._rq_client, 'RiceQuantFollowingJob')
4148

4249
def start(self):
4350
scheduler = BackgroundScheduler()
@@ -49,14 +56,16 @@ def start(self):
4956
self._log.warning('New stock purchase job is not enabled')
5057

5158
if self._config.getboolean('JoinQuant', 'enabled'):
52-
scheduler.add_job(self._joinquant_following_job,
53-
APCronParser.parse(self._config.get('JoinQuant', 'schedule')))
59+
scheduler.add_job(self._jq_following_job,
60+
APCronParser.parse(self._config.get('JoinQuant', 'schedule')),
61+
None, None, None, self._jq_following_job.name)
5462
else:
5563
self._log.warning('JoinQuant following job is not enabled')
5664

5765
if self._config.getboolean('RiceQuant', 'enabled'):
58-
scheduler.add_job(self._ricequant_following_job,
59-
APCronParser.parse(self._config.get('RiceQuant', 'schedule')))
66+
scheduler.add_job(self._rq_following_job,
67+
APCronParser.parse(self._config.get('RiceQuant', 'schedule')),
68+
None, None, None, self._rq_following_job.name)
6069
else:
6170
self._log.warning('RiceQuant following job is not enabled')
6271

tests/shipane_sdk/joinquant/test_client.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ def setUp(self):
1919
config = ConfigParser()
2020
dir_path = os.path.dirname(os.path.realpath(__file__))
2121
config.read('{}/../../config/config.ini'.format(dir_path))
22-
self._jqClient = JoinQuantClient(username=config.get('JoinQuant', 'username'),
23-
password=config.get('JoinQuant', 'password'),
24-
backtest_id=config.get('JoinQuant', 'backtestId'))
22+
self._jq_client = JoinQuantClient(username=config.get('JoinQuant', 'username'),
23+
password=config.get('JoinQuant', 'password'),
24+
backtest_id=config.get('JoinQuant', 'backtestId'))
2525

2626
def test_query(self):
27-
self._jqClient.login()
28-
transaction_detail = self._jqClient.query()
29-
self.assertTrue('data' in transaction_detail)
27+
self._jq_client.login()
28+
transactions = self._jq_client.query()
29+
self.assertTrue(isinstance(transactions, list))

tests/shipane_sdk/ricequant/test_client.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ def setUp(self):
1919
config = ConfigParser()
2020
dir_path = os.path.dirname(os.path.realpath(__file__))
2121
config.read('{}/../../config/config.ini'.format(dir_path))
22-
self._rqClient = RiceQuantClient(username=config.get('RiceQuant', 'username'),
23-
password=config.get('RiceQuant', 'password'),
24-
run_id=config.get('RiceQuant', 'run_id'))
22+
self._rq_client = RiceQuantClient(username=config.get('RiceQuant', 'username'),
23+
password=config.get('RiceQuant', 'password'),
24+
run_id=config.get('RiceQuant', 'run_id'))
2525

2626
def test_query(self):
27-
self._rqClient.login()
28-
response = self._rqClient.query()
29-
self.assertTrue('resp' in response)
27+
self._rq_client.login()
28+
transactions = self._rq_client.query()
29+
self.assertTrue(isinstance(transactions, list))

0 commit comments

Comments
 (0)