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

ぼったーうさぎのブログ

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

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

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