どうもバカルダーです。今回はGAS(Google App Script)とスプレッドシートをAPIとデータベースのように使い、BTC自動売買BOTのパラメーターをトレード結果に応じて変化させる方法を書いていきます。
具体的には「1回のトレードで1000ドル幅以上利益を取れた場合、次のトレードのロットを半分にする」というルールを実装します。
環境についてのリンクは以下の通りです。スプレッドシートとGASを準備し、トレードはBinanceFutureを利用し、BOTの稼働はGoogleCloudFunctionを使っています。
GASをAPI化してBOTのパラメーター(ロット)を自動で変化させるシステムの概要
Google App ScriptはスプレッドシートやGmail等をブラウザ上でプログラミングできるWEBサービスです。環境構築不要で実装できます。
BOTがエントリーしてからクローズするまでの流れは以下の通りです。
- BOTがローソク足を取得してエントリするか判断
- APIにアクセスしてロット数を取得。
- 取得したロット数でエントリー。
- 「エントリー方向」「エントリー価格」のパラメーターを付けてAPIにGETでアクセス。
- スプレッドシートに上記の2個のパラメーターが上書きされる。
- BOTがクローズしたら「クローズ価格」のパラメーターを付けてAPIにGETでアクセス。
- スプレッドシートに「クローズ価格」が上書きされて値幅計算される。
- 1000ドル幅以上の利益があればロット数を半分にしてスプレッドシートを上書き
- 1に戻る
GASをAPI化して外部からアクセスできるようにするので、自動売買BOTプログラム以外に準備する物は以下の2つだけです。
- スプレッドシート
- Google App Scriptのプログラム
データベースの為のスプレッドシートを準備
まずはスプレッドシートを準備します。ロット数を変化させるだけなので以下のような「ロット、エントリーとクローズ価格、エントリー方向」というシンプルな物で大丈夫です。
GASにプログラムを書く(Javascript)
次はGASにプログラムを書いていきます。GASはJavascriptで動くようになっています。スプレッドシートの「ツール」⇒「スクリプトエディタ」をクリックすると別タブでエディタが開きます。
GAS(Google App Script)のJavascriptコード
「function doGet」はURLにアクセスがあった場合{}内の処理を実行するための関数です。
function doGet(e) {
//スプレッドシートとsheetの指定
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('シート1');
//パラメーターの受け取り
var entry = e.parameter.gentry;
var close = e.parameter.gclose;
var hoko = e.parameter.ghoko;
//ロット
var lot=0.05
//ロットを半分に
var loth=lot*0.5
//パラメーターがあればスプレッドシートに上書き
if(hoko){
sheet.getRange("B5").setValue(hoko);
}
if(entry){
sheet.getRange("B3").setValue(entry);
}
if(close){
sheet.getRange("B4").setValue(close);
var oldhoko=sheet.getRange("B5").getValue();
var oldentry=sheet.getRange("B3").getValue();
var haba=close - oldentry;
//買いエントリーの場合
if (haba >=1000 && oldhoko=="BUY"){
sheet.getRange("B2").setValue(loth);
}
//売りエントリーの場合
else if (haba <=-1000 && oldhoko=="SELL"){
sheet.getRange("B2").setValue(loth);
}else{
sheet.getRange("B2").setValue(lot);
}
}else{
sheet.getRange("B4").setValue("クローズ待ち");
}
// json形式に加工
var Data = sheet.getRange(2,1,sheet.getLastRow(),sheet.getLastColumn()).getValues();
var list=[];
for (var i=0; i < Data.length-1; i++){
var json ={};
json[Data[i][0]]=Data[i][1]
list.push(json)
};
// 表示
var response = {
data: list
};
return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);
}
コードを書いたら、「公開」⇒「WEBアプリケーションとして導入」⇒「Project version:New、Execute the app as:Me、Who has access to the app:Anyone,even anonymous」で更新します。その後APIにアクセスするためのURLが表示されます。
URLにアクセスすると以下のようなJson形式のデータが取得できます。
{"data":[
{"lot":0.05},
{"entry":7000},
{"close":"クローズ待ち"},
{"hoko":"buy"}
]}
スプレッドシートのセルの取得と書き込み
スプレッドシートのセルの指定は「sheet.getRange("セル")」で行います。
セルに入力された値を取得したい場合は「.getValue();」、セルの値を上書きしたい場合は「.setValue("値");」で行います。
パラメーターの受け取りとスプレッドシートへの書き込み
必要なパラメーター(エントリー価格等)の受け取りと受け取った後のスプレッドシートへの書き込みについて解説します。
//パラメーターの受け取り
var entry = e.parameter.gentry;
//パラメーターがあればスプレッドシートに上書き
if(entry){
sheet.getRange("B3").setValue(entry);
}
上記のように「entry」にパラメーターを受け取って欲しい場合は「https://APIURL?gentry=7000」というURLにGETでアクセスします。「?」以降の部分がパラメーターです。
そしてパラメーターを受け取った場合「B3セル」に「.setValue(entry)」で値を書き込む処理をしています。
Json形式に加工、表示
// json形式に加工
var Data = sheet.getRange(2,1,sheet.getLastRow(),sheet.getLastColumn()).getValues();
var list=[];
for (var i=0; i < Data.length-1; i++){
var json ={};
json[Data[i][0]]=Data[i][1]
list.push(json)
};
// 表示
var response = {
data: list
};
return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON);
「sheet.getRange(2,1,sheet.getLastRow(),sheet.getLastColumn()).getValues();」は「2行目1列目から値が入力されている最後の行、最後の列までの値を配列で取得する」という命令です。「getValues()」というように最後にsを付ける事で配列で取得できます。
配列をfor文で処理して、Json形式で表示させる呪文を書いてURLにアクセスしたときにJsonを表示させます。
Pythonでロットの取得とパラメーター付きAPIアクセス
最後にPythonでのロット取得とエントリー後、クローズ後のパラメーター付きAPIアクセスのコードを書いておきます。
import requests
import json
#APIのURL
gasurl="APIURL"
#ロット取得
res = requests.get(gasurl)
res=res.text
res = json.loads(res)
lot=res["data"][0]["lot"]
#エントリしたらエントリー価格と方向を上書き(7000で買いエントリの場合)
res = requests.get(gasurl+'?gentry=7000&ghoko=BUY')
#クローズしたらクローズ価格を上書き(8000でクローズした場合)
res = requests.get(gasurl+'?gclose=8000')
まとめ:GASと自動売買BOT
今回は自動売買BOTのロット数を自動で変更するための方法を書きましたが、スプレッドシートをデータベースのように使う事でより複雑な使い方もできそうです。
ただ、APIアクセスからの読み込み、書き込みの処理速度はあまり早くないのでスキャルピングBOTのような数秒の遅延が命取りになるようなBOTには不向きなので注意してください。
コメント