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

コメント