kabusapiで自動売買する話 part 13 | ぼったーうさぎのブログ

ぼったーうさぎのブログ

ゆるく株の話など
アイコンもゆるいうさぎにしてます
リニューアルして、ぼったーの話を中心にします。
ぼったーってのは、Botでトレードする人って意味でしょうか

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

###############################