XML読み書き
ELオブジェクトホームスタディコースを見て作ってみました
例題23のイメージだと最初にファイル読んで最後に書き込みだと思いますが、途中でも毎回更新するようにしちゃってますw
色々応用も効くのでちょっとしたメモリー代わりに読み書きするのには便利じゃないかと思います
XMLオブジェクト
ELは、XMLデータストラクチャーの作成、ファイルへの保存、ファイルからの読み取りを行う一連のオブジェクトをサポートしています
ELのXMLオブジェクトは、ノード、要素、属性、その他XMLデータの階層に関連するアイテムを含む、一般的に使用されているXMLドキュメントオブジェクトモデルをベースにしています
※ 詳しくはオブジェクトホームスタディコース127P以降とヘルプのXML関連のところを参照してください
XML(Extensible Markup Language)
開始タグと終了タグを使ってデータを階層構造化
ホームページ等のHTMLは指定タグで表示するが、
XMLは自由タグでデータが何であるかを定義する
例 <銘柄コード>9999</銘柄コード>
XMLファイル - XMLドキュメント - ルート(必ず1つ)その下に要素ノードとテキストノード
先程の例だと銘柄コードが要素ノードで9999がテキストノード
プログラム
{ -------------------------------------------------- }
//このプログラムのXMLデータ構造
{ -------------------------------------------------- }
{ "XXXX.xml" ( file )
XMLdoc ( Document )
"XMLdata" ( root ) 宣言はルートもXmlElementとして定義するみたい
"symbol" ( Element1 )
"code" ( Element2 )
"date" ( Element2 )
"open" ( Element2 )
"low" ( Element2 )
"high" ( Element2 )
"close" ( Element2 )
"volume" ( Element2 ) }
{ -------------------------------------------------- }
//宣言処理
{ -------------------------------------------------- } //クラス宣言
using elsystem; //tsdataクラスによって使用される基本クラスと、その他一般的なelsystemクラス
using elsystem.xml; //XMLファイル内のデータ管理に使用される基本クラス
vars: { 変数宣言 }
XmlDocument XMLdoc( null ), //XMLドキュメント
XmlElement XMLroot( null ), //XMLルート
XmlElement XMLelm1( null ), //XML要素階層1
XmlElement XMLelm2( null ), //XML要素階層2
XMLNodeList XMLnList( null ), //XMLノードリスト
XmlNode XMLeNode( null ), //XML要素ノード
bool filefound( false ); //XMLファイル存在確認用 false:有 true:無
input: { 入力変数宣言 }
string xmlFileName("C:\Program Files (x86)\TradeStation 9.5\japan-all-stock-financial-XXXX.xml"); //任意の場所、ファイル名でOK
{ -------------------------------------------------- }
//初期処理 ※ 検証する時に、プロパティでイニシャライズイベントに設定
{ -------------------------------------------------- }
method void AnalysisTechnique_Initialized( elsystem.Object sender, elsystem.InitializedEventArgs args ) {インジケータ適用時、トレステ開始時}
begin
XMLdoc = new xmldocument; //クラスの新規インスタンスを初期化
//ファイル存在確認
filefound = false; //XMLファイル存在確認初期設定 false:有 true:無
try
XMLdoc.Load( xmlFileName ); //XMLファイル読み込み
catch( elsystem.io.filenotfoundexception ex )
filefound = true; //ファイルが見つからない場合 true
end;
//ファイルがない場合作成
if filefound = true then begin
Condition1 = true; //ファイル存在無: true
XMLroot = XMLdoc.CreateElement( "XMLdata" ); //rootにXMLdata要素を作成
XMLdoc.AppendChild( XMLroot ); //Documentにrootを追加
SaveXML(); //XMLファイル書き込み処理
end else begin
Condition1 = false; //ファイル存在有: false
XMLroot = XMLdoc.DocumentElement; //XMLドキュメントのルート要素を取得
end;
end;
{ -------------------------------------------------- }
//終了処理 ※ 検証する時に、プロパティでアンイニシャライズイベントに設定
{ -------------------------------------------------- }
method void AnalysisTechnique_UnInitialized( elsystem.Object sender,elsystem.UnInitializedEventArgs args ) {インジケータ更新・削除時、トレステ終了時}
vars:
int counter; //XMLファイルデータ作成管理用
begin
XMLnList = XMLroot.GetElementsByTagName( "symbol" ); //指定要素名 symbol と一致する全ての子孫要素リストを含むXMLノードリストを返します
Condition1 = false; //symbol存在有: false
for counter = 0 to XMLnList.count - 1 begin
if XMLnList.ItemOf[counter].Item["code"].innertext = symbol then begin //存在有りの時XMLファイル更新
SaveXML(); //XMLファイル書き込み処理
end;
end;
end;
{ -------------------------------------------------- }
//XMLファイル読み込み処理
{ -------------------------------------------------- }
method void ReadXML()
vars:
int counter, //XMLファイルデータ作成管理用
int number; //XMLファイルデータ作成管理用
begin
XMLnList = XMLroot.GetElementsByTagName( "symbol" ); //指定要素名 symbol と一致する全ての子孫要素リストを含むXMLノードリストを返します
//symbol存在確認
number = - 1; //要素№初期設定
for counter = 0 to XMLnList.count - 1 begin
if XMLnList.ItemOf[counter].Item["code"].innertext = symbol then number = counter; //存在有りの時要素№セット
end;
if number = - 1 then begin
Condition1 = true; //symbol存在無: true
XMLeNode = XMLelm1; //ノードにシンボル代入
end else begin
Condition1 = false; //symbol存在有: false
XMLeNode = XMLnList.ItemOf[number]; //ノードリストの要素№セット
end;
SaveXML(); //XMLファイル書き込み処理
end;
{ -------------------------------------------------- }
//XMLファイル書き込み処理
{ -------------------------------------------------- }
method void SaveXML()
begin
//<symbol>
XMLelm1 = XMLdoc.CreateElement( "symbol" );
//<code>
XMLelm2 = XMLdoc.CreateElement( "code" );
XMLelm2.innertext = symbol;
if Condition1 then begin //存在無しの時追加
XMLelm1.AppendChild( XMLelm2 );
//<datetime>
XMLelm2 = XMLdoc.CreateElement( "datetime" );
XMLelm2.innertext = " ";
XMLelm1.AppendChild( XMLelm2 );
//<open>
XMLelm2 = XMLdoc.CreateElement( "open" );
XMLelm2.innertext = " ";
XMLelm1.AppendChild( XMLelm2 );
//<low>
XMLelm2 = XMLdoc.CreateElement( "low" );
XMLelm2.innertext = " ";
XMLelm1.AppendChild( XMLelm2 );
//<high>
XMLelm2 = XMLdoc.CreateElement( "high" );
XMLelm2.innertext = " ";
XMLelm1.AppendChild( XMLelm2 );
//<close>
XMLelm2 = XMLdoc.CreateElement( "close" );
XMLelm2.innertext = " ";
XMLelm1.AppendChild( XMLelm2 );
//<volume>
XMLelm2 = XMLdoc.CreateElement( "volume" );
XMLelm2.innertext = " ";
XMLelm1.AppendChild( XMLelm2 );
//</symbol>
XMLroot.AppendChild( XMLelm1 );
end else begin //存在有りの時更新
//<datetime>
XMLeNode.Item["datetime"].InnerText = Datetime.Now.Format( "%Y/%m/%d %H:%M:%S" );
//<open><low><high><close><volume>
XMLeNode.Item["open"].InnerText = open.ToString();
XMLeNode.Item["low"].InnerText = low.ToString();
XMLeNode.Item["high"].InnerText = high.ToString();
XMLeNode.Item["close"].InnerText = close.ToString();
XMLeNode.Item["volume"].InnerText = volume.ToString();
end;
XMLdoc.Save( xmlFileName ); //XMLファイル書き込み
end;
{ -------------------------------------------------- }
//XMLファイル表示処理
{ -------------------------------------------------- }
Method void PlotValues()
begin
ReadXML(); //XMLファイル読み込み処理
if Condition1 = false then begin //symbol存在有: false
plot1( XMLeNode.Item["code"].Innertext,"Symbol" );
plot2( XMLeNode.Item["datetime"].Innertext,"DateTime" );
plot3( int.Parse( XMLeNode.Item["open"].Innertext ),"open" );
plot4( int.Parse( XMLeNode.Item["low"].Innertext ),"low" );
plot5( int.Parse( XMLeNode.Item["high"].Innertext ),"high" );
plot6( int.Parse( XMLeNode.Item["close"].Innertext ),"close" );
plot7( int.Parse( XMLeNode.Item["volume"].Innertext ),"volume" );
end;
end;
{ -------------------------------------------------- }
PlotValues(); //表示処理
サポートされると喜んでアイスを買っちゃいます!٩(๑❛ᴗ❛๑)۶