[python]binanceのAPIを使ってリミットとストップ注文を出し、完了したらline通知する方法。

書いた人↓

バイナンスの注文にはリミット注文とストップ注文を同時に出せないので、APIを使ってN秒ごとに価格を取得してその価格を上回るか下回るかしたら、注文を出すための方法を紹介します。

APIがセキュリティ的に怖い方はライン通知だけを設定することも可能です。

目次

準備1:バイナンスAPIを取得

準備2:python環境「anaconda」インストール

準備3:ライン通知用トークン取得

準備4:ライブラリインストール→コードを張り付けて、必要部分を編集

→実行

注意事項・デメリット

デメリット改良版

準備1:バイナンスAPIを取得(API注文を出さない方は不要)

バイナンスの「account」→「API」から取得できます。

[Read info][Enable Trading]にチェックを入れて、IP Access~の部分は(Recommended)の方を選択しておきましょう。

API KEYとSecret KEYは保存しておいてください。

準備2:python実行環境「anaconda」をインストール

次にpythonを動かすための環境を準備します。公式サイトから「python 3.6」をインストールします。

ダウンロード開始時に「メールアドレスを登録しましょう」というような画面が表示されることがありますが、ここでは「No Thanks」を選択で大丈夫です

●準備3:ライン通知用トークンを取得

必ずPCから以下のページでラインIDでログイン

マイページを開き、「トークンを発行する」をクリック

トークン名(自由に決める)を入力し、通知先を選択します。今回は「1:1でLINE Notifyから通知を受け取る」(自分だけに送られる)を選択で良いと思います。

その後発行したトークンが表示されますのでトークンを保存しておきましょう。

準備4:ライブラリインストール→コードを張り付けて、必要部分を編集

Windowsのスタートメニューから「Anaconda3」→「Anaconda Prompt」を実行します。黒い画面が表示されるので、

cd .spyder-py3

と入力してエンターを押します。これはフォルダの移動を意味します。次に、

pip install python-binance

と入力してエンターを押します。バイナンスのAPI操作に必要なライブラリがインストールされます。

次に、anacondaインストールと同時にインストールされる「spyder」を起動します。

最初から表示されている

# -*- coding: utf-8 -*-
"""
Created on Mon Apr 30 23:05:30 2018
@author: a
"""

を削除して以下のコードを貼り付けます。

from binance.client import Client
import time
import sys
import requests

client = Client("apikey","secret")

#通貨ペア指定
pair="BCCBTC"

#トリガー価格

#リミットトリガー
limit=0.15

#ストップトリガー
stop=0.14

#注文量
qat=0.01

#指値買い注文
def limitbuy():
    order = client.order_limit_buy(
    symbol=pair,
    quantity=qat,
    price='0.12')
    print (order["symbol"])
    print (order["side"])
    print ("価格:"+order["price"])
    print ("量:"+ order["origQty"])

#指値売り注文
def limitsell():
    order = client.order_limit_sell(
    symbol=pair,
    quantity=qat,
    price='0.12')
    print (order["symbol"])
    print (order["side"])
    print ("価格:"+order["price"])
    print ("量:"+ order["origQty"])
  
#成り行き買い注文
def marketbuy():
    order = client.order_market_buy(
    symbol=pair,
    quantity=qat)
    print (order["symbol"])
    print (order["side"])
    print ("量:"+ order["origQty"])

#成り行き売り注文
def marketsell():
    order = client.order_market_sell(
    symbol=pair,
    quantity=qat)
    print (order["symbol"])
    print (order["side"])
    print ("量:"+ order["origQty"])
    

#LINEにメッセージを送信する関数
def lineNotify(message):
    line_notify_token = 'lineトークン'
    line_notify_api = 'https://notify-api.line.me/api/notify'
    payload = {'message': message}
    headers = {'Authorization': 'Bearer ' + line_notify_token} 
    requests.post(line_notify_api, data=payload, headers=headers)

 #以下繰り返し処理 while True:
    print("監視通貨:"+pair)
    print("limit設定:"+str(limit))
    print("stop設定:"+str(stop))
    print("\n")
    ticker = client.get_ticker(symbol=pair)
    ask= ticker['askPrice'] 
    bid =ticker['bidPrice']
    last =ticker['lastPrice']
    print ("last:"+last)
    print ("ask:"+ask)
    print ("bid:"+bid +"\n")
    
     #a > b	bよりaが大きい 
     #a >= b	bよりaが大きいか等しい
     #a < b	bよりaが小さい
     #a <= b	bよりaが小さいか等しい
    if float(bid)>=limit:
         #利確注文実行処理         print ("注文実行")
        marketsell()
        print("利確&処理終了")
        lineNotify(pair+":利確注文実行")
        sys.exit()
    elif float(bid)<=stop:
        print ("注文実行")
         #損切注文実行処理         marketsell()
        print("損切&処理終了")
        lineNotify(pair+":損切注文実行")
        sys.exit()
    else:
        print ("監視中(^・ェ・)ジー…\n")
        
     #価格取得間隔指定     time.sleep(3)

必要部分を編集

client = Client("apikey","secret")

ここにバイナンスのAPI KEYとSECRET KEYを入力します。””は消さないでください。

#通貨ペア指定
pair="BCCBTC"

ここに注文したい通貨ペアをしています。バイナンスのAPIで使う通貨ペア一覧はこちらへ→https://note.mu/bakaruda/n/n132b4d09b51f

#リミットトリガー
limit=0.15

#ストップトリガー
stop=0.14

#注文量
qat=0.01

リミットトリガー=ここに指定した価格以上になったら、利確注文を出します。

ストップトリガー=ここに指定した価格以下になったら、損切注文を出します。

注文量も必要に応じて設定してください。

#LINEにメッセージを送信する関数
def lineNotify(message):
    line_notify_token = 'lineトークン'
    line_notify_api = 'https://notify-api.line.me/api/notify'
    payload = {'message': message}
    headers = {'Authorization': 'Bearer ' + line_notify_token} 
    requests.post(line_notify_api, data=payload, headers=headers)

"lineトークン"にラインで発行したトークンを貼り付けます。

次は注文部分の編集です。

if float(bid)>=limit:
       #利確注文実行処理 
       marketsell()
       print("利確&処理終了")
       lineNotify(pair+":利確注文実行")
       sys.exit()
   elif float(bid)<=stop:
       #損切注文実行処理 
       marketsell()
       print("損切&処理終了")
       lineNotify(pair+":損切注文実行")
       sys.exit()

「現在価格」の定義ですが、

[bid][ask][last]の3つから選択できます。[last]とは最新の約定価格を指します。

if float(bid)>=limit:←bidがリミットに設定した価格より高くなったら注文

elif float(bid)<=stop:←bidがストップに設定した価格より低くなったら注文

のbidをaskやlastに変更可能です。

また、上の#利確注文実行処理を実際に行うコードが

marketsell()

です。成り行きで売るという命令です。

指値注文売りをしたい場合は、marketsell()を消して

limitsell()

と入力します。指値注文の場合は以下の部分の「price='0.12'」を編集する必要があります。ここに注文を入れたい価格を入力します。

#指値売り注文
def limitsell():
   order = client.order_limit_sell(
   symbol=pair,
   quantity=qat,
   price='0.12')
   print (order["symbol"])
   print (order["side"])
   print ("価格:"+order["price"])
   print ("量:"+ order["origQty"])

同様に、marketbuy()は成り行き買い、limitbuy()は指値買い注文です。

ライン通知の文章は

lineNotify(pair+":損切注文実行")

の(”:損切注文実行”)を編集して変更できます。

最後に

 #価格取得間隔指定 
   time.sleep(3)

の数字の部分を変更して何秒間隔で価格を取得するかを変更できます。

変更したら、「.spyder-py3」のフォルダに「好きな名前.py」で保存します。

実行してみる

Windowsのスタートメニューから「Anaconda3」→「Anaconda Prompt」を実行します。黒い画面が表示されるので、

cd .spyder-py3

でフォルダ移動して

python 好きな名前.py

と入力してエンターを押すとpythonファイルを実行できます。

複数の通貨を監視したい場合

複数の通貨を監視したい場合、通貨ペアやリミット価格、ストップ価格を変更して別のファイル名で保存してから、新たに「Anaconda Prompt」からファイルを実行すれば同時に稼働できます。

ライン通知のみほしい場合

ライン通知のみほしい場合はバイナンスAPIは不要です。さらに

 #利確注文実行処理 
      marketsell() #損切注文実行処理 
      marketsell()

を削除しておいてください。

注意事項

最初にテストするときは、成り行き注文ではなく、指値注文で絶対に約定しない価格で試してみて下さい。成り行き注文のテストは可能な限り少量の注文で行ってください。

このプログラムは注文を実行をすると自動的に終了するようになっています。なので

sys.exit()

を絶対に削除しないでください。これを削除してしまうと残高が有る限り注文し続けてしまいます。

デメリット

リミット指値注文した後に約定せずに戻った場合ストップ注文がはいらないので、改善の余地ありです。

改良版

デメリット解消のため、あらかじめ手動でリミット注文を出しておき、指定の価格を下回ったら、注文をキャンセルし、ストップ注文を出すコード。

こちらはオープンオーダーを取得するのでバイナンスAPI必須です。

その他の改良点は注文量をオープンオーダーから自動取得(1件のみ)、スタート前に設定値を確認するプロセスの追加です。

ストップ価格のみ設定すれば良い。

from binance.client import Client
import time
import sys
import requests

client = Client("apikey","secret")
#通貨ペア指定
pair="BNBBTC"

#トリガー価格
#ストップトリガー
stop=0.00001

#注文量自動取得
opord =  client.get_open_orders(symbol=pair)

#注文量
qat=opord[0]["origQty"]

#指値価格(成り行きの場合は無視)
limitprice=0.12

#指値買い注文
def limitbuy():
    order = client.order_limit_buy(
    symbol=pair,
    quantity=qat,
    price=limitprice)
    print (order["symbol"])
    print (order["side"])
    print ("価格:"+order["price"])
    print ("量:"+ order["origQty"])

#指値売り注文
def limitsell():
    order = client.order_limit_sell(
    symbol=pair,
    quantity=qat,
    price=limitprice)
    print (order["symbol"])
    print (order["side"])
    print ("価格:"+order["price"])
    print ("量:"+ order["origQty"])
  
#成り行き買い注文
def marketbuy():
    order = client.order_market_buy(
    symbol=pair,
    quantity=qat)
    print (order["symbol"])
    print (order["side"])
    print ("量:"+ order["origQty"])

#成り行き売り注文
def marketsell():
    order = client.order_market_sell(
    symbol=pair,
    quantity=qat)
    print (order["symbol"])
    print (order["side"])
    print ("量:"+ order["origQty"])
    

#LINEにメッセージを送信する関数
def lineNotify(message):
    line_notify_token = 'lineトークン'
    line_notify_api = 'https://notify-api.line.me/api/notify'
    payload = {'message': message}
    headers = {'Authorization': 'Bearer ' + line_notify_token} 
    requests.post(line_notify_api, data=payload, headers=headers)

print("監視通貨:"+pair)
print("注文量"+qat)
print("注文中リミット:"+op)
print("stopトリガー設定:"+str(stop))
print("指値価格(成行の場合は無視):"+str(limitprice))

def yes_no_input():
    choice = input("この設定でいいですか? 'yes' or 'no' [y/N]: ").lower()
    if choice in ['y', 'ye', 'yes']:
        return True
    elif choice in ['n', 'no']:
        return False

if yes_no_input():
    print('スタート!')
     #以下繰り返し処理     while True:
        print("監視通貨:"+pair)
        opord=client.get_open_orders(symbol=pair)
        op = opord[0]["price"]
        print("注文中リミット:"+op)
        print("stopトリガー設定:"+str(stop))
        opid = opord[0]["orderId"]
        print("注文Id:"+str(opid))
        print("\n")
       
        ticker = client.get_ticker(symbol=pair)
        ask= ticker['askPrice'] 
        bid =ticker['bidPrice']
        last =ticker['lastPrice']
        print ("last:"+last)
        print ("ask:"+ask)
        print ("bid:"+bid +"\n")
    
     #a > b	bよりaが大きい 
     #a >= b	bよりaが大きいか等しい
     #a < b	bよりaが小さい
     #a <= b	bよりaが小さいか等しい
        if float(bid)<=stop:
             #注文キャンセル             client.cancel_order(
            symbol=pair,
            orderId=opid)
             #注文実行処理              #成り行きがおすすめ             limitsell()
            print("損切&処理終了")
            lineNotify(pair+":損切注文実行")
            sys.exit()
        else:
            print ("監視中(^・ェ・)ジー…\n")
            print ("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
        
     #価格取得間隔指定         time.sleep(3)

注意点

スタート前に以下の確認が入りますので、設定があっていればyを入力してエンターを押すとスタートします。

この設定でいいですか? 'yes' or 'no' [y/N]: 

上記のコードでは、同じ通貨で複数リミット注文出している場合は1つの注文しかキャンセルされないので注意。

DONATE

BNB:0x2929c5c62b8a8ec0a670d8b3e6941c57c98a2571

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