|
カテゴリ:「VB.NETで自動売買」入門
今日は本当に、Advice()形式の第一回です。
前回、Request()形式で継続的にリアルタイムデータを取得する方法として、Do~Loopなどの 繰り返し処理やタイマーイベントをご紹介しました。取得間隔は例として5秒間隔でした。 一定間隔で値を取得したい場合はこの方法をお勧めします。 ですがそうではない場合もあります。 ある時は1秒間の間に数回株価が変動したり、あるいは別のタイミングでは暫く株価が 動かなかったり。その変化の頻度は一定ではなく波があります。 一定間隔だと細かい変化が全く読み取れなかったり、逆に全く変化が無いのに無駄に取得したりする 可能性が出てきます。それを克服するためにAdvice()形式があります。 Request()形式は「この情報を下さい」と要求し、そのタイミングで値をもらいます。 自分が要求しないと取得出来ませんし、要求したら前回と全く同じ値でも取得処理が流れます。 それに対しAdvice()形式は「この情報に更新があれば教えて下さいね」と頼んでおく形式です。 値に更新があった時に、イベントハンドラに紐付けられたメソッドが自動的に呼び出されるので そのメソッド内に「更新時の処理」を記述すれば良いという事になります。 自分で繰り返し処理を回す必要はありません。DDEクライアントに「もう監視は結構ですよ」と言うまで 変更がある度にイベンドハンドラに対するメソッドを呼び出してくれます。 Request()形式が能動的に値を取得するのに対し、Advice()形式は受動的です。 また、Advice()形式には何げに嬉しい特典が付いています。 前場が終わってから暫くすると(11:00過ぎ)、楽天RSSは一度停止します。 これは楽天証券のシステムの動きなのでそれをどうにかする事は出来ません。 楽天RSSが停止中、もしDDEクライアントのRequest()メソッドを呼び出すと例外が発生します。 なので、停止時間帯はRequest()メソッドは呼び出さないように注意する必要があります。 前場が終わった段階でMarketSpeedと楽天RSSを停止し、後場が開始する前に再起動されている 人もいらっしゃるようですし、それが無くとも停止時間帯にRequest()メソッドを呼び出さ ないように制御する必要があります。 ・・・もちろん、Connect()メソッドなどの他のメソッドに対してもレスポンスが返る事は無いので 例外が発生しますよ。 Advice()形式は情報に変更があった時に通知してもらうのですが、楽天RSSが停止中も DDEクライアントのインスタンスが死ぬ訳ではありません。ただ「通知が来ない」だけで、 プログラムをそのまま実行させていても何ら問題ありません。これって運用が楽だと思いませんか? ・・・前置きはこれぐらいにして、Advice()形式のサンプルプログラム作成を始めましょう。 「その5」で言った通り、プロジェクトや画面はRequest()形式で作成したものを使用しますので まだ準備されていない方は宜しくお願いします。 まず最初に「現在値の監視を開始してね」という意味で「取得」ボタンの隣に「監視」ボタンを 追加します。ツールボックスからボタンをドラッグ&ドロップし、プロパティの「Text(表示名)」と 「Name(オブジェクト)」の値を両方「監視」にします(分からない方は「その1」からご覧下さい)。 そして、監視ボタンをダブルクリックしてソースにメソッドを追加しましょう。 このようになっていますか? ![]() 上に見えているのはRequest()編で作ったメソッドの最後の部分です。 ここから、ソースコードをコピーします(笑)。 本当は同じソース中に同じようなコードが複数ある事は望ましくありません。 修正する時に2箇所を直さないといけませんし、修正忘れなどのミスでバグが混入する可能性も 高くなるからです。本来なら共通処理としてPrivateメソッドに切り出して、それぞれのメソッドが その共通メソッドを呼ぶようにするなどする方が良いでしょう。 ※読んでて意味の分からない方は、勉強されるか、無理なら読み飛ばして下さい それはとにかく置いておいて、今回はコピーします。 コピーするのは最初から、銘柄名称を取得して画面に設定する所までです。 ![]() ここまでコピーすると「監視」ボタンを押しても「取得」ボタンと同様、銘柄コードと市場コードに 対する銘柄名称をRequest()形式で取得して画面に表示してくれます。 あとは現在値をAdvice()形式で取得すれば終わりです!!w さて今回のメインです。 DDEクライアントにはStartAdvice()というメソッドがあります。第一引数で指定したアイテム名の監視を 開始するメソッドです。インテリセンスを使って入力してみて下さい。 client.StartAdvise("現在値", 1, True, 60000) 第二引数と第三引数はRequest()メソッド同様、気にしないで下さい。 第四引数はタイムアウトまでの待ち時間です。 このメソッドを呼び出すと、現在値に変化がある度にイベントが発生します。 イベントとは「取得ボタンがクリックされた時」で解説したような「取得.Click」の事です。 今回の場合は、DDEクライアントのAdviceイベントが発生しますので、このイベントを受けて実行する メソッドを用意する必要があります。 でも、取得_Click()メソッドの宣言の最後に記述されているように「Handles 取得.Click」などと 最初から記述しておく事は出来ません。 なぜならDDEクライアントのオブジェクトは実行された時に初めて生成されるもので、ボタンのような 静的なオブジェクトではなく動的なオブジェクトです。 なので、オブジェクトを生成した後、自分で動的にイベントとメソッドとを紐付けてあげないと いけないのです。 ・・・と、もう少し書こうと思っていたのですが、MarketSpeed7.1のダウロードが始まって 評価等が出来ないので今日はここまでにしたいと思います。。。 お気に入りの記事を「いいね!」で応援しよう
[「VB.NETで自動売買」入門] カテゴリの最新記事
|