GASとTwitterを連携させて為替通知を自動でツイートさせる仕組みを実装してみた

FXの自動通知システムを作ろうと思った訳

今日は、FXの自動通知システムを作ってみたので紹介させてもらいたい。

なぜ、このようなシステムを作ったか。

それは、私がFXで50万円ほど赤字になっているからだ。。。((+_+))

大赤字になった理由としては以下だと思う。

  • 常にチャートを見ているわけではないので、買タイミング、売タイミングが合わず、ずるずるとポジションを持ち続け、ロスカットされてしまう。
  • 新型コロナのため、チャートが荒れに荒れて、訳が分からなくなったため。
  • チャートをずっと見ていると、縦軸の幅に惑わされてしまい、変なタイミングでポジションを持ってしまう。

まぁ、一生懸命勉強したわけでもなく、にわかでやっていたのでしょうがない。。。

諦めよう。

でも、これからは確実に勝ちたい!そう思って、前々から通知システムは考えていた。

出来れば、自動売買システムまで作り上げたかったが、今は知識と時間がないため、

GAS(Google Apps Script)とTwitterのAPIを利用して、自動ツイートするシステムを構築するにとどめておく。

そのアカウントは「為替通知」です。まんまですな(笑)

ツイートする条件とツイート内容は以下だ。

  • 1分間で10pips以上の動きがあった時(EUR、GBPは16pips)
    → ★急上昇中/★急下降中 〇〇 元レート→現レート
  • 1分間で5pips以上の動きがあった時(EUR、GBPは8pips)
    → 上昇中/下降中 〇〇:元レート→現レート

対象通貨は以下だ。

  • USDJPY
  • EURJPY
  • GBPJPY
  • AUDJPY

対象通貨が少ないが、データ取得元が心もとないので勘弁してほしい。

それでも、主要4か国は入っているから、まぁ良いかな~?と。

ちなみに。

動きのない日中でもちゃんとツイートしてくれた( *´艸`)

作り方

作り方は、結構簡単だった。

  1. TwitterのAPIの使用申請をする
  2. GASで通貨レートを1分おきに取得する
  3. 保持していた情報と比べて、10pips以上の差が出たらツイートする

言葉に表すと、これだけだ。

細かな条件などはもっと煮詰めていって、通知がされた瞬間に売買をすれば、

勝率8割くらいいくように調整したい。

投資家の皆さん。

こんなシステムを作ってみたので、良いアイデアがありましたら、教えてくださいませ。

何分間で〇pips動いたら狙い目だよ!とか。。。

それを為替通知くんに覚えこませたいです(*’ω’*)

為替通知」をフォローして、リツイートいただいても良いですし、

こちらのサイトにコメントいただいてもOKです。

ご協力をお願いいたします。

最後に、スプレッドシートの画像と、GASのコードを載せておきます。

TwitterのAPIの仕様が変わりまくっているせいで、そこに苦労したが、

そこさえ乗り越えられれば、あとは自由だ(^^♪

// アクティブシートを取得
const activeSheet = SpreadsheetApp.getActiveSheet();

// 前日データの削除
function beforeDataDelete() {
  activeSheet.getRange('B729:Q9999').clear({ formatOnly: false, contentsOnly: true ,commentsOnly: true,validationsOnly: true})
}

// 為替情報を取得
function callExchangeAPI() {
  let now = new Date(),
      url = "https://www.gaitameonline.com/rateaj/getrate",
      response = UrlFetchApp.fetch(url),
      content = response.getContentText(),
      fx = JSON.parse(content);
  
  fx.date = now;
  // 前回のデータを移動
  activeSheet.getRange('B8:Q1448').copyTo(activeSheet.getRange('B9:Q1449'))
  
  // 取得した情報をセット
  setData(fx);
}


// 取得した情報をセット
function setData(fx) {
  const fxCnt = fx.quotes.length;
  for (let i=0; i < fxCnt; i++) {
    const ret = fx.quotes[i];
    switch (ret.currencyPairCode) {
      case 'USDJPY':
        inputCells(ret, 2);
        autoTweet(ret, 2, 0.05, 'USDJPY');
        break;
      case 'EURJPY':
        inputCells(ret, 4);
        autoTweet(ret, 4, 0.08, 'EURJPY');
        break;
      case 'GBPJPY':
        inputCells(ret, 6);
        autoTweet(ret, 6, 0.08, 'GBPJPY');
        break;
      case 'AUDJPY':
        inputCells(ret, 8);
        autoTweet(ret, 8, 0.05, 'AUDJPY');
        break;
    }
  }
}

function inputCells(ret, col) {
  activeSheet.getRange(4,col).setValue(ret.open);
  if (activeSheet.getRange(2,col).getValue() < ret.high) {
    activeSheet.getRange(2,col).setValue(ret.high);
  }
  activeSheet.getRange(5,col).setValue(ret.high);
  if (activeSheet.getRange(3,col).getValue() > ret.low) {
    activeSheet.getRange(3,col).setValue(ret.low);
  }
  activeSheet.getRange(6,col).setValue(ret.low);
  activeSheet.getRange(8,col).setValue(ret.bid);
  activeSheet.getRange(8,col+1).setValue(ret.ask);
}

function autoTweet(ret, col, interval, CurrencyPair) {
  const before1minutesBit = Number(activeSheet.getRange(9,col).getValue());
  const nowBit = Number(ret.bid);
  const doubleInterval = Number(interval * 2);
  if (before1minutesBit - nowBit > doubleInterval) {
    tweet('★急下降中:'+ CurrencyPair + '\n' + before1minutesBit + '→' + ret.bid);
  } else if (before1minutesBit - nowBit < Number('-' + doubleInterval)) {
    tweet('★急上昇中:'+ CurrencyPair + '\n' + before1minutesBit + '→' + ret.bid);
  } else if (before1minutesBit - nowBit > Number(interval)) {
    tweet('下降:' + CurrencyPair + '\n' + before1minutesBit + '→' + ret.bid);
  } else if (before1minutesBit - nowBit < Number('-' + interval)) {
    tweet('上昇:' + CurrencyPair + '\n' + before1minutesBit + '→' + ret.bid);
  }
}

// 認証用のインスタンス
const twitter = TwitterWebService.getInstance(
  "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
);

// 認証
function authorize(){
  twitter.authorize();
}

// Twitterへの投稿
function tweet(msg){
  const service  = twitter.getService();
  const response = service.fetch("https://api.twitter.com/1.1/statuses/update.json", {
    method: "post",
    payload: { status: msg }
  });
}
トップへ戻る