見出し画像

【GASでサーバー不要】bybitの金利額をdiscordのチャンネルに通知するスクリプト

あいづです。

前回の記事のスクリプトではPCをつけっぱなし(サーバーとして)で運用する必要があったのですが、それがいらない方法で再度作成しました。

Googleが提供している無料で色々プログラムを動かせるGoogle Apps Scriptという環境で実行させます。今回はプログラマ向けかもしれないのでさっくりと。。。

ソースコード(コメント少なくてすみません)

// 設定値
const ApiSecretKey = "";
const SecretKey =  "";
const DiscordWebhookUrl = "";
const DiscordMessageTemplate = "%s の合計金利は %s 円でした。"
const DiscordBotName = "金利お知らせくん(GAS)";

function notifyFundingAmount() {

 let startDate = new Date();
 startDate = new Date(startDate.setDate(startDate.getDate() -1));

 const fundingSum = getFundingSum(startDate);
 const fundingSumJpy = fundingSum * getBtcPriceInJPY();

 const message = Utilities.formatString(
       DiscordMessageTemplate,
       Utilities.formatDate(startDate,"JST","yyyy/MM/dd"),
       fundingSumJpy.toFixed(3));
 postDiscordWebhook(message);

}

function postDiscordWebhook(message){
 const options ={
   "method":"post",
   "contentType":"application/json",
   "payload": JSON.stringify({username:DiscordBotName,content:message})
 };
 UrlFetchApp.fetch(DiscordWebhookUrl, options);
}


function getBtcPriceInJPY(){
 const response = UrlFetchApp.fetch("https://api.bitflyer.com/v1/getticker");
 const ltp = Number(JSON.parse(response.getContentText("UTF-8")).ltp);
 return ltp; 

}

function getFundingSum(startDate){
 const params ={
   "api_key":ApiSecretKey,
   "symbol":"BTCUSD",
   "timestamp":Date.now(),
   "limit":200,
   "order":"desc",
   "start_date": Date.UTC(startDate.getFullYear(),startDate.getMonth(),startDate.getDate(),-9,0,0,0)
 };

 const queryString = convertObject2QueryString(params);
 const sign = Utilities.computeHmacSha256Signature(queryString, SecretKey)
 .map(function(chr){return (chr+256).toString(16).slice(-2)})
 .join('');

 const executionsListUrl = `https://api.bybit.com/v2/private/execution/list?${queryString}&sign=${sign}`;
 const response = UrlFetchApp.fetch(executionsListUrl);
 const content = JSON.parse(response.getContentText("UTF-8"));
 let tradeList = content.result.trade_list.filter(e=>e.exec_type === "Funding");
 
 const fundingSum = tradeList.reduce((prev,t)=>{ 
   var exec_fee =Number(t.exec_fee);
   return prev + Number(t.exec_fee);
   },0) * -1; 

 return fundingSum;
}

function convertObject2QueryString(obj){
 let paramPairs = [];
 Object.keys(obj).sort().forEach(k=>{
   paramPairs.push(k+"="+obj[k]);
 });
 let queryString = paramPairs.join("&");
 return queryString;
}

メリット

サーバーが不要

デメリット

・bybitのAPIキーの仕様上、IPを指定しないAPIキーは3ヶ月しか保たない。
・トリガー(提示実行)が日付単位だと1時間の幅がある。
 例えば 0時~1時 となる。

デメリットは少しありますが、サーバーが不要というのはそれを上回るメリットになりえるかなと思います。

おわりに

これを発展させると GASでAPI呼び出し→スプレッドシードでデータ蓄積 という完全にサーバーなしでデータを集めることもできそうですね。継続して色々作っていこうと思います。データを用いたトレード検証に強力に役立てるはずです。

なお、スプレッドシートの上限は以下のようになっています。

スプレッドシート
・​Google スプレッドシートで作成したスプレッドシートまたは Google スプレッドシート形式に変換したスプレッドシートは 500 万セルまたは 18,278 列(列 ZZZ)まで。
・Microsoft Excel からインポートしたスプレッドシートの場合は、500 万セルまたは 18,278 列まで。上限は Excel と CSV のインポートで同一です。
・いずれかのセルの文字数が 5 万文字を超える場合、そのセルはアップロードされません



ご意見ご感想などあればTwitterアカウントまでお知らせ下さい。

また、本記事は有料設定にしていますが、ソース含めすべての内容が無料で閲覧できます。
投げ銭用として設定していますので、評価いただければ幸いです😄

ここから先は

0字

¥ 100

この記事が気に入ったらチップで応援してみませんか?