見出し画像

【TradingView】バックテストレポートをcsvでダウンロードしたい!

New!! CSV出力結果を変更したものを有料にて配布します!
詳しくは下部参照。ぜひおやつ代をください!w

タイトル通りですが、TradingViewでバックテストした時にトレード一覧をCSVでダウンロードしたいと思います!

※内臓のMACD Strategyを利用しました。

自分の場合、モニタサイズが小さいので一度に表示されるトレード結果が数行というのもあり、テスト結果毎の一覧を比較するのが面倒です。
最初は結果をコピペしてみたのですが、とても面倒でした。そこでトレード一覧をスクレイピングしてcsvにすれば比較もしやすい!かな。そんなに使わないかもしれない。
適当ですが下記のJavaScriptを組んでみました。Google検索で見つけたサンプル組み合わせて作ったのでコードが汚いのはごめんなさい。

動作としては
①トレード一覧の表示されている高さと全体の高さを取得
②高さを元にスクロールしていき、表示されている一覧をスクレイピング
③結果をcsvファイルでダウンロード
です!どこかに情報を送ったりするようなコードは組み込んでいません。

利用方法はブックマークレットとしてお気に入りに追加し、トレード一覧が表示されている状態でお気に入りをクリックです!

★注意事項
※トレード一覧が多いとcsvダウンロードまで結構待ちます。
※結果がずれるときはトレード一覧は一番上が表示されている状態で実行してください。
※IEとGoogleChromeで動作確認済み。

★登録するURL

javascript:void((function(f){if(window.jQuery&&jQuery().jquery>'1.8'){f(jQuery)}else{var script=document.createElement('script');script.src='//cdnjs.cloudflare.com/ajax/libs/jquery/2.2.1/jquery.min.js';script.onload=function(){var $=jQuery.noConflict(true);f($)};document.body.appendChild(script)}})(function($,undefined){var tableheight=$('.trades').height();var reportheight=$('.report-data').height();var val="";var data=[];var loopcnt=Math.ceil(reportheight/tableheight);new Promise(function(res,rej){function loop(i){return new Promise(function(resolve,reject){setTimeout(function(){$(".trades").animate({scrollTop:(tableheight*i)},100,'swing')},100);setTimeout(function(){var txt="";var tr=$(".report-data table tr");for(var a=0,l=tr.length;a<l;a++){var cells=tr.eq(a).children();for(var b=0,m=cells.length;b<m;b++){if(typeof data[a]=="undefined")data[a]=[];txt=cells.eq(b).text().replace(/\s/g," ");txt=txt.replace(/ショートを決済/g,",ショートを決済");txt=txt.replace(/ロングを決済/g,",ロングを決済");data[a][b]=txt}if(val.indexOf(data[a])==-1){val=val+data[a]+'\n'}}resolve(i+1)},300)}).then(function(count){if(count>loopcnt){res()}else{loop(count)}})}loop(0)}).then(function(){var bom=new Uint8Array([0xEF,0xBB,0xBF]);var blob=new Blob([bom,val],{type:"text/csv"});if(window.navigator.msSaveBlob){window.navigator.msSaveBlob(blob,"tradeview_report.csv")}else{var a=document.createElement("a");a.href=URL.createObjectURL(blob);a.target='_blank';a.download='tradeview_report.csv';a.click()}})}));

使い方がわからない方は利用手順を参考にしてください。

■利用手順(GoogleChromeの場合)
ブックマークマネージャを開いて「新しいブックマークを追加」を行います。下図の画面が出るので、
「名前」:適当
「URL」:★登録するURLをコピペ

自分の場合はブックマークバーに追加しました。

下図のようにトレード一覧が表示されている状態で登録したお気に入り「tv2csv」をクリックします。

※トレード一覧は一番上が表示されている状態のほうがいいです!

実行中はトレード一覧が勝手にスクロールしますが、正常動作です。
スクロールしながら画面に表示された一覧をスクレイピングしています。
スクレイピングが終了したらcsvファイルがダウンロードされます。

ダウンロードされたcsvを開きます。※画面はLibreOfficeになります。

以上!
よろしければ使ってみてください😊

JavaScriptソースを見やすく整理したものです。

javascript: void((function (f) {
	if (window.jQuery && jQuery().jquery > '1.8') {
		f(jQuery)
	} else {
		var script = document.createElement('script');
		script.src = '//cdnjs.cloudflare.com/ajax/libs/jquery/2.2.1/jquery.min.js';
		script.onload = function () {
			var $ = jQuery.noConflict(true);
			f($)
		};
		document.body.appendChild(script)
	}
})(function ($, undefined) {
	var tableheight = $('.trades').height();
	var reportheight = $('.report-data').height();
	var val = "";
	var data = [];
	var loopcnt = Math.ceil(reportheight / tableheight);
	new Promise(function (res, rej) {
		function loop(i) {
			return new Promise(function (resolve, reject) {
				setTimeout(function () {
					$(".trades").animate({
						scrollTop: (tableheight * i)
					}, 100, 'swing')
				}, 100);
				setTimeout(function () {
					var txt = "";
					var tr = $(".report-data table tr");
					for (var a = 0, l = tr.length; a < l; a++) {
						var cells = tr.eq(a).children();
						for (var b = 0, m = cells.length; b < m; b++) {
							if (typeof data[a] == "undefined") data[a] = [];
							txt = cells.eq(b).text().replace(/\s/g, " ");
							txt = txt.replace(/ショートを決済/g, ",ショートを決済");
							txt = txt.replace(/ロングを決済/g, ",ロングを決済");
							data[a][b] = txt
						}
						if (val.indexOf(data[a]) == -1) {
							val = val + data[a] + '\n'
						}
					}
					resolve(i + 1)
				}, 300)
			}).then(function (count) {
				if (count > loopcnt) {
					res()
				} else {
					loop(count)
				}
			})
		}
		loop(0)
	}).then(function () {
		var bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
		var blob = new Blob([bom, val], {
			type: "text/csv"
		});
		if (window.navigator.msSaveBlob) {
			window.navigator.msSaveBlob(blob, "tradeview_report.csv")
		} else {
			var a = document.createElement("a");
			a.href = URL.createObjectURL(blob);
			a.target = '_blank';
			a.download = 'tradeview_report.csv';
			a.click()
		}
	})
}));

■FAQ
〇結果が1~と並んでない
 スクレイピングするときにスクロール動作が間に合ってないのかもしれません。スクレイピングまでの待機時間を延ばせば大丈夫だと思います。「}, 300)」の部分(57行目)の300を1000とかにするとできるかも?変更するとcsvダウンロードまでの待ち時間が伸びます。

■更新
2018年5月23日 公開
2018年5月24日 CSV出力結果を変更したものを公開(有料)

==== CSV出力修正バージョン ====

先日公開したcsvは、TradingViewの画面をそのままcsv出力することができるだけでした。どうせならトレード結果を1行にして見やすいcsvにしたいと思い修正バージョンを作成しました。出力結果ぐらい自分で直すよ!という方は無料版でも問題ないかと思います。ついでにバグ修正もしています。

■CSV項目一覧
トレード#
オープンタイプ
オープンシグナル
オープン日付/時間
オープン価格
クローズタイプ
クローズシグナル
クローズ日付/時間
クローズ価格
先物契約
利益 ※赤字はマイナス表記にしました。
利益率(%) ※赤字はマイナス表記にしました。
総利益 ※利益を積み上げた結果となります。

上記項目で出力したcsvが下図になります。

■無料版のバグ
①下図のようなまったく同じ行がある場合にcsv出力がはじめの1行しか出力されない結果となります。

上記のトレード結果ですが、自分が組んでいるPineスクリプトでは余り発生しないですね。皆さんはどうでしょうか?

②大量のトレードをスクレイピングしようとすると、まれに取得されない行があります。これにはスクロール処理が終わったことを確認する処理を追加するのも考えましたが面倒なので、待ち時間などを最適化することにしました。最適化後ですが、807トレードを取得するのに77429msかかります。
たしか、TradingViewのバックテストでの売買回数制限が2000回だったかな。多分大丈夫じゃないかな!?正直パソコンの負荷状況も影響するので、失敗するときだってあるさ!と思っていただきたいです。

■有料内容
・ブックマークレット用のコード
・上記コードを整形したもの
・修正可能なバグが見つかったら有料部分にて修正版を公開
の3点になります。

<note購入前の注意点>
・本note(有料部分)に掲載されているソースコードについて、いかなる形でも二次配布をお断りいたします。
・本noteで紹介しているソースコードはテストはしておりますが、利用環境の都合で予期せぬトラブルが発生する可能性がございます。当方では動作補償は一切いたしませんのでご了承ください。
・本記事に掲載されている内容の利用は自己責任でお願いします。

この続きをみるには

この続き:7,041文字

【TradingView】バックテストレポートをcsvでダウンロードしたい!

自宅のミサワ

200円

この記事が気に入ったら、サポートをしてみませんか?気軽にクリエイターを支援できます。

35
自堕落な生活中

この記事が入っているマガジン

コメント2件

TwitterでDMしたのですが、Google Spreadsheet への対応は難しいでしょうか?
感動しました。素晴らしい。おやつ代押しましたorz
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。