エントリーから決済までをアンケートフォームからGoogleカレンダーに記録する方法【エントリー編】

はじめに

FXを始めてトレード記録をつけることが大事と思いながらなかなか記録が出来なかった私の記録とまとめの方法を備忘録的に記事にします。

この記事を読んでできること

Googleフォームでエントリー記録を入力するとGoogleカレンダーに以下の項目が入力されます。
①フォームに入力した記録(時間足ごとの目線、トレード戦略など)
②フォームに入力したエントリーポイント、利確ポイント、最終撤退ライン
③②を元にしてRRや想定利益、損失額を計算して出力
※下のようなイメージです。


各準備

Googleフォームの作り方の説明は、調べればすぐにわかると思うので割愛させていただきます。
Googleカレンダー、スプレッドシート、Apps Script 等の説明は
以下の記事に書いているのでそちらをご覧ください。

Googleカレンダーの準備

エントリーを記録するカレンダーを準備します。
※詳細は前回記事で

入力フォームの準備

質問1 通貨 ラジオボタン
質問2 今日の日足 ラジオボタン
質問3 日足三原則を守れているか チェックボックス
----セクション---
質問4 4時間足目線 選択式(グリッド)
質問5 4時間足STF方向感 ラジオボタン
質問6 1時間足目線 選択式(グリッド)
質問7 1時間足STF方向感 ラジオボタン
----セクション---
質問8 15分足目線 選択式(グリッド)
質問9 15分STF方向感 ラジオボタン
質問10 15分足は爆発したか? ラジオボタン
質問11 15分足は爆発後反転したか? ラジオボタン
質問12 利益を取りたい方向に意識される水平線はないか? ラジオボタン
質問13 直近で大きな経済指標はないか? ラジオボタン
----セクション---
質問14 エントリ方向 ラジオボタン
質問15 エントリー日時 日付(時刻を含める)⇒右下の三点の中
質問16 エントリーレート 記述式テキスト
質問17 利確ポイント 記述式テキスト
質問18 最終撤退ライン 記述式テキスト
質問19 エントリーロット 記述式テキスト
質問20 クロス円レート 記述式テキスト
質問21 トレード戦略 記述式テキスト
質問22 このトレードをキャンプメンバーに公開できますか? チェックボックス
質問23 負けても後悔しませんか? チェックボックス

スプレッドシートの準備

Apps Script の起動

※詳細は前回記事で

コードの入力

ここからコードを入力していきます。
以下が全体のコードです。
上記のフォームと同じものを作って以下のコードをコピペして
64行目の”カレンダーID”を準備されたカレンダーのものと入れ替えたらそのまま使えます。

function Entrynote(){
  const sheet = SpreadsheetApp.getActiveSheet(); // シートを取得
  var lastRow = sheet.getLastRow() // 最終行

  for (i=2; i<=lastRow; i++) {
    sheet.getRange(i, 28).setValue(i-1) // 連番
    sheet.getRange(i, 29).setValue("=U" + i + "-T" + i) // 目標pips
    sheet.getRange(i, 30).setValue("=T" + i + "-V" + i)// 最大損失pips    
    sheet.getRange(i, 31).setValue("=T" + i + "+AD" + i) // 1:1
    sheet.getRange(i, 32).setValue("=T" + i + "+AD" + i + "*2")// 1:2
    sheet.getRange(i, 33).setValue("=T" + i + "+AD" + i + "*3") // 1:3
    
  }

  const Currencypair  = sheet.getRange(lastRow,2).getValue();// 通貨ペア
  const Four_b_Dow = sheet.getRange(lastRow,5).getValue();// 4時間大きなダウ
  const Four_s_Dow = sheet.getRange(lastRow,6).getValue();// 4時間小さなダウ
  const Four_stf = sheet.getRange(lastRow,7).getValue();// 4時間STF
  const One_b_Dow = sheet.getRange(lastRow,8).getValue();// 1時間大きなダウ
  const One_s_Dow = sheet.getRange(lastRow,9).getValue();// 1時間小さなダウ
  const One_stf = sheet.getRange(lastRow,10).getValue();// 11時間STF
  const Fifteen_b_Dow = sheet.getRange(lastRow,11).getValue();// 15分大きなダウ
  const Fifteen_s_Dow = sheet.getRange(lastRow,12).getValue();// 15分小さなダウ
  const Fifteen_stf = sheet.getRange(lastRow,13).getValue();// 15分STF
  const Entry = sheet.getRange(lastRow,18).getValue();// エントリー方向
  const Entry_date = sheet.getRange(lastRow,19).getValue();// エントリー日時
  const Entry_rate = sheet.getRange(lastRow,20).getValue();// エントリーレート
  const TP_rate = sheet.getRange(lastRow,21).getValue();// 利確ライン
  const LC_rate = sheet.getRange(lastRow,22).getValue();// 最終撤退ライン
  const Entry_lot = sheet.getRange(lastRow,23).getValue();// エントリーロット
  const Cross_Yen = sheet.getRange(lastRow,24).getValue();// クロス円レート
  const Trade_Scenario = sheet.getRange(lastRow,25).getValue();// トレード戦略
  const Number = sheet.getRange(lastRow,28).getValue();// 連番
  const Reward = Math.abs(sheet.getRange(lastRow,29).getValue());// リワード
  const Risk = Math.abs(sheet.getRange(lastRow,30).getValue());// リスク
  const Reward1 = sheet.getRange(lastRow,31).getValue();// 1:1
  const Reward2 = sheet.getRange(lastRow,32).getValue();// 1:2
  const Reward3 = sheet.getRange(lastRow,33).getValue();// 1:3

  const RR = Reward / Risk;//想定するリスクリワード
  const Profit = (Reward * Entry_lot * Cross_Yen) * 10000;//想定する利益
  const Loss = (Risk * Entry_lot * Cross_Yen) * 10000;//最大損失額
  const Profit1 = Loss;//RR1:1 の時の利益額
  const Profit2 = Loss * 2;//RR1:2 の時の利益額
  const Profit3 = Loss * 3;//RR1:3 の時の利益額

 let Scenario =  Currencypair + "  " + Entry +"\n\n" + 
               "エントリーNo " + Number + "\n" +
               "4時間" + " 大ダウ " + Four_b_Dow + " 小ダウ " + Four_s_Dow + " STF " + Four_stf + "\n" + 
               "1時間" + " 大ダウ " + One_b_Dow + " 小ダウ " + One_s_Dow + " STF " + One_stf + "\n" + 
               "15分" + " 大ダウ " + Fifteen_b_Dow + " 小ダウ " + Fifteen_s_Dow + " STF " + Fifteen_stf + "\n" + 
               "トレード戦略" + Trade_Scenario + "\n" + 
               "エントリーレート " + Entry_rate + "\n" + 
               "エントリーロット " + Entry_lot + "\n" + 
               "利確ポイント " + TP_rate + " 想定利益額 " + Profit.toFixed(0) + " 円 " + "\n" + 
               "最終撤退ライン " + LC_rate + " 想定損失額 " + Loss.toFixed(0) + " 円 " + "\n" + 
               "設定したRR " + "1:" + RR.toFixed(2) + "\n" + "\n" +
               "RRによるTP" + "\n" + 
               "1:1 のレート " + Reward1.toFixed(3) + " 想定利益額 " + Profit1.toFixed(0) + " 円 " + "\n" + 
               "1:2 のレート " + Reward2.toFixed(3) + " 想定利益額 " + Profit2.toFixed(0) + " 円 " + "\n" +  
               "1:3 のレート " + Reward3.toFixed(3) + " 想定利益額 " + Profit3.toFixed(0) + " 円 " + "\n";

  // カレンダーオブジェクトを取得(トレード記録)
  let Calendar = CalendarApp.getCalendarById("カレンダーID");
  // カレンダーのタイムゾーンを"Asia/Tokyo"に変更する
  Calendar.setTimeZone("Asia/Tokyo");
  // カレンダーに日程を追加
   Calendar.createEvent("【" + Number + "】" + Currencypair + " " + Entry,new Date(Entry_date),new Date(Entry_date),{description: Scenario});

}

このまま使ってもらって構わないのですが、人によって入れたい項目等が違うと思うので、上のコードがどうなっているかひとつずつ説明していきます。
私は素人なので、本職の方でそれ違うよっていうことにお気づきであれば、DMでこっそり教えていただけるとありがたいです。

1行~3行

function Entrynote(){
  const sheet = SpreadsheetApp.getActiveSheet(); // シートを取得
  var lastRow = sheet.getLastRow() // 最終行

この分に関しては、シートとデータが入っている最終行を取得しているところなので特に変更の必要はないです。

5行~13行

for (i=2; i<=lastRow; i++) {
    sheet.getRange(i, 28).setValue(i-1) // 連番
    sheet.getRange(i, 29).setValue("=U" + i + "-T" + i) // 目標pips
    sheet.getRange(i, 30).setValue("=T" + i + "-V" + i)// 最大損失pips    
    sheet.getRange(i, 31).setValue("=T" + i + "+AD" + i) // 1:1
    sheet.getRange(i, 32).setValue("=T" + i + "+AD" + i + "*2")// 1:2
    sheet.getRange(i, 33).setValue("=T" + i + "+AD" + i + "*3") // 1:3
    
  }

ここについてはスペックシートの空いている列にそれぞれの計算式を入れているところです。
例として
sheet.getRange(i, 29).setValue("=U" + i + "-T" + i) // 目標pips
目標pipsを計算するにあたってU列の値(利確ポイント)からT列の値(エントリーレート)を引いた式を29列目に入力する
これを2行目から最後の行まで繰り返すという処理になります。
※何かここで計算したいものがある場合は追加してください。

15行~45行

 const Currencypair  = sheet.getRange(lastRow,2).getValue();// 通貨ペア
  const Four_b_Dow = sheet.getRange(lastRow,5).getValue();// 4時間大きなダウ
  const Four_s_Dow = sheet.getRange(lastRow,6).getValue();// 4時間小さなダウ
  const Four_stf = sheet.getRange(lastRow,7).getValue();// 4時間STF
  const One_b_Dow = sheet.getRange(lastRow,8).getValue();// 1時間大きなダウ
  const One_s_Dow = sheet.getRange(lastRow,9).getValue();// 1時間小さなダウ
  const One_stf = sheet.getRange(lastRow,10).getValue();// 11時間STF
  const Fifteen_b_Dow = sheet.getRange(lastRow,11).getValue();// 15分大きなダウ
  const Fifteen_s_Dow = sheet.getRange(lastRow,12).getValue();// 15分小さなダウ
  const Fifteen_stf = sheet.getRange(lastRow,13).getValue();// 15分STF
  const Entry = sheet.getRange(lastRow,18).getValue();// エントリー方向
  const Entry_date = sheet.getRange(lastRow,19).getValue();// エントリー日時
  const Entry_rate = sheet.getRange(lastRow,20).getValue();// エントリーレート
  const TP_rate = sheet.getRange(lastRow,21).getValue();// 利確ライン
  const LC_rate = sheet.getRange(lastRow,22).getValue();// 最終撤退ライン
  const Entry_lot = sheet.getRange(lastRow,23).getValue();// エントリーロット
  const Cross_Yen = sheet.getRange(lastRow,24).getValue();// クロス円レート
  const Trade_Scenario = sheet.getRange(lastRow,25).getValue();// トレード戦略
  const Number = sheet.getRange(lastRow,28).getValue();// 連番
  const Reward = Math.abs(sheet.getRange(lastRow,29).getValue());// リワード
  const Risk = Math.abs(sheet.getRange(lastRow,30).getValue());// リスク
  const Reward1 = sheet.getRange(lastRow,31).getValue();// 1:1
  const Reward2 = sheet.getRange(lastRow,32).getValue();// 1:2
  const Reward3 = sheet.getRange(lastRow,33).getValue();// 1:3

  const RR = Reward / Risk;//想定するリスクリワード
  const Profit = (Reward * Entry_lot * Cross_Yen) * 10000;//想定する利益
  const Loss = (Risk * Entry_lot * Cross_Yen) * 10000;//最大損失額
  const Profit1 = Loss;//RR1:1 の時の利益額
  const Profit2 = Loss * 2;//RR1:2 の時の利益額
  const Profit3 = Loss * 3;//RR1:3 の時の利益額

スプレッドシートの最終行の各列に入っている値を変数に代入するコードです。
フォームで入力した値がスプレッドシートの最終行に入力されるので最終行を取得することとなります。
40行~45行目に関しては、変数に代入した値を計算して必要なデータを作成しています。

47行~61行

let Scenario =  Currencypair + "  " + Entry +"\n\n" + 
               "エントリーNo " + Number + "\n" +
               "4時間" + " 大ダウ " + Four_b_Dow + " 小ダウ " + Four_s_Dow + " STF " + Four_stf + "\n" + 
               "1時間" + " 大ダウ " + One_b_Dow + " 小ダウ " + One_s_Dow + " STF " + One_stf + "\n" + 
               "15分" + " 大ダウ " + Fifteen_b_Dow + " 小ダウ " + Fifteen_s_Dow + " STF " + Fifteen_stf + "\n" + 
               "トレード戦略" + Trade_Scenario + "\n" + 
               "エントリーレート " + Entry_rate + "\n" + 
               "エントリーロット " + Entry_lot + "\n" + 
               "利確ポイント " + TP_rate + " 想定利益額 " + Profit.toFixed(0) + " 円 " + "\n" + 
               "最終撤退ライン " + LC_rate + " 想定損失額 " + Loss.toFixed(0) + " 円 " + "\n" + 
               "設定したRR " + "1:" + RR.toFixed(2) + "\n" + "\n" +
               "RRによるTP" + "\n" + 
               "1:1 のレート " + Reward1.toFixed(3) + " 想定利益額 " + Profit1.toFixed(0) + " 円 " + "\n" + 
               "1:2 のレート " + Reward2.toFixed(3) + " 想定利益額 " + Profit2.toFixed(0) + " 円 " + "\n" +  
               "1:3 のレート " + Reward3.toFixed(3) + " 想定利益額 " + Profit3.toFixed(0) + " 円 " + "\n";

ここに関してはカレンダーの詳細の部分に入力されるデータを作成しているところです。
上で代入した変数と文字列を組み合わせて、最終的に入力されるデータを作ります。
文字列同氏の結合は ”+” で、改行は ”\n" で表します。
個々の内容を自分の好きな情報にカスタマイズして使ってみてください。

62行~70行

 // カレンダーオブジェクトを取得(トレード記録)
  let Calendar = CalendarApp.getCalendarById("カレンダーID");
  // カレンダーのタイムゾーンを"Asia/Tokyo"に変更する
  Calendar.setTimeZone("Asia/Tokyo");
  // カレンダーに日程を追加
   Calendar.createEvent("【" + Number + "】" + Currencypair + " " + Entry,new Date(Entry_date),new Date(Entry_date),{description: Scenario});

}

これで最後です。
ここでは、カレンダーに実際に入力する操作です。
準備したカレンダーIDを入力することで、
エントリー日時に入力した時間に予定として入力されます。
以上です。
お疲れ様でした。

最後に

この記事をお読みいただきありがとうございました。
素人が作ったコードなので、変なところと説明不足なところあると思いますが、何かお気づきの点がございましたらDMでもコメントでもいただけるとありがたいです。
何かご不明な点があってわたしで相談に乗れることであればどしどし質問いただけると私も勉強になるのでよろしくお願いします。

次回予告

最終回は決済データをカレンダーに入力する方法を記事にします。
エントリーのデータを決済データに読み込んだりとだいぶ処理が複雑でかなり苦労しましたが、何とか出来たのでやり方を忘れないうちに記事にしたいと思います。

この記事が気に入ったらサポートをしてみませんか?