外貨exの約定履歴(csvファイル)を自動集計するマクロを作った(Google Apps Script)
外貨exの約定履歴(csvファイル)をGASで自動集計するようにしました。これを実行するとGoogleスプレッドシート上にデータが整理されグラフ描画まで行います。以下に手順を示しますが最後にソースコードを掲載しています。
外貨exから約定履歴をダウンロードする
まず、外貨exのアカウントページから約定履歴をダウンロードしましょう。左サイドメニューから約定履歴をクリックして必要な期間を選択するとcsvファイルをダウンロードすることができます。
こちらが約定履歴のcsvファイルです。この状態では集計に適していないのでGASでまとめ直します。あらかじめGoogleスプレッドシートにインポートしておきましょう。
スプレッドシート上でマクロ実行
実行すると以下のように損益が明確になります。更にグラフを自動で生成してくれます。
ソースコード
ソースコードはこちら。convertTradeHistory関数を実行すると上記のようになります。
function convertTradeHistory() { const mainSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Main'); const dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('trade_history'); //前のデータクリア mainSheet.getRange("A6:H10000").clearContent(); //trade_historyデータ取得 var data = dataSheet.getRange("A2:L"+dataSheet.getLastRow()).getValues(); data = data.reverse(); var r=6; var total=0; data.forEach(function(elements){ if(elements[8]!=''){ mainSheet.getRange(r,1).setValue(elements[7]); //約定日 mainSheet.getRange(r,2).setValue(elements[2]); //通貨ペア mainSheet.getRange(r,3).setValue(elements[3]); //売買 mainSheet.getRange(r,4).setValue(elements[9]); //新規価格 mainSheet.getRange(r,5).setValue(elements[4]); //約定価格 mainSheet.getRange(r,6).setValue(elements[5]); //注文数量 mainSheet.getRange(r,7).setValue(elements[10]); //売買損益 total += Number(elements[10]); mainSheet.getRange(r,8).setValue(total); //損益累計 <pre><code> r++; } </code></pre> }); //グラフの縦軸の上限・下限・目盛り数を計算 var gdata = mainSheet.getRange("H6:H"+mainSheet.getLastRow()).getValues(); var max = Math.max.apply(null,gdata); var min = Math.min.apply(null,gdata); var keta = Math.abs(max).toString().length; if(Math.abs(min).toString().length > keta) keta = Math.abs(min).toString().length; var order = Math.pow(10, (keta-1)); var axis_max = Math.ceil(max / order)<em>order; //グラフ縦軸のMAX var axis_mix = Math.floor(min / order)</em>order; //グラフ縦軸のMIX var span = order / 10 * 5; var axis_count = (axis_max-axis_mix) / span + 1; //グラフ描画 createChart(axis_max, axis_mix, axis_count); } function createChart(axis_max, axis_mix, axis_count) { var spreadsheet = SpreadsheetApp.getActive(); var sheet = spreadsheet.getActiveSheet(); var charts = sheet.getCharts(); chart = charts[0]; if(chart!=undefined) sheet.removeChart(chart);<br /> chart = sheet.newChart() .asLineChart() .addRange(spreadsheet.getRange('H6:H263')) .setMergeStrategy(Charts.ChartMergeStrategy.MERGE_COLUMNS) .setTransposeRowsAndColumns(false) .setNumHeaders(-1) .setHiddenDimensionStrategy(Charts.ChartHiddenDimensionStrategy.IGNORE_BOTH) .setOption('bubble.stroke', '#000000') .setOption('legend.position', 'none') .setOption('annotations.domain.textStyle.color', '#808080') .setOption('textStyle.color', '#000000') .setOption('legend.textStyle.color', '#1a1a1a') .setOption('titleTextStyle.color', '#757575') .setOption('annotations.total.textStyle.color', '#808080') .setOption('hAxis.textStyle.color', '#000000') .setOption('vAxes.0.textStyle.fontSize', 18) .setOption('vAxes.0.textStyle.color', '#000000') .setOption('series.0.pointSize', 7) .setOption('series.0.lineWidth', 2) .setRange(axis_max, axis_mix) //グラフのレンジ(min, max) .setOption('vAxis.gridlines.count', axis_count) //目盛数 .setOption('height', 558) .setOption('width', 902) .setPosition(4, 9, 25, 17) .build(); sheet.insertChart(chart); }
スポンサーリンク