SymbolWatch
チャート上に他の通貨ペアのBidとAskをリアルタイムで表示するインジケーターを作りました。作っておいてなんですが、実用性は微妙かもしれません。
あえていうならチャート画面でトレードしながら他通貨ペアのプライスの動きだけ確認したい場合には役立つかも・・・そんなケースあるか知りませんが。
どちらかというと、シンボル毎にリアルタイムな情報を表示するためのサンプルコードとしてお役立てください。
BidとAskではなくて、各時間足毎に判定したトレンドの向きとか表示させるように改良するといい感じに役立つツールになるかもしれません。MT4だとそんなツールよく見ますよね。
機能概要
指定したウォッチリストにあるシンボルのbidとaskをチャート上に表示させます。それだけです。
パラメータ
WatchListName
ウォッチリストの名前を指定します。指定しなければ先頭のウォッチリストを読み込みます。
ダウンロード
ソースコード付きです。ぜひ改良して使えるツールにしてあげてください。そして気が向いたら配布してください。
ソースコード部分解説
WatchListを使ってみた
何に使うのかイマイチ想像がつかなかったWatchListの使い道を思いつきました。ユーザーにいくつかシンボル名を指定してもらうときのパラメータ代わりに使うといいかもしれません。WatchList上の通貨ペアの追加情報をチャートに表示させるツールみたいなのも、もしかしたら需要あるかもしれませんね。
なんにせよ一覧に表示するSymbolを指定してもらう必要があるときにWatchListが使えます。Parameterで文字列で指定してもらってもいいですが、一つ一つ指定するのも面倒ですし、指定時に名前を間違えられると目的のSymbolをうまく取得できません。
しかし専用のWatchListを作ってもらって、そのWatchList名をパラメータに渡してもらう、とすればシンボル名の齟齬もなく読み込むことができます。
// --- 指定されたウォッチリストを取得、なければ先頭を使う、それもなければ例外投げる
var watchList = Watchlists.FirstOrDefault(w => w.Name == WatchListName) ?? Watchlists.FirstOrDefault();
if (watchList == null) throw new ArgumentException();
今回のコードでは指定されたWatchListが見つからない場合先頭のWatchListを使うようにしてますが、cBotなんかの場合、エラーメッセージを表示する方が親切だと思います。
注意点としてはWatchListにあるSymbol名だからといって、必ずSymbols.GetSymbolが成功するとは限らないこと。ここは失敗してnullで返ってくる可能性も考慮し、nullを取り除く処理をしてます。
// --- ウォッチリストからSymbolを取得する。一つも取得できなければ例外投げる
var symbols = Symbols.GetSymbols(watchList.SymbolNames.ToArray()).Where(s => s != null);
if (symbols.Count() == 0) throw new ArgumentException();
28行目の処理はGetSymbolsにWatchList内のシンボル名を配列化してそのまま渡して、Symbolの配列を得て、そこからnullを取り除いています。
あとはこのsymbolsに含まれるそれぞれのSymbolの情報を表示させてあげるだけです。
他の通貨ペアをリアルタイム処理
起動してもらうとわかりますが、適用したチャートに値動きがなくても、パネル内の価格は更新されます。
先日のこの記事の3の方法を実際に使ってみたツールになります。
-
【cAlgo】含み損益状況をリアルタイムに取得する【Tips】
Positionの状態をリアルタイムで把握したい 保有中ポジションの情報はPositionsプロパティから取得できます。例えば全ポジションの総含み損益が知りたければ private double Ge ...
続きを見る
今回は上記に比べてやってることはシンプルです。各シンボルのSymbolPanelクラス内でTicksイベントに処理を追加してあげるだけ。
// ---イベント(コンストラクタ内)
_symbol.Tick += OnSymbolTick;
}
//-----------------------------
// 毎Tick行う処理(価格の更新)
private void OnSymbolTick(SymbolTickEventArgs args) {
_bidText.Text = _symbol.Bid.ToString(_format);
_askText.Text = _symbol.Ask.ToString(_format);
if (_exBid < _symbol.Bid) _bidText.ForegroundColor = BullColor;
else if (_exBid > _symbol.Bid) _bidText.ForegroundColor = BearColor;
else _bidText.ForegroundColor = BaseColor;
if (_exAsk < _symbol.Ask) _askText.ForegroundColor = BullColor;
else if (_exAsk > _symbol.Ask) _askText.ForegroundColor = BearColor;
else _askText.ForegroundColor = BaseColor;
_exBid = _symbol.Bid;
_exAsk = _symbol.Ask;
}
一部抜粋でわかりにくいかもしれませんが、コンストラクタ内で毎Tick行う処理をイベントに追加しているだけです。
インジケータ起動中にウォッチリストへの追加や削除があっても連動はしません。もしウォッチリストと連動させたい場合はWatchlists.WatchlistSymbolAddedとWatchlists.WatchlistSymbolRemovedイベントを拾って処理してあげてください。