会社員KNIGHTの趣味三昧(卓球・盆太鼓・色々!)

会社員KNIGHTの趣味三昧(卓球・盆太鼓・色々!)

PR

Calendar

Category

カテゴリ未分類

(0)

卓球

(1195)

盆太鼓・盆踊り

(407)

トイドローン

(21)

その他

(334)

■■■■■■↓以下は凍結カテゴリー↓■■■■■■

(0)

KATS(自動売買プログラム)

(87)

「VB.NETで自動売買」入門

(24)

本日の取引

(1292)

デイトレ結果(勝ち)

(365)

デイトレ結果(負け)

(591)

夜間取引結果

(15)

今週の取引

(480)

今月の取引

(103)

明日の監視銘柄

(54)

株関連

(55)

草野球

(36)

Keyword Search

▼キーワード検索

Comments

accelwin@ Re[4]:【卓球】シェイクのラケット反転について(11/23) KNIGHTさんへ ご返信ありがとうございます…
KNIGHT@ Re[1]:【卓球】シェイクのラケット反転について(11/23) accelwinさんへ ブログへのコメント、どう…
accelwin@ Re:【卓球】シェイクのラケット反転について(11/23) 61歳でカットマンに挑戦し、2カ月目に突…
KNIGHT@ Re[1]:単身赴任を終え兵庫に戻ります(06/28) Tomohiro Takahashiさんへ コメント有難う…
Tomohiro Takahashi@ Re:単身赴任を終え兵庫に戻ります(06/28) お疲れ様でした。そのうち、私も頑張って…
KNIGHT@ Re[1]:第1回 日中杯 SpinOnline(WSS団体戦)(04/14) fukufuku1789さんへ いえいえ。むしろ私が…
fukufuku1789 @ Re:第1回 日中杯 SpinOnline(WSS団体戦)(04/14) 一緒に試合に出てくださりありがとうござ…
KNIGHT@ Re[1]:第15回 朝霧オープン卓球大会(チームマッチ)(01/21) fukufuku1789さんへ お疲れ様でした。今回…
fukufuku1789 @ Re:第15回 朝霧オープン卓球大会(チームマッチ)(01/21) 惜しい試合が多かったですね。 また卓球し…
KNIGHT@ Re[3]:2023年度台東区オープン年代別後期団体戦(12/10) マニャさんへ コメントどうも有難うござい…
May 17, 2008
XML
前回は一応、形だけAdvice()形式でのリアルタイム情報取得が完成したのですが、
全く実用的ではありませんでした。
NDdeを利用しようとする方の疑問で一番多いのが

・複数銘柄の監視をしていた場合にどうやって銘柄を特定すれば良いのか
・複数項目の監視をしていて、それらの更新通知をどうさばいたら良いのか


という、複数銘柄/複数項目の監視を行った時の実装方法です。
今回はその辺りを解説し、より現実的なソースコードにしようと思います。

Form1に新しいロジックを追加しようと思いましたが、もう何がなんだか分からなく
なりそうですよね(^-^;
という訳で心機一転、新しいFormを追加します。

ソリューションエクスプローラのプロジェクト「SampleApplication」を右クリックし


WS000044.JPG

名前は「Form2」のままで良いので「追加」ボタンをクリックして下さい。

複数銘柄を監視する場合は、画面やデータベースから銘柄を指定して行いたいと思います。
ですがその辺りを解説すると長くなりますので省略します。
画面から入力する場合は、DataGridViewを使うと便利でしょう。
興味のある方は調べてみて下さい。
今回は、監視の開始と停止を行うボタンのみ作成します。
ツールボックスからボタンをドラッグ&ドロップし、作成してみて下さい。
大きさは自由で結構です。
ボタンに表示されている名前(Text)も分かりやすいように付けて下さい。
但し、ボタンの名前(Name)はそれぞれ 「StartAdvice」「StopAdvice」 として下さい。


画面はこんな感じになってますか?

WS000045.JPG

ボタン名をちゃんと設定した後でボタンをダブルクリックしないとメソッド名が
デフォルトのままになってしまいます。
では監視を開始するボタン(StartAdvice)をダブルクリックしましょう。

WS000046.JPG

上のようなソースになれば正しいです。


インスタンスをローカル変数(メソッド内にDim client As DdeClient ・・・などと
書く)で定義してしまうと、そのメソッドが終了した時点でプログラムからは
制御できなくなります。.NETが不要だと判断したらそのインスタンスは破棄されて
しまう可能性があります。
また、Adivce()形式はUsingブロックも適していません。
停止ボタンがクリックされるまではインスタンスをずっと保持していないといけないので
Usingブロックは使わずにインスタンス化します。

まずインスタンスを保持するためには、Form2のメンバ変数(インスタンス変数)として
DDEクライアントを定義します。
メソッド内ではなく、クラス内だけどメソッドの外に定義してあげ、Form2のインスタンスが
ある間は保持されるようにするのです。

しかも今回は複数銘柄です。ただ単にDdeClientを定義したらつまらないので、
DdeClientを複数保持する「入れ物」を用意します!
プログラムをご存知の方は、1つの方法として「DdeClientの配列」を使われる方も
いらっしゃると思いますが、今回は 「List」 を使用します。
以下のようにコーディングします。

WS000051.JPG

先頭にImport文を書いておかないと「DdeClient」と省略して書けませんので
ご注意下さい。
Listというクラスは、中に含まれるオブジェクトを複数件保持する事が出来る
一覧のような役目をするものです。また、先頭の「Private」はこの変数(list)の
スコープを表しています。
Form2の外からこの変数を操作する事が出来るか、それとも内部でしか使われない変数か、
というのを指定するものです。
「list」はForm2のメソッド内からしか扱わないので、外から扱えないようにする為に
「Private」という指定をします。

では早速、StartAdviceボタンがクリックされた時のソースを書いて行きましょう。
前回までに一度やっているので詳細は書きません。
Form1のソースを参考に出来ると思いますので、コピーして来て下さいね。

今回監視する銘柄は、固定で「エリアリンク(8914.T)」「サイバーファーム(2377.OJ)」
「YOZAN(6830.Q)」の3銘柄。監視項目は「現在値」「出来高」の2項目とします。


まずエリアリンクのDDEクライアントをインスタンス化します。

Dim client As DdeClient = New DdeClient("RSS", "8914.T", Me)

そして、接続した後に現在値と出来高の監視を開始します。
監視を開始する前にイベントハンドラをメソッドに追加する作業を覚えていますか?
「client.Advise」というイベントが発生したらどのメソッドを呼び出すかを
紐付けるんでしたよね。
値が変化した時のメソッドなので「ChangeValue」とでもしておきましょう。
まだメソッドは追加していませんので、今は当然コンパイルエラーになります。

client.Connect()
AddHandler client.Advise, AddressOf ChangeValue


監視の開始はclientのStartAdvice()を使うんでしたね。
でも今回は2項目です。どうすれば良いんでしょうか?・・・ただ2行書くだけです(笑)。

client.StartAdvise("現在値", 1, True, 60000)
client.StartAdvise("出来高", 1, True, 60000)


ここで勘の鋭い方は「clientの更新通知イベントはAdviceだけど、現在値と出来高の
どちらが変更された時?両方変更された時は?ChangeValue()はどうすれば??」と
疑問を持たれるでしょう。そうです。ChangeValue()メソッドの書き方こそが
複数銘柄/複数項目監視の肝です。

コンパイルエラーが出ていたら気持ち悪いので、ChangeValue()メソッドの枠だけ
書いてしまいましょう。

ここまで出来たら、こんなソースコードになっている筈です。

WS000052.JPG

エリアリンクの監視はスタートしますが、このメソッドが終了してもずっと
監視し続けてもらうために、DDEクライアントをListに追加して保持します。
clientをlistに追加します!

list.Add(client)

clientを引数にしてAdd()メソッドを呼び出すだけです。簡単ですね。

続けて全く同じように、サイバーファームとYOZANの監視も開始しListに追加します。
ソースはコピーすれば簡単でしょう。
この時「client」という変数名は一度使用しているのでエラーになると思います。
新たに変数名を取っても良いのですが、メソッド中に一時的に定義しているだけなのに
新たに名前を取るのも馬鹿らしいです。clientを使いまわします。
「Dim client As ・・・」と書くと新たなclientという変数を定義する事になるので
単純に「client =」を書くだけで良いのです。

client = New DdeClient("RSS", "2377.OJ", Me)

これで、3銘柄についてそれぞれ2項目の監視がスタート出来ました。
Listには、監視をしているDDEクライアントのインスタンスが3件保持されています。

どの銘柄のどの項目に変化があっても、今はChangeValue()メソッドが呼び出されます。
項目毎にメソッドを分ける事はNDdeの仕組み上、出来ません。
銘柄毎にメソッドを分ける事は可能です。「Add Handler」の時、別のメソッド名に
紐付ければ良いのです。
どちらが良いかについては、監視する銘柄が固定か可変かによって決めて下さい。
毎回監視する銘柄が変化する仕組みを作っている方は、同じメソッドに紐付けるのを
お勧めします。どの銘柄を監視しているかはその時によって変わるので、メソッドを
分けても書く内容は同じですし、件数が変動した時に動的にメソッド数を変える訳にも
いかないからです。
逆に、監視する銘柄が決まっている方(例えば日経先物と日経平均、など)は、
その銘柄に合わせたロジックが書きやすいのでメソッドを分けた方が良いかも知れません。
今回は銘柄の判別を説明するためにも、同じメソッドに紐付けるソースにしています。

さてここからいよいよ肝となるChangeValue()メソッドの実装に入ります。

・・・が、長くなってきたので次回とさせて頂きます。m(_ _)m
次回は肝の実装に加え、停止ボタンの実装も行いたいと思います。

最後に、 現在の状態だとプログラムを実行した時にForm1が開きます。
Form2は出てきません(苦笑)。
実行時にForm2が出るようにしておきます。

まずソリューションエクスプローラのプロジェクト(SampleApplication)を右クリックして
プロパティを開きます。

「アプリケーション」タブの「スタートアップフォーム」を「Form2」に変更して
保存しておくと、実行時にForm2が表示されるようになります!

WS000049.JPG

では、次回にご期待下さい。
最後にStartAdvice_Click()メソッドのソースコードを載せておきます。

WS000050.JPG





お気に入りの記事を「いいね!」で応援しよう

Last updated  May 17, 2008 01:43:55 PM
コメント(2) | コメントを書く


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

© Rakuten Group, Inc.
X
Design a Mobile Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: