BlockFi利息2倍キャンペーン中!2020年7月19日午前8時59分まで!
詳細はこちら

GASをAPI化してBTC自動売買BOTのロット数を自動変化させる

プログラミング

どうもバカルダーです。今回はGAS(Google App Script)とスプレッドシートをAPIとデータベースのように使い、BTC自動売買BOTのパラメーターをトレード結果に応じて変化させる方法を書いていきます。

具体的には「1回のトレードで1000ドル幅以上利益を取れた場合、次のトレードのロットを半分にする」というルールを実装します。

環境についてのリンクは以下の通りです。スプレッドシートとGASを準備し、トレードはBinanceFutureを利用し、BOTの稼働はGoogleCloudFunctionを使っています。

GASをAPI化してBOTのパラメーター(ロット)を自動で変化させるシステムの概要

Google App ScriptはスプレッドシートやGmail等をブラウザ上でプログラミングできるWEBサービスです。環境構築不要で実装できます。

BOTがエントリーしてからクローズするまでの流れは以下の通りです。

GASをAPI化してBOTのパラメーター(ロット)を自動で変化させるシステムの概要
  1. BOTがローソク足を取得してエントリするか判断
  2. APIにアクセスしてロット数を取得。
  3. 取得したロット数でエントリー。
  4. 「エントリー方向」「エントリー価格」のパラメーターを付けてAPIにGETでアクセス。
  5. スプレッドシートに上記の2個のパラメーターが上書きされる。
  6. BOTがクローズしたら「クローズ価格」のパラメーターを付けてAPIにGETでアクセス。
  7. スプレッドシートに「クローズ価格」が上書きされて値幅計算される。
  8. 1000ドル幅以上の利益があればロット数を半分にしてスプレッドシートを上書き
  9. 1に戻る

GASをAPI化して外部からアクセスできるようにするので、自動売買BOTプログラム以外に準備する物は以下の2つだけです。

  • スプレッドシート
  • Google App Scriptのプログラム

データベースの為のスプレッドシートを準備

まずはスプレッドシートを準備します。ロット数を変化させるだけなので以下のような「ロット、エントリーとクローズ価格、エントリー方向」というシンプルな物で大丈夫です。

GoogleAppScriptのためのスプレッドシート

GASにプログラムを書く(Javascript)

次はGASにプログラムを書いていきます。GASはJavascriptで動くようになっています。スプレッドシートの「ツール」⇒「スクリプトエディタ」をクリックすると別タブでエディタが開きます。

スクリプトからGASを開く

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が表示されます。

GASをWEBAPIで公開
※コードを修正する時は必ずバージョンを「New」にしてください。

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には不向きなので注意してください。

コメント