last modified 2022.09.23
12回目です。
redisデータベース関係です。
Tick QueueとOrder Queueです。
Queueというのは待ち行列と思うとわかりやすいと思います。
class tick_queue_on_redis:
redis上にtick情報のキューを作成します。
tick情報をテキスト情報にして、redisに格納します。
逆にtick情報をredisから取得します。
複数スクリプトから取得します。
class order_queue_on_redis:
redis上に売買命令のキューを作成します。
テキスト情報化して保存しています。
複数スクリプトの発注命令をためていきます。
part 13にpositions情報関係のスクリプト記載
++++++++++++++++++++++++++++++++
import redis import datetime import json import time class tick_queue_on_redis: ''' tickデータのキュー in: db:str 'T0','T1','T2' # データベース番号 sc:str 'XXXX' # 証券コード tick:array [ 'yyyymmddHHMMSS', # 日時 'price', # 価格 'qty' # 数量 ] out: tick:array [ 'sc', # 証券コード 'yyyymmddHHMMSS', # 日時 'price', # 価格 'qty' # 数量 ] ''' # データベース0の作成 db = redis.Redis( host='localhost', port=6379, db=0, charset="utf-8", decode_responses=True ) def __int__(self): return def zero_clear(self, db): # データベースのクリア if db == 'T0': self.db.delete('tick0') elif db == 'T1': self.db.delete('tick1') elif db == 'T2': self.db.delete('tick2') else: pass return def put_tick(self, db, sc, tick): # sc 銘柄コード # tick=['yyyymmddHHMMSS','price','qty'] #data = '{},{},{},{}'.format(sc, tick[0], tick[1], tick[2]) # json_data = json.dumps([sc, tick[0], tick[1], tick[2]]) # dict-text txt = '{},{},{},{}'.format(sc, tick[0], tick[1], tick[2]) if db == 'T0': self.db.rpush('tick0', txt) elif db == 'T1': self.db.rpush('tick0', txt) elif db == 'T2': self.db.rpush('tick0', txt) else: pass return def get_tick(self, db): dd = '' if db == 'T0': dd = self.db.lpop('tick0') elif db == 'T1': dd = self.db.lpop('tick0') elif db == 'T2': dd = self.db.lpop('tick0') else: pass if dd is None: return None # tick = json.loads(dd) # text-dict #tick=[ sc, 'yyyymmddHHMMSS', 'price', 'qty'] tick = dd.split(',') return tick ############################### ############################### class order_queue_on_redis: ''' order queue in: order=[ '9999', # 証券コード 'long', # 状態(買い、売り、反対売買) 'qty', # 数量 'price' # 価格 ] out: order=[ '9999', # 証券コード 'long', # 状態(買い、売り、反対売買) 'qty', # 数量 'price' # 価格 ] ''' db = redis.Redis( host='localhost', port=6379, db=1, charset="utf-8", decode_responses=True ) def __int__(self): return def lock(self): # 排他制御 lock while True: rr = self.db.setnx('lock', 'positions') if rr == True: break time.sleep(0.005) return def unlock(self): # 排他制御 unlock self.db.delete('lock') return def zero_clear(self): self.lock() # DBをロック # データベースのクリア self.db.delete('order') self.unlock() # DBを開放 return def put_order(self, order): ''' order=[ '9999', # 証券コード 'long', # 状態(買い、売り、反対売買) 'qty', # 数量 'price' # 価格 ] ''' txt = '{},{},{},{}'.format( order[0], # 証券コード order[1], # 状態(買い、売り、反対売買) order[2], # 数量 order[3] # 価格 ) self.lock() # DBをロック self.db.lpush('order', txt) # 前にtickをいれる self.unlock() # DBを開放 return def get_order(self): self.lock() # DBをロック dd = self.db.rpop('order') # 後ろからtickを取り出す self.unlock() # DBを開放 if dd is None: return None order = dd.split(',') return order ############################### ###############################