見出し画像

CSV読み書き

読み込み

フォーラムを見て参考になったので外部データ(CSV)からデータを取り込むインジケータを作成しました、殆どココアさんのコピペですがw
色々汎用性があると思います 参照トレステフォーラム 99, 117
まずこもりばんさんの所からCSVファイルを有難くDLして必要なデータに加工します(現在は有料会員登録必要かも)
https://hesonogoma.com/stocks/japan-all-stock-prices.html
トレステ側とCSVファイル側ではエンコードが違うので文字化けしてしまいます
タブ区切りやスペース区切りでの読込みも分からなかったので今回はカンマ区切りでエンコードします
プログラムの方でエンコード出来るかも知れませんがこれもやり方が分かりませんでした!(๑>؂•̀๑)テヘペロ

・エンコード手順

エクセルで開き、ファイル-名前をつけて保存-CSV(カンマ区切り)-ツール-Webオプション-エンコード-Unicode(UTF-8)で保存
又はメモ帳で開き、ファイル-名前をつけて保存-文字コードをUnicodeかUTF-8で保存(どちらでも可)

コードと必要な項目で全銘柄のCSVファイルを2つ分けて作り、有利子負債と優待内容のインジケータを作ってみました

1つのCSVファイルで複数の項目でもOKです
全銘柄に全項目埋まっていないと読み込む時エラーになる時があります
CSVで読み込んだ値は文字型になるので、数値型に変換する場合はプログラム内でParseを使用して変換します
エクセル側でVLOOKUPしたり、コード順にトレステ側とエクセル側を合わせるといった作業もいらないのでとても楽です
※ エクセルでもコードが合致したらとか件数何件という処理を加えればソートなどのメンテも不要ですがそれなりのコーディングが必要です
頻繁に内容が変わらない項目や銘柄増減以外なら更新頻度それほど必要ないのでメンテも楽です

プログラム

using elsystem;
using elsystem.io;
using tsdata.common;
 
inputs:															//任意の場所、ファイル名でOK
	FileName("C:\Program Files (x86)\TradeStation 9.5\MyWork\japan-all-stock-financial-results.csv");
 
variables:
	string MyCode( "" ),
	double MyValue( 0 ),
	string Code4( "" ),
	StreamReader SR( NULL ),									//ファイルから文字を読取るクラスを実装、書き込み例については「StreamWriter」を参照
	TokenList TL( NULL );										//フィールド名のリスト(トークンリスト)に基づいてコレクションを作成する基本クラス

once begin
	try SR = StreamReader.create(FileName);						//例外の発生をテストする為に使用(読取るファイルの完全パスを指定して新規インスタンスを初期化)
	catch (FileNotFoundException ex)							//指定された例外に対応して、追加コードを実行するために使用
	throw ex.create( "ファイルが見つかりません");						//イベントログに表示される例外のインスタンスを作成するために使用
	end;{ try }
	Code4 = symbol.Substring(0,4);								//エクセル側が4桁コードなのでシンボルコードから4桁だけ抜き出す
end;{ once }
 
while Code4 <> MyCode and SR.EndOfStream = false begin			//現在のファイル位置がファイルの末尾かどうかを示す値を取得
	TL = TokenList.Create( SR.ReadLine());						//クラスの新規インスタンスを指定名に対して初期化(ファイルから文字の行を読取り)
	if TL[0] = Code4 then begin
		MyCode = TL[0];
		if TL[1] <> "-" then MyValue = Double.Parse( TL[1] );	//CSVで読み込んだ値はstring型になるので、数値のDouble型に変換
		Plot1( MyValue, !("有利子負債") );						//ハイフンを数値に変えるとエラー表示になるので除外
	end;
end;{ while }

SR.Close();														//StreamReaderオブジェクトを閉じ、リーダーに関連付けられたシステムリソースを解放

書き込み

書き込みのプログラムは、個人的に今のところ必要性がないので作成していませんが、StreamReaderをStreamWriterに変えて基本的に読み込みの逆をやればいいだけだと思っています、詳しくはヘルプを参照して下さい

タイミング的には以下な感じですかね
・書込みたい項目が更新された時
・タイマーで定期的
・時間や数値が達した時
・インジケータやトレステを終了する時
・書き出すボタンを作って押した時

作成する必要性が出て来たらここに追記します

サポートされると喜んでアイスを買っちゃいます!٩(๑❛ᴗ❛๑)۶