見出し画像

※不具合あり注意!※【TradingView】バックテストレポートをcsvでダウンロードしたい!

========== お知らせ ==========
最近投げ銭していただいた方から動作しないと報告をいただきました。
当方で確認したところTradingViewにて外部jsが読み込めないようにセキュリティポリシーが変わったと思われます。chromeだけなのかわかりません。現状だと解決方法がわからないので、解決できたら情報を上げていきたいと思います!動作もしないので、有料記事購入はしないでください。
ここに記載されている情報は過去資料として、このままにします。
========================

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

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

画像1

自分の場合、モニタサイズが小さいので一度に表示されるトレード結果が数行というのもあり、テスト結果毎の一覧を比較するのが面倒です。
最初は結果をコピペしてみたのですが、とても面倒でした。そこでトレード一覧をスクレイピングして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をコピペ

画像2

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

画像3

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

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

画像4

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

画像5

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

画像6

画像7

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

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出力結果を変更したものを公開(有料)
2020年2月1日      有料版の修正
2020年3月23日 1行目が改行されてないのを修正
2021年3月14日 chromeにて動作しないことが判明、対処法探しの旅へ…

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

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

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

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

画像8

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

画像9

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

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

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

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

ここから先は

7,769字

¥ 200

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