トレーディングBotをマルチスレッド化する、ほぼ最小のPython実装

マルチスレッド構造の小さな実用例です。Bot開発のお供にどうぞ。
価値を感じたら、サポート・投げ銭・購入などで応援をお願いします。
(記事自体は無料部分で全てです)

概要:
 価格取得 / ロジック動作 / 注文処理について、それぞれ専用のスレッドを起動し、連携して動作させます。

スレッド化のメリット:
 価格取得・ロジック動作・注文は、動作すべき時間軸が異なります。
 全てを一つのループ内に記述すると、足の引っ張りあいになったり、実装が複雑になって読みにくくなるという問題があり、これをスレッド化によって解消できます。

下準備:
 なし。全て標準モジュールで書いてあります。

実装サンプル:

#!/usr/bin/python3
# coding: utf-8
#----------------------------------------------------------
# BTC tip先:36ds4QZByQ1PdA2MXtQ8EGg4doci5w5hky
#----------------------------------------------------------
import datetime
import random
import time
import queue

# データ受信スレッド(このサンプルではランダムウォーク)
def recv_proc(data):
    ltp = 700000
    while True:
        ltp += random.randrange(-20, 20)
        data['ticker'] = { 'ltp': ltp }
        time.sleep(0.05)

# データ処理スレッド(終値が100円動いたら注文側に渡す)
def calc_proc(data, cmdq):
    while 0 == len(data): time.sleep(1) # データ到着待ち
    last_ltp = 0
    while True:
        time.sleep(0.2)
        ltp = data['ticker']['ltp']
        if abs(ltp - last_ltp) > 100:
            cmdq.put((last_ltp, ltp))
            last_ltp = ltp

# 取引スレッド(データが来たら表示、5秒来ない時は'→'を表示)
def deal_proc(data, cmdq):
    while True:
        try:
            last_ltp, ltp = cmdq.get(timeout=5)
            print(datetime.datetime.now(), last_ltp, ltp,
                '↑' if ltp > last_ltp else '↓')
        except queue.Empty:
            print(datetime.datetime.now(), '→')

# 全部起動する
if __name__ == '__main__':
    from threading import Thread

    # 共有データの作成
    data    = {}
    cmdq    = queue.Queue()

    # 各スレッドの起動
    Thread(target=recv_proc, args=[data], daemon=True).start()
    Thread(target=calc_proc, args=[data, cmdq], daemon=True).start()
    Thread(target=deal_proc, args=[data, cmdq], daemon=True).start()
    while True: time.sleep(60)

 recv_proc のところを BfRealtimeTicker に対応させれば、bitFlyerの実データを元に動作します。

ご武運を!

ここから先は

0字

¥ 100

この記事が気に入ったらサポートをしてみませんか?