トレーディング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
期間限定!PayPayで支払うと抽選でお得
この記事が気に入ったらチップで応援してみませんか?