やってることー
1)xmlからsymbolを読み込み、TokenList mySymbolTokenList に格納する
2)mySymbolTokenListを使って、
a)QuotesProviderをインスタンス生成しupdateイベントハンドラをセットする
b)GridDataViewに必要分のGridDataViewRowを生成する
c)symbolと、生成したGridDataViewRowを格納したDictionary SymbolRowDictionaryを生成する
3)前述(2)で生成したQuotesProviderのupdateイベントのハンドラにおいて更新されたsymbolとSymbolRowDictionaryを紐付けて
GridDataViewRowのセル内容を更新する
{
updates
//2019/3/15
ListView1の更新データを0行目にinsertRowするように変更
}
using elsystem; //datetime
using tsdata.common; //TokenList
using tsdata.marketdata;//QuotesProvider
using elsystem.xml; //xml
using elsystem.collections; //Vector;
using elsystem.windows.forms; //form
//const
const:
//Dropboxディレクトリにあるxmlファイルを開く
string FILE_URL("E:\チーム Dropbox\kamo tsuyoshi\TradeStation\project_0314\sourceSymbol.xml");
//var
var:TokenList mySymbolTokenList(null);
var:Vector QuotesProvidersVector(null);
var:Dictionary SymbolRowDictionary(null);
var:Dictionary SymbolQuotesProviderDictionary(null);
method void AT_initialized( elsystem.Object sender, elsystem.InitializedEventArgs args )
begin
//--------------------------------
//環境セットアップ
//--------------------------------
//Dictionaryインスタンス生成
SymbolRowDictionary = Dictionary.Create();
SymbolQuotesProviderDictionary = Dictionary.create();
//Vectorインスタンス生成
QuotesProvidersVector = Vector.Create();
//mySymbolTokenListを指定のxmlファイルから生成し、TokenList mySymbolTokenListに格納
//**関数からの戻り値はobjectを戻せない、stringで受取ってからTokenListを作る。二度手間
mySymbolTokenList = TokenList.create($getStringFromXML(FILE_URL));
//GUI作成のformを表示する
form1.show();
//formをセットアップ
fillListView();
fillGrid();
createQuotesProvider();
end;
//--------------------------------------------
// provider 初期化
//--------------------------------------------
method void createQuotesProvider()
var:TokenList list ,QuotesProvider QP , int n;
begin
list = TokenList.Create();
list.add("SymbolRoot");
list.Add("vwap");
list.Add("description");
list.Add("Ask");
list.Add("Bid");
list.add("asksize");
list.Add("bidsize");
list.Add("PreviousClose");
list.Add("last");
list.add("ExchangeListed"); //銘柄が上場している取引所
for n=0 to mySymbolTokenList.Count-1 begin
QP = new QuotesProvider;
QuotesProvidersVector.push_back(QP); //インスタンスを動的配列にセットしておく
QP.Fields = list;
QP.Updated += QP_updated;
QP.Symbol = mySymbolTokenList[n];
QP.LoadProvider();
end;
end;
method void fillListView()
var:ListViewItem lvItem , ListViewItem newItem , int n;
begin
ListView1.AddColumns("symbol");
ListView1.AddColumns("銘柄名");
ListView1.AddColumns("ASK");
ListView1.AddColumns("Bid");
ListView1.AddColumns("AskSize");
ListView1.AddColumns("BidSize");
ListView1.AddColumns("市場");
end;
method void fillGrid()
var:DataGridViewColumn col , DataGridViewRow myRow, int n ;
begin
// add a string column
col = DataGridViewColumn.Create("symbol");
DataGridView1.columns.Add(col);
col = dataGridViewColumn.Create("銘柄");
DataGridView1.Columns.Add(col);
col = dataGridViewColumn.Create("終値");
DataGridView1.Columns.Add(col);
col = dataGridViewColumn.Create("前日終値");
DataGridView1.Columns.Add(col);
col = dataGridViewColumn.Create("前日比");
DataGridView1.Columns.Add(col);
//add row
for n = 0 to mySymbolTokenList.Count-1 begin
myRow = datagridviewrow.Create("");
DataGridView1.Rows.Add(myRow);
myRow.Cells[0].Value = mySymbolTokenList[n];
setDictionaryObj(mySymbolTokenList[n] ,myRow);
end;
end;
//---------------------------------------
//symbolをkeyにしたDictionaryに値としてdataGridViewRowをセットする
//---------------------------------------
method void setDictionaryObj(string strSymbol , DataGridViewRow row)
var: string strSymbolRoot;
begin
//===========!!!!重要!!!!=========
//updateイベントで取得できるsymbolRootが4桁の文字データなのでそれに合わせて、4桁部分のみ切り取って格納する
//例:"8798-TS" ==> "8798" で格納。そのため、leftstr()を使う。
strSymbolRoot = leftStr(strSymbol , 4);
if SymbolRowDictionary.Contains(strSymbolRoot) = false then begin
SymbolRowDictionary.add(strSymbolRoot , row); //Dictionary.add("keyname",初期値)
end;
end;
//---------------------------------------
//symbolをkeyにしたDictionaryからvalueであるDataGridViewRowを取得しうりう
//---------------------------------------
method DataGridViewRow getDataGridViewRowFromDictionary(string strSymbolRoot)
var : DataGridViewRow row;
begin
if SymbolRowDictionary.Contains(strSymbolRoot)=false then begin
row = null;
end else begin
row = SymbolRowDictionary.Items[strSymbolRoot] astype DataGridViewRow;
end;
return row;
end;
method void QP_updated( elsystem.Object sender, tsdata.marketdata.QuoteUpdatedEventArgs args )
begin
updateRow(sender);
updateDataList(sender);
end;
method void updateRow(elsystem.object sender)
var:QuotesProvider objQP ,DataGridViewRow row ,string strsymbolRoot, double zenjituhi;
begin
objQP = sender astype QuotesProvider;
strsymbolRoot = objQP.Quote["symbolRoot"].stringvalue;
//DataGridの値を更新する、この方法が一番効率的で簡単
row = getDataGridViewRowFromDictionary(strsymbolRoot);
row.SetCell(1,objQP.Quote["description"].stringvalue);
row.SetCell(2,numtostr(objQP.Quote["last"].doublevalue , 0)); //小数点以下を指定できるのでtoString()ではなくnumtostrを使う
row.SetCell(3,numtostr(objQP.Quote["PreviousClose"].doublevalue , 0));
zenjituhi = (objQP.Quote["last"].doublevalue / objQP.Quote["PreviousClose"].doublevalue) * 100;
row.SetCell(4,numtostr(zenjituhi,3));
end;
method void updateDataList(elsystem.Object sender)
var:string strsymbolRoot , ListViewItem newItem , QuotesProvider objQP ;
begin
objQP = sender astype QuotesProvider;
strsymbolRoot = objQP.Quote["symbolRoot"].stringvalue;
//listItemを作成する
newItem = ListViewItem.Create(strsymbolRoot);
newItem.AddColumns(objQP.Quote["description"].stringvalue);
newItem.AddColumns(objQP.Quote["ASK"].doublevalue);
newItem.AddColumns(objQP.Quote["BID"].doublevalue);
newItem.AddColumns(objQP.Quote["asksize"].integervalue);
newItem.AddColumns(objQP.Quote["bidsize"].integervalue);
newItem.AddColumns(objQP.Quote["ExchangeListed"].stringvalue);
//ListView1.addRow(newItem);
ListView1.InsertRow(0,newItem.SubItems[0],newItem.SubItems[1],newItem.SubItems[2],newItem.SubItems[3],newItem.SubItems[4],newItem.SubItems[5],newItem.SubItems[6]);
end;