【GAS】(無料)スプレッドシートで仮想通貨の自動売買|bitFlyer

2021年10月9日

GASで仮想通貨の簡易的な自動売買システムを作成してみました。GASはGoogleのサーバー上で動作するため、サーバー構築も不要で自動起動も簡単に行えるため作成してみました。

簡易的なボリンジャーバンド とRSIを使用した簡単なアルゴリズムを採用していますので、勝率はそんなに高くないのでご注意ください。

なお、今回はbitFlyerをのAPIを使用しています。

Step① APIを使用したデータ集収のサンプル

まずアルゴリズムで使用するデータを収集します。使用するデータは取引価格になりますのでtickerで取得できる「最終取引価格」を30分おきに取得します。

スプレッドシートの作成

スプレッドシートを作成します。作成したら「ticker」というシートを作成します。このシートにデータが蓄積されていきます。

スクリプトの準備

「ツール」→「スクリプトエディタ」でスクリプトを作成します。

ライブラリを使用しますので左側のライブラリーのボタンを押して下記のスクリプトIDを入力して検索、追加をしてください。

1gcUUTZ9pMYAHHK0_3wxVlcMBm9KwZO5G_zd25fkJWhweZKlSjN3mXwwr

下記のコードを入力し保存してください。

function getTicker(){
  let BF = bitFlyer.factory()
    let sh=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ticker")
    let lastRow=sh.getLastRow()
    
    let res= BF.getticker()
    let keys = Object.keys(res)
    let data
    if(lastRow==0){
      data=[keys]
    }else{
      data=[]
    }
    let temp=[]
    for (let key of keys){
      temp.push(res[key])
    }
    data.push(temp)

    sh.getRange(sh.getLastRow()+1,1,data.length,data[0].length).setValues(data)
    SpreadsheetApp.flush()
}

保存をしたら「getTicker」を実行してみてください。「ticker」シートにデータが抽出できれば成功です。

トリガーの設定

30分ごとにデータを抽出するようにトリガーを設定します。

右下の「トリガーの追加」をクリックして追加します。

上記のように設定して保存をすればデータ収集が開始されます。

Step② 自動売買をする

アカウントの作成

自動売買の部分を作っていきます。ここからはbitFlyerのアカウントが必要になりますのでお持ちでない場合は、下記からアカウントを作成してください。
招待コードはこちら 「razrx05d」

\登録はこちらから/

API keyとAPI Secretの取得

下記でAPI keyとAPI Secretを取得します。

bitFlyer Lightning ビットコイン取引所API

スプレッドシートの準備

複製用のスプレッドシートを用意したので「ファイル」→「コピーを作成」で複製し使用してください。

スプレッドシート

自動売買アルゴリズムの説明

ボリンジャーバンドとRSIを売買条件として設定しています。

簡単な設定しかしておりませんので本格的に運用するの際はカスタマイズすることを推奨しています。

ボリンジャーバンド
・期間は可変(10〜40を想定)
・最終取引価格が+2σ以上 → 購入
・最終取引価格が-2σ以下 → 売却

RSI
・0.7以上 → 購入
・0.3以下 → 売却

スクリプトの仕様

「main」シート

ボリンジャーバンドが購入条件になったらBBがBUY、売却条件になったらSELLになります。
RSIも同様です。

ボリンジャーバンド、RSIの算出期間を設定できます。

ここで設定した条件をもとに自動売買されるようにプログラムを作成します。

スクリプトの追記

スクリプトに下記のコードを追記します。

1行目と2行目は先程設定したkeyを入力してください。

const APP_KEY="bitFlyerのAPI key"
const APP_SECRET="bitFlyerのAPI secret"

function main(){
  let sh=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("main")
  let auto  = sh.getRange("C13").getValue()

  getTicker()

  if(auto===true){
    autoTrade()
  }
}

// 自動売買
function autoTrade(){
  let sh=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("main")
  let log_sh=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("log")
  
  let lastPrice    = sh.getRange("C3").getValue()  // 最終取引価格 
  let bb_flg       = sh.getRange("C4").getValue()  // ボリンジャーバンド取引フラグ
  let rsi_flg      = sh.getRange("C5").getValue()  // RSI取引フラグ
  let bb_req       = sh.getRange("C17").getValue() // ボリンジャーバンド条件使用フラグ
  let rsi_req      = sh.getRange("C18").getValue() // RSI条件使用フラグ
  let simulate_flg = sh.getRange("C22").getValue() // シミュレートモード
  let next_mode    = sh.getRange("C14").getValue() // 購入or売却
  let amount       = sh.getRange("C12").getValue() // 取引量

  let res 

    if(bb_req && rsi_req){
      if(bb_flg===next_mode && rsi_flg===next_mode){
        if(simulate_flg===false){
          res = sendchildorder(amount,next_mode)
        }else{
          res="simulate"
        }
      }
    }else if(bb_req && bb_flg===next_mode){
      if(simulate_flg===false){
        res = sendchildorder(amount,next_mode)
      }else{
        res="simulate"
      }
    }else if(rsi_req && rsi_flg===next_mode){
      if(simulate_flg===false){
        res = sendchildorder(amount,next_mode)
      }else{
        res={message:"simulate"}
      }
    }
  
  if(res !==undefined){
    console.log(res)
    sh.getRange("B27").setValue(res)
    if(res !=="" && res["error_message"] ===undefined){
      let day = new Date()
      let data = 
      log_sh.getRange(log_sh.getLastRow()+1,1,1,4).setValues([[day,amount,lastPrice,next_mode]])
      if(next_mode==="BUY"){
        sh.getRange("C14").setValue("SELL")
      }else {
        sh.getRange("C14").setValue("BUY") 
      }
    }
  }



}

//取引リクエスト
function sendchildorder(amount,mode){
  BF = new bitFlyer.factory(APP_KEY,APP_SECRET)
  let params = {
            "product_code": "BTC_JPY",
            "child_order_type": "MARKET",
            "side": mode,
            "size": amount,
            "minute_to_expire": 10000,
            "time_in_force": "GTC"
        }
   return BF.sendchildorder(params)

}

これで完了です。

使用方法

コードの内容を理解し問題ないかを確認してから運用するしてください

・自動売買のチェックが外れているか確認します。
・スクリプト「main」が30分毎に実行されるようにトリガーをセットします。
・データが溜まってきたらmainシートの「算出期間」を調整します。
・mainシートのMODEで取引を購入、売却から始めるかを選択してください。
コードの内容を理解し問題ないかを確認してから運用するしてください。

本ページにおいて案内したプログラム・データなどをお客様が使用した結果生じるいかなる損害に対しても一切責任を負いません



マネパン情報①

マネパン情報②

マネパン情報③