botコード、暗証番号のコピーだらけで流失の危険があります
テストしてるとファイルが一杯できるが、取引所の「keyとsecret」をベタ書きにするとそこら中にコピーが散乱してしまって、間違えてブログにアップしそうで怖いです。
サイトにkeytとsecretが表示されているのを2回実際に見たことがあります。(お知らせしました♡)
隠すものを隠しつつ簡単に呼び出せる方法
そこで、Cony WildさんのChannelBreakOutBotで使われていた手法を少し変えて取り入れます。
Windows-PC内のイメージとしてこんな感じである
c:\
|
|-\coufig|(フォルダ)
| |-config.json(key & secret & LINEtoken)
|
|-\bot|(フォルダ)
| |-parameter.json パラメタ、プロパティ等設定値のファイル
| |-config.py Configクラスを設定し、config.jsonを読み込む
| |-parameter.py Parameterクラスを設定し、パラメーターを読み込む
| |-bot.py cfg=Config() parm=Parameter() クラスのインスタンス化
要するにどんなBOTをどのフォルダから作ってもkey,secretはPC内に一つしか存在させないので流出の危険がないし、初めだけ面倒だが後々管理も楽。
(githubなどで上級者的バージョン管理など行える人は別のやり方があるらしいがそこはgoogle先生で)
key & senretの隠し方を詳しく説明
config.json 定義ファイル(場所固定)
{
key=*******
secret=******
}
parameter.json パラメーター格納ファイル(コードと同じ場所)
{
product_code=’FX_BTC_JPY’
size=1.0などプログラムで指定するパラメータの集まり
}
隠したkeyとsecretの呼び出し方
class Config() key&secretクラス化のコード(config.jsonと同じ場所)
__init__
self.api_key=config.jon[‘api_key’]値をセット
class Parameter() パラメータークラス化のコード(コードと同じ場所)
__init__
self.product_code=parameter.json[‘product_code’]値をセット
def bitcoin() プログラム
#先にconfig.pyのpathを通しておく
import sys
sys.path.append(“C:\config”)
from config import Config #config.pyの中の、Class Config()を読み込む
cfg=Config(): #インスタンス化
api.order(self, cfg.key, cfg.secret) 値を利用
prmt=Parameter()
api.get—(self, product_code=prmt.product_code, ———-)
という風に、値のセットが2段構えになるので面倒だが、本来は当然の措置である。
- 暗証番号を公開してしまうことはない
- バージョンを変えてもkey&secretのコピペは不要
- 別ボットプログラムもkey&secretはコピペ不要
- 定期的にkey&secretを替えてもどのプログラムにも影響がない
特に4は、keyの権限を変えた時に全部のプログラムに反映できるので安全である。
そもそも、コード内にconfig値やパラメーターをベタ書きして、直接書き換えたりしたらかなりダサいし、バカにされますよ。誰かに。誰に?
コンフィグファイルを設定&読み込む実際のコード
#config.py #!/usr/bin/python3 # coding: utf-8 import json class Config: def __init__(self, json_path="c:\config\config.json"): #フォルダ決め打ち self.api_key = config["取得した自分のkey"] self.api_secret = config["同secret"] self.api_line_token = config["line_notify_token"]
#parameter.py #!/usr/bin/python3 # coding: utf-8 import json class Parameter() def__init__(self,file='parameter.json') config = json.load(open(file, "r")) self.api_file_name = config["fileName"] self.interval = config["sleepTime"] self.long_term = config["longTerm"] self.short_term = config["shortTerm"] self.size = config["lotSize"] self.product_code = config["product_code"] self.api_health = config["healthCheck"] #----------------------------------------------------------------------
''' position.py 実行ファイル pybitflyerを使ったgetpositionsの呼出 ''' import time import pybitflyer import sys sys.path.append("C:\config") from config import Config #config.pyの中の、Class Config()を読み込む from parameter import Parameter #Parameterクラスの定義をimport cfg = Config()#プロパティ定義のインスタンス化 prmt=Parameter()#パラメータ定義のインスタンス化 api = pybitflyer.API(api_key=cfg.api_key, api_secret=cfg.api_secret) #pybitflyerを使ってbitflyerにアクセス def check_position(): response = api.getpositions(product_code=prmt.product_code) #持ち玉を見に行く print( response[0]['side'],response[0]['size'],int(response[0]['pnl']),int(response[0]['price'])) #リスト内辞書形式で帰ってくる if __name__ == '__main__': print('(仮想)通貨ペアは{}インターバルは{}秒'.format(prmt.product_code,prmt.interval)) while True: try: check_position() except: print("やばいことが起きた") break time.sleep(prmt.interval)
configフォルダに有る何ファイルかを毎回絶対パスで指定するのも面倒だし、他の取引所のconfigの時など融通が利かないので、プログラム内でパスを通す方法があるので先頭にコピペして使う。
import sys #↓のpathを使うため取り込む
sys.path.append(“C:\config”) #configファオルダごとpathを通してしまう(毎回指定必要)
from config import Config #config.pyの中の、Class Configを読み込む
from parameter import Parameter #Parameter.pyの中の、Class Parameterを読み込む