
仮想通貨bot 勉強記録⑪
~赤三兵のロジックを作る~
◆前回までのあらすじ
関数を使ってコードをブロック化し、コンパクトにまとめることができました。
import pybybit
from datetime import datetime,timedelta
import time
from rich import print as pp
def get_price(min):#最新ローソク足を取得
t = datetime.now() - timedelta(hours=1)#今から1時間前の時刻を取得
t = int(t.timestamp())#タイムスタンプ形式に変換&float型からint型に変換
d = bybit.rest.inverse.public_kline_list(
symbol = "BTCUSD",
interval=min,
from_=t).json()
last_data = d['result'][-2]
#返り値取得
return { "close_time" : last_data['open_time'],
"open_price" : last_data['open'],
"high_price" : last_data['high'],
"low_price" : last_data['low'],
"close_price" : last_data['close']}
def print_price(data):#画面出力
pp( " 時間: " + datetime.fromtimestamp(data['close_time']).strftime('%Y/%m/%d %H:%M')
+ " 始値: " + str(data['open_price'])
+ " 終値: " + str(data['close_price']))
def check_kline(data):#ローソク足の条件判別
#実体割合の算出
realbody_rate = abs(float(data["close_price"]) - float(data["open_price"])) / float(data["high_price"])-float(data["low_price"])
#実体の大きさの算出
increase_rate = float(data["close_price"]) / float(data["open_price"]) - 1
if data["close_price"] < data["open_price"] : return False#ローソク足が赤だったらFalse
elif increase_rate < 0.0005 : return False#実体の大きさが0.05%未満ならFalse
elif realbody_rate < 0.5 : return False#実体の割合がローソク足の50%未満ならFalse
else : return True#上記すべて条件が当てはまらなければTrue
def check_ascend( data,last_data ):#ローソク足の連続上昇の判別
#今回の始値が前回の始値を上回っている且つ今回の終値が前回の終値を上回っていればTure
if data["open_price"] > last_data["open_price"] and data["close_price"] > last_data["close_price"]:
return True
else:#それ以外はFalse
return False
def main():
last_data = get_price(1)
print_price( last_data )
flag = 0
while True:
data = get_price(1)
if data["close_time"] != last_data["close_time"]:
print_price( data )
if flag == 0 and check_kline( data ):
flag = 1
elif flag == 1 and check_kline( data ) and check_ascend( data,last_data ):
print("2本連続で陽線")
flag = 2
elif flag == 2 and check_kline( data ) and check_ascend( data,last_data ):
print("3本連続で陽線 なので 買い!")
flag = 3
else:
flag = 0
last_data["close_time"] = data["close_time"]
last_data["open_price"] = data["open_price"]
last_data["close_price"] = data["close_price"]
time.sleep(10)
main()
◆今回やること
・赤三兵の自動売買ロジックを作る
こちらを参考に、ByBitで動く酒田五法の赤三兵の自動売買ロジックを作っていきます。
作ったコードはこちら。
import pybybit
from datetime import datetime,timedelta
import time
from rich import print as pp
def get_price(min):#最新ローソク足を取得
t = datetime.now() - timedelta(hours=1)#今から1時間前の時刻を取得
t = int(t.timestamp())#タイムスタンプ形式に変換&float型からint型に変換
d = bybit.rest.inverse.public_kline_list(
symbol = "BTCUSD",
interval=min,
from_=t).json()
last_data = d['result'][-2]
#返り値取得
return { "close_time" : last_data['open_time'],
"open_price" : last_data['open'],
"high_price" : last_data['high'],
"low_price" : last_data['low'],
"close_price" : last_data['close']}
def print_price(data):#画面出力
pp( " 時間: " + datetime.fromtimestamp(data['close_time']).strftime('%Y/%m/%d %H:%M')
+ " 始値: " + str(data['open_price'])
+ " 終値: " + str(data['close_price']))
def check_candle(data):#ローソク足の条件判別
#実体割合の算出
realbody_rate = abs(float(data["close_price"]) - float(data["open_price"])) / float(data["high_price"])-float(data["low_price"])
#実体の大きさの算出
increase_rate = float(data["close_price"]) / float(data["open_price"]) - 1
if data["close_price"] < data["open_price"] : return False#ローソク足が赤だったらFalse
elif increase_rate < 0.0005 : return False#実体の大きさが0.05%未満ならFalse
elif realbody_rate < 0.5 : return False#実体の割合がローソク足の50%未満ならFalse
else : return True#上記すべて条件が当てはまらなければTrue
def check_ascend( data,last_data ):#ローソク足の連続上昇の判別
#今回の始値が前回の始値を上回っている且つ今回の終値が前回の終値を上回っていればTure
if data["open_price"] > last_data["open_price"] and data["close_price"] > last_data["close_price"]:
return True
else:#それ以外はFalse
return False
def main():
last_data = get_price(1)
print_price( last_data )
flag = 0
while True:
data = get_price(1)
if data["close_time"] != last_data["close_time"]:
print_price( data )
if flag == 0 and check_candle( data ):
flag = 1
elif flag == 1 and check_candle( data ) and check_ascend( data,last_data ):
print("2本連続で陽線")
flag = 2
elif flag == 2 and check_candle( data ) and check_ascend( data,last_data ):
print("3本連続で陽線 なので 買い!")
flag = 3
else:
flag = 0
last_data["close_time"] = data["close_time"]
last_data["open_price"] = data["open_price"]
last_data["close_price"] = data["close_price"]
time.sleep(10)
main()
なげえ~~~。長いわ。。。
これ自作じゃなくて教科書見ながら真似しただけなんですけどね、、、
でも基本は作った関数を最後にまとめて使うだけなので、関数ごとの内容を理解すればコード全体を理解できました。
◆解説
・def get_price(min)
def get_price(min):#最新ローソク足を取得
t = datetime.now() - timedelta(hours=1)#今から1時間前の時刻を取得
t = int(t.timestamp())#タイムスタンプ形式に変換&float型からint型に変換
d = bybit.rest.inverse.public_kline_list(
symbol = "BTCUSD",
interval=min,
from_=t).json()
last_data = d['result'][-2]
#返り値取得
return { "close_time" : last_data['open_time'],
"open_price" : last_data['open'],
"high_price" : last_data['high'],
"low_price" : last_data['low'],
"close_price" : last_data['close']}
いつも使ってる関数です。
1行目:変数tに現在から1時間前の時刻を入れる。
2行目:変数tを タイムスタンプ形式に変換し、更にint型に変換する。
3行目:PybybitでBybitから1時間分のローソク足情報を取得し、json形式に変換して変数dに入れる。
4行目:変数last_dataに最新のローソク足情報を入れる。
5行目:return{}でdict(辞書)形式のデータを返すようにしておく。
・def print_price(data)
def print_price(data):#画面出力
print( " 時間: " + datetime.fromtimestamp(data['close_time']).strftime('%Y/%m/%d %H:%M')
+ " 始値: " + str(data['open_price'])
+ " 終値: " + str(data['close_price']))
いつも使ってる画面出力用の関数です。
1行目:時間、始値、終値を表示
時間表示の部分は、datetimeの関数で見やすいように変換している。
勉強記録⑧で解説してます。
・def check_kline(data)
def check_kline(data):#ローソク足の条件判別
#実体割合の算出
realbody_rate = abs(float(data["close_price"]) - float(data["open_price"])) / float(data["high_price"])-float(data["low_price"])
#実体の大きさの算出
increase_rate = float(data["close_price"]) / float(data["open_price"]) - 1
if data["close_price"] < data["open_price"] : return False#ローソク足が赤だったらFalse
elif increase_rate < 0.0005 : return False#実体の大きさが0.05%未満ならFalse
elif realbody_rate < 0.5 : return False#実体の割合がローソク足の50%未満ならFalse
else : return True#上記すべて条件が当てはまらなければTrue
ローソク足の条件判別をする関数です。
1行目:ローソク足の実体割合=(終値-始値の絶対値)/(高値-安値) で算出している
2行目:ローソク足の実体部分の大きさ=(終値/始値)-1で算出している
3行目:条件①ローソク足の価格が上昇していなかったらFalseを返す
4行目:条件②ローソク足の実体が価格の0.05%未満ならFalseを返す
5行目:条件③ローソク足の実体割合が50%未満ならFalseを返す
6行目:条件①、②、③のいずれにも当てはまらなかったらTrueを返す
・def check_ascend( data,last_data ):
def check_ascend( data,last_data ):
if data["open_price"] > last_data["open_price"] and data["close_price"] > last_data["close_price"]:
return True
else:
return False
ローソク足が連続で上昇しているかを判別する関数です。
1行目:今回の始値が前回の終値より大きい且つ、今回の終値が前回の終値より大きい場合、Trueを返す
2行目:それ以外はFalseを返す
・def main()
def main():
last_data = get_price(1)
print_price( last_data )
flag = 0
while True:
data = get_price(1)
if data["close_time"] != last_data["close_time"]:
print_price( data )
if flag == 0 and check_kline( data ):
flag = 1
elif flag == 1 and check_kline( data ) and check_ascend( data,last_data ):
print("2本連続で陽線")
flag = 2
elif flag == 2 and check_kline( data ) and check_ascend( data,last_data ):
print("3本連続で陽線 なので 買い!")
flag = 3
else:
flag = 0
last_data["close_time"] = data["close_time"]
last_data["open_price"] = data["open_price"]
last_data["close_price"] = data["close_price"]
time.sleep(10)
メイン関数です。サブ関数で算出したデータを使って、ロジックを実行(表示)していきます。
1行目:変数last_dataに、get_price(1)で入手した戻り値を入れる
2行目:変数last_dataのデータを表示
3行目:変数flagを定義し、0を入れておく
4行目:While文に移行
5行目:変数dataにget_price(1)で入手した戻り値を入れる
6行目:data内のclose_timeと、last_data内のclose_timeを比較し、異なったら7行目に進む。一致したら10秒待って再度比較する。
7行目:data内のデータをprint_priceで表示する
8行目:変数flagが0且つcheck_klineがTrueを返していたらflagに1を上書き
9行目:変数flagが1且つcheck_kline・check_ascendが共にTrueを返していたら(2本連続で陽線)の表示を行い、flagに2を上書き
10行目:変数flagが2且つcheck_kline・check_ascendが共にTrueを返していたら(3本連続で陽線なので買い!)の表示を行い、flagに3を上書き
11行目:条件のどれにも当てはまらなかったらflagに0を上書き(リセット)
12~14行目:条件判定を行った後、last_dataにdataを上書き(前回の価格を書き換える)
最後:10秒待ってwhile文内を繰り返し
以上です!
実行するとこんな感じ
(サイン出てないやんけ!)
今回はここまで。
次回は過去データを用いてシグナルを検証します。