Zaifの値段を取得して買いシグナルないしはそれに準じる何かを判断する 応用編

前回のラ(ry

丸写しでなにやってるか理解してなかったので読み解くところからやっていきます。

参考にしているのはコレ。

なんか見返すと、よくこれ丸写しできたなというか、丸写しで行こうと思ったなって感じの記事ですね。
読んでいかないと使えない親切設計じゃないですか。

無視しましたが……。

読解。

正直グラフに関してはどうでもよくて、重要なのはcsvを読んでるところですね。

btc_df = pd.read_csv("./dat/btc.csv", names = ("date", "BTC price"))

btc_df = btc_df[-864:-1]

項目を指定して……末尾から行数を指定しているんですよねこれ。
たぶん。

で、後半はなんかいろいろと計算してますが、そっちはグラフ作るためにいろいろしている部分でしょうからスルーします。

読解終了。

一瞬で終わりました。

とりあえず……なんですかね。

値段を見ていろいろと判断することはできそうですね。
チャート特有の計算は無視するとして。

ぱっと思いつくものだと、値段を監視しておいて、x 日以内の最低価格より y パーセント下がったら買う、みたいなことはすぐできそうです。

あ、でもこれだけだと買い続けちゃうから、ポジションとか注文の状態を考慮しないといかんですね。

売りはリミットで実現できそうです。

書いてみる

だいぶ悩みつつ書いてみました。

import pandas as pd
from pandas import Series,DataFrame
import numpy as np
from datetime import datetime
import time
import json
import requests
import csv
from zaifapi import *
import logging

FILE_ID='ETERNAL_NANPIN'

def get_lowest_price_order(orders):
    lowest_price = 0
    for order in orders:
        price = orders[order]['price']
        if lowest_price == 0 or lowest_price > price:
            lowest_price = price
    return lowest_price

########################################
# ログ関連
########################################
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

handler = logging.StreamHandler()
handler.setFormatter(formatter)
handler.setLevel(logging.INFO)

fileHandler = logging.FileHandler('./log/'+FILE_ID+".log")
fileHandler.setFormatter(formatter)

logger.addHandler(handler)
logger.addHandler(fileHandler)

########################################
# ZAIFAPI
########################################
KEY=''
SECRET=''
zaif = ZaifPublicApi()
trade = ZaifTradeApi(KEY, SECRET)

########################################
# ユーザ定義用変数
########################################
# 取得する行数(>1)
csv_range = 500

# 補足する下落幅(%)
down_rate = 0.5

# 1件の注文に利用する金額
order_yen = 2000

min_position = 0

while True:

    # 過去の最低価格を取得
    btc_df = pd.read_csv("./dat/btc.csv", names = ("date", "price"))
    btc_df = btc_df[-1*csv_range:-1]
    min_price = btc_df["price"].min()
    if min_position == 0:
        min_position = min_price

    # 現在の最低額の注文を取得
    orders = trade.active_orders()
    min_order = get_lowest_price_order(orders)

    # 履歴とポジションと注文の中で一番安い価格を出す
    min_price = min([min_price, min_position, min_order])

    # 現在価格を取得
    current_price = zaif.last_price('btc_jpy')['last_price']

    # 現在価格が基準価格よりdown_rate%以上下がったら買い注文を出す
    trigger_price = min_price * (1 - down_rate / 100)
    logger.debug(','.join(
        ["Min:"+str(min_price),
         "Target:"+str(trigger_price),
         "Current:"+str(current_price)]
    ))

    if trigger_price > current_price:
        # 買い注文を出す
        trade.trade(
            'btc_jpy',
            'bid',
            current_price,
            order_yen / current_price,
            min_price,
            FILE_ID
            )
        logger.info("BTC_JPYに%s円で%sBTCの注文を出しました" % (str(current_price), str(order_yen / current_price)))

    print('.')
    time.sleep(10)

値段取得の方はこんな感じ。

import pandas as pd
from pandas import Series,DataFrame
import numpy as np
from datetime import datetime
import time
import json
import requests
import csv
import sys, codecs
import time

while True:
    date = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
    response = requests.get('https://api.zaif.jp/api/1/last_price/btc_jpy')
    if response.status_code != 200:
        raise Exception('return status code is {}'.format(response.status_code))
    res_dict = json.loads(response.text)
    btc_price = res_dict['last_price']
    #[現在時刻、売買価格]のリストを作成
    btc_list = [date, btc_price]

    f = open("./dat/btc.csv", "a")
    writer = csv.writer(f, lineterminator='\n')
    writer.writerow(btc_list)
    f.close()

    time.sleep(60);

とりあえずこれで動くっぽいです……?
動かしてたらなんか途中でzaif側がエラーに見舞われたのか、502食らって落ちてましたが。

そのへん、適当にcatchする方法を考えねばならないようです。

いずれにしても現在はzaifに1.5円とかしかないので、まずは資金を放り込むところからですね……。

enter image description here

コメント