|
カテゴリ:「VB.NETで自動売買」入門
この「VB.NETで楽天RSSから~」シリーズがこの記事で10回目を迎えました。
始めた時には、このネタだけで10回も続けるとは思っても見ませんでした。 さて今回は、いよいよ複数銘柄の複数項目について更新通知を受けて処理をする ChangeValue()メソッドの実装を行います。 「何を言ってるの?」と思われた方は<その9>までをご覧下さい。 ChangeValue()メソッドの定義だけは終わっています。中身が空ですが。 では中にコードを追加していきます。 このメソッドに紐付けたイベントハンドラは、エリアリンク(8914.T)、 サイバーファーム(2377.OJ)、YOZAN(6830.Q)の3銘柄について監視している項目に 変化があった時でした。 監視している項目はそれぞれ、現在値と出来高でした。 まずはChangeValue()メソッド中で、どの銘柄についての変更通知か判断する 必要があります。 それを知るには、引数である「sender」を使用します。 senderとはイベント通知を行ったオブジェクトそのものの事です。 つまり、監視している3銘柄いずれかのDDEクライアントのインスタンスという事に なります。 ちょっと専門用語になるので分からない方はやり方だけ参考にして下さい。 senderをDDEクライアントに変換しますが、それを「キャスト」と呼びます。 イベント通知を行ったDDEクライアントを特定するためにsenderをDdeClientに キャストします。 Dim client As DdeClient = DirectCast(sender, DdeClient) これで変数「client」を使って、どの銘柄がこのメソッドを呼び出したのかが 分かります。「Topic」というプロパティには「2377.OJ」などが入っています。 どの銘柄の更新通知か特定したら、次はどの項目に変更があったかを知る必要が あります。今回の場合は現在値か出来高です。 この値は、ChangeValue()メソッドのもう1つの引数「e」で分かります。 e(型はDdeAdviseEventArgs)には「Item」というプロパティがあり、ここに 項目名が入っています。e.Itemが何であるかを確認すれば良いのです。 肝心の「変更された項目の値」ですが、これは<その8>で解説しています。 引数eのプロパティ「Data」にバイト配列で値を持っているんでしたね。 それでは、これらの情報を元にコーディングします。 今回は画面に表示する準備はせず監視の開始ボタンと終了ボタンしか作ってません。 なので変更通知は「出力」ウィンドウに表示させる事にします。 Console.WriteLine("ABC") と書けば、出力ウィンドウに「ABC」と表示されます。 「WriteLine()」というメソッドは出力した後改行するという意味なので、 次に同じメソッドを呼び出せば次の行に書かれます。 もし Console.Write("ABC") と書いたら出力後改行しないので、2回連続で同じ事を書いても ABCABC になります。参考まで。 また、更新された銘柄を特定する時、IF文で条件分岐させても良いのですが 今回は「Select~Case文」を使用しています。 こんなコードになりました。 前回まで使っていた「バイト配列を文字列に変換する方法」だと出来高が文字化けして しまうので、以前micorosoftさんがコメントしてくれた「CInt」を使って変換しています。 この関数を使って変換される方が簡単なので、整数値の項目を変換する時には 利用しましょう。 引き続き停止ボタンのメソッドも実装しましょう。 Form2.VB[デザイン]の監視終了ボタンをダブルクリックします。 処理内容は、DdeClientのインスタンスが入ったlistを元に、全ての DDEクライアントを破棄してやれば良いです。 この部分に関するコードの解説は、ちゃんとしようと思えばそれなりに長くなるので ここでは「こんな風になります」に留めます(汗)。興味のある方は勉強してみて下さい。 これで一旦コーディング終了です。 待ち遠しかった方、お待たせしました。では実行してみましょう!! 開始ボタンを押してForm2が開いたら「監視開始」ボタンをクリックしてみて下さい。 出力ウィンドウに何か出てきましたか?(下はあくまでも例です) 何か結果が出てきてます! もしかしたら6項目が全て出ない方もいらっしゃると思います。 何度かやったらたまに出てこないとか。 それは「デバッグ実行」しているからだと思います。 出力ウィンドウの表示を消すにはこのボタンを押して下さい。 今回は出力ウィンドウに表示するだけでしたが、実際運用する時には データベースに書き込んだりする必要が出てくるでしょう。 その時にはChangeValue()メソッドの中身を書き換えてやる必要があります。 またその時、一番厄介な「マルチスレッド処理」を実装する事になります。 ChangeValue()メソッドは複数のスレッドが同時に呼び出して実行しており、 メソッドの書き方によってはそれぞれのスレッドが影響を受けて結果が正しく ならない可能性が出てきたり、間違った対処により処理が遅延したり最悪は プログラムが負荷増大により固まったりする事があります。 この部分についてどこまで解説するか(出来るか)。悩ましいです。 これで「VB.NETで楽天RSSからリアルタイム情報を取得する」シリーズを終了するか それともマルチスレッド処理についてもう少しだけ書くか。 明日以降に考えたいと思います。今回はちょっと含みを持たせたまま終了します。 お気に入りの記事を「いいね!」で応援しよう
[「VB.NETで自動売買」入門] カテゴリの最新記事
|