last modified 2022.09.23
13回目です。
redisデータベース関係です。
position情報のことです。
ポジションというのはどの株を何株いくらで売り買いしているかの情報です。
longで買いポジション、shortで売りポジション、dealでポジションなしです
Positionsです。
class positions_on_redis:
これもテキスト情報で保存しています。
ただ、情報量がおおくて、データ構造も配列に配列がはいっている構造なので、構造体をjson形式のテキストにして保存しています。
これも複数のスクリプトと共有なので排他制御します。
++++++++++++++++++++++++++++++++
import redis import datetime import json import time class positions_on_redis: ''' 各銘柄の売買ポジション状況 in: position:array [ 'sc', # 証券コード 'deal', # 状態 qlong,qshort,qdeal,long,short,deal 'qty', # 数量 'price', # 価格 'orderid' # orderID kabusapiシステムの売買ID ] out: position:array [ 'time' # 日時 'yyyymmddHHMMSS' 'sc', # 証券コード 'deal', # 状態 qlong,qshort,qdeal,long,short,deal 'qty', # 数量 'price', # 価格 'orderid' # orderID kabusapiシステムの売買ID ] 内部形式 position:array [ 'time' # 日時 'yyyymmddHHMMSS' 'sc', # 証券コード 'deal', # 状態 qlong,qshort,qdeal,long,short,deal 'qty', # 数量 'price', # 価格 'orderid' # orderID kabusapiシステムの売買ID ] positions:array [ position0, position1 ,positoin2 ,positon3 ] ''' db = redis.Redis( host='localhost', port=6379, db=2, charset="utf-8", decode_responses=True ) # log fileの設定 tt = datetime.datetime.now().strftime('%Y%m%d') log_folder='./' _prefix_f=f'{tt}.trade.' _suffix_f='.csv' 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 initialize(self, sc): tt = datetime.datetime.now().strftime('%H%M%S.%f') data0 = [ tt, # 時間 sc, # 銘柄コード 'deal', # ポジション種別 qlong,qshort,qdeal,long,short,deal '0', # 数量 '0', # 価格 '0' # orderId ] #ダミーデータをセット positions=[data0,data0,data0,data0] j_txt = json.dumps(positions) # dict-text # redisに保存 self.lock() # DBをロック self.db.hset('positions', sc, j_txt) # file名前 #self.db.hset('file', sc, recordfile) self.unlock() # DBを開放 return def put_position(self, sc, position): ''' position:array [ 'sc', # 証券コード 'deal', # 状態 qlong,qshort,qdeal,long,short,deal 'qty', # 数量 'price', # 価格 'id:0000' # orderID kabusapiシステムの売買ID ] ''' tt = datetime.datetime.now().strftime('%H%M%S.%f') dd = [ tt, position[0], position[1], position[2], position[3], position[4] ] # position情報取得 self.lock() # DBをロック response = self.db.hget('positions', sc) # DBから読み込み poss = json.loads(response) # json-dict # position情報の先頭にポジション情報を入れる poss.insert(0, dd) poss.pop() # redisに保存 j_text = json.dumps(poss) # dict-json self.db.hset('positions', sc, j_text) # DBに書き込み self.unlock() # DBを開放 # ファイルに記録 file=f'{self.log_folder}/{self._prefix_f}{sc}{self._suffix_f}' f = open(file, 'a') pos = dd[2] if pos == 'qlong' or pos == 'qshort': txt = '{}{},{},{},{},{},{}'.format( '+++\n', dd[0], dd[1], dd[2], dd[3], dd[4], dd[5] ) else: txt = '{},{},{},{},{},{}'.format( dd[0], dd[1], dd[2], dd[3], dd[4], dd[5] ) print(txt, file=f) f.close() return def get_position(self, sc, i): self.lock() # DBをロック response = self.db.hget('positions', sc) # DBから読み込み self.unlock() # DBを開放 poss = json.loads(response) # json-dict return poss[i] def get_current_position(self, sc): # wrapper position = self.get_position(sc, 0) return position def get_previous_position(self, sc): # wrapper position = self.get_position(sc, 1) return position def qlong(self, sc): position = [ sc, # 証券コード 'qlong', # 状態 qlong,qshort,qdeal,long,short,deal 0, # 数量 0, # 価格 'id:0000' # orderID kabusapiシステムの売買ID ] self.put_position(sc,position) return def qshort(self, sc): position = [ sc, # 証券コード 'qshort', # 状態 qlong,qshort,qdeal,long,short,deal 0, # 数量 0, # 価格 'id:0000' # orderID kabusapiシステムの売買ID ] self.put_position(sc,position) return def qdeal(self, sc): ppos = self.get_current_position(sc) # 現在のポジション取得 position = [ sc, # 証券コード 'qdeal', # 状態 qlong,qshort,qdeal,long,short,deal ppos[3], # 数量 ppos[4], # 価格 ppos[5] # orderID kabusapiシステムの売買ID ] self.put_position(sc,position) return def long(self, sc, pp, vv, orderid): position = [ sc, # 証券コード 'long', # 状態 qlong,qshort,qdeal,long,short,deal vv, # 数量 pp, # 価格 orderid # orderID kabusapiシステムの売買ID ] self.put_position(sc,position) return def short(self, sc, pp, vv, orderid): position = [ sc, # 証券コード 'short', # 状態 qlong,qshort,qdeal,long,short,deal vv, # 数量 pp, # 価格 orderid # orderID kabusapiシステムの売買ID ] self.put_position(sc,position) return def deal(self, sc, pp, vv, orderid): position = [ sc, # 証券コード 'deal', # 状態 qlong,qshort,qdeal,long,short,deal vv, # 数量 pp, # 価格 orderid # orderID kabusapiシステムの売買ID ] self.put_position(sc,position) return ###############################