そのほか |
|
|
VB.NETで楽天RSSからリアルタイム情報を取得する<その3>(9)
カテゴリ:「VB.NETで自動売買」入門
さて今回はいよいよコーディングに入っていきますよ!
期待して待ってて下さっていた方、有難うございます。 前回までは、環境を作ってプロジェクトを作って画面を作っただけです。 これからが一番楽しいところですよね。 前回の状態にするために、VB2008EEを立ち上げてSampleApplicationを開いて下さい。 Form1のソースコードを開いていない方は、Form1.vbを選択した状態で「コードの表示」 ボタンをクリックして下さい。 解説は、なるべくオブジェクト指向やVBの言語仕様などの細かい話を省略して単純にして いこうと思っています。 ですが、初めてプログラムを組む方にはちんぷんかんぷんになる内容も出てくると思います。 その場合は、このサンプルが出来上がった後にでも、独学で勉強される事をお勧めします。 そうしないと、何かトラブルがあった時や自分で新しい事をしたい時に挫折してしまうので。 前置きはこのぐらいにして早速始めていきます。 取得_Click()というメソッドは「取得ボタンがクリックされた時の処理」でしたよね。 やりたい事は 画面の銘柄コード、市場コードを元に、楽天RSSから銘柄名称と現在の株価を取得して 画面に表示したい でした。 まずは、楽天RSSから情報を取得してくれるNDdeのクラスを準備します。 そのクラスは「NDde.Client.DdeClient」です。 プログラム中でこのクラスを使用する時には、こうやってフルネームで書いてあげても 良いのですが、長くなるので面倒ですし後でソースも読みにくくなります。 なので「NDde.Client.」という部分(名前空間と言います)を省略して、最後の クラス名だけ記述すれば良いように定義してやる事が出来ます。 そのために、ファイルの先頭に「Imports NDde.Client」と書いてあげます。 ここで、非常に便利な開発環境の機能を伝授します(笑)。 それは「インテリセンス」と呼ばれるものですが、そこでコーディングすべき内容を予測して 候補として表示してくれる機能です。コードの途中で「CTRL+スペースキー」で実現出来ます。 どんな時でも記述の途中で押せば非常に効率よくコーディング出来ますし、スペルミスも 無くなるので便利ですよ。是非インテリセンスに慣れて下さい。 DdeClientクラスには色々なプロパティ(属性)やメソッド(操作)があります。 今回使用するもの以外にも沢山あります。 楽天RSSから情報を取得するための基本的な流れは、次の4ステップになります。 (1)DdeClientのインスタンス化(銘柄毎に1つ) (2)楽天RSSに接続 (3)欲しい情報を取得(複数項目ある場合は複数回) (4)DdeClientの破棄 では順番にいきます。 まずは「DdeClientのインスタンス化」です。 クラスというのは「こんな属性でこんな操作を持ったものです」という設計図です。 その設計図通りに実際のモノを作る作業がインスタンス化です。 分からない方は「そんなもんなんだ」で流して下さいw インスタンス化するためには、引数(渡す情報)としてサービス名とトピック名が必要です。 サービス名は、楽天RSSの場合"RSS"という文字列固定です。変わりません。 そしてトピック名というのが「銘柄コード.市場コード」です。 ここまで書いて「あれ!?」と思われた方。そうです! 楽天RSSをExcelから関数で使用していた方は、セルに「=RSS|'4755.Q'!現在値」とか 入力していましたよね! まさしくその時の「RSS」がサービス名で、「4755.Q」がトピック名なんです。 ExcelからDDEの機能を使って楽天RSSから情報を取得していたんですね。 まずはトピック名を作ります。 画面の銘柄コードと市場コードに入力された文字列をピリオドでつなげます。 Dim topic As String = 銘柄 (2008.4.11訂正) この1行が何を表しているかの説明は、すみませんが割愛させて頂きます。 分からない方は調べて頂く事をお勧めします。 トピック名が出来たので、サービス名の"RSS"と一緒に引き渡して、DdeClientの インスタンス化を行います。 Dim client As New DdeClient("RSS", topic) インスタンス化されたDdeClientのオブジェクトは、今後clientという変数名で 扱う事が出来ます。 但し「Dim」で宣言した変数はローカル変数ですので、このメソッド(取得_Click())の 中でしか使えません。・・・ややこしいのでこの辺りはハショります(苦笑)。 さて次は、このオブジェクトを楽天RSSに接続させます。 client.Connect() これだけです!この行が実行されている時にMarketSpeedや楽天RSSが立ち上がって いなかったり、MarketSpeedにログインされていない場合は例外が発生します。 ・・・このサンプルプログラムではエラーのハンドリングを省略するつもりです。 異常が起こった時にどうしたら良いか分からない方は頑張って勉強して下さい。 省略していますが、非常に大事な部分です。 さてこれで、取得したい銘柄のDDEクライアントがインスタンス化されて 楽天RSSに接続している状態です。嘘みたいですよね。 いよいよ次は、銘柄名称と現在の株価を取得します!! ・・・と行きたいところですが長くなったので今日はここまでにします。 ほんとチョビットずつで申し訳無いです。m(_ _)m 現在のソースはこんな感じになってます。 (2008.4.11 ×「銘柄名称」→○「銘柄コード」) 一応簡単にコメントを入れました。 シングルクォーテーションを入れるとそれ以降がコメントになり、ソースコードとして コンパイルされません。後からの事を考えると、そこで何をしているか 分かりにくいコードにはこまめにコメントを入れる癖を付けましょうね。 ではまた次回。。。
[「VB.NETで自動売買」入門] カテゴリの最新記事
実は紹介して頂いたサイトを最近発見してました(^^;
今のとこ、クリック証券へ口座開設待ちでして、開設したらこのサイトのサンプルをもとに、進めていこうかと思ってました。つまりExcel上でVBAを使いずつ、アナログ的!?なやり方を考えてました。監視銘柄もとりあえず1銘柄で考えてますし、発注ロジックもそれほど複雑では無いので、負荷も少ないかな?っと思いまして(^^; でもKNIGHTさんの連載を見て、やはり初めからVB.BETで作ったほうが良いのかな!?っと思いはじめてます(^^; 後々のメンテナンスや拡張性を持たせるにはVB.NETの方が良さそうですが、KNIGHTさんはどう思われますか? ちなみにC言語なんかは多少やってましたので、今回のKNIGHTさんが書かれる記事は、わかり易くて今のとこ理解できてます(^^) (Apr 11, 2008 12:17:04 PM)
Excelだと結果がすぐに見えるので試行錯誤が簡単にできます。タイマー処理もVBAでAPIをつかえば組み立てられます。
MSの起動・自動ログインやRSS起動、再起動もUWSCと連携させれば、VBAでも自動売買システムを作れるでしょう。 問題としては、例外処理の組み立てが難しいです。特に、sheet側でエラーとなる場合の処置。また、debugがVBAは比較的面倒ですね。 (Apr 11, 2008 12:50:48 PM)
raicyonさん
>実は紹介して頂いたサイトを最近発見してました(^^; もう少し早く紹介すれば良かったなぁと反省しています。 遅くなったので「多分もう見てらっしゃるだろうなぁ」とは思いました。 >今のとこ、クリック証券へ口座開設待ちでして、開設したらこのサイトのサンプルをもとに、進めていこうかと思ってました。つまりExcel上でVBAを使いずつ、アナログ的!?なやり方を考えてました。監視銘柄もとりあえず1銘柄で考えてますし、発注ロジックもそれほど複雑では無いので、負荷も少ないかな?っと思いまして(^^; >でもKNIGHTさんの連載を見て、やはり初めからVB.BETで作ったほうが良いのかな!?っと思いはじめてます(^^; 後々のメンテナンスや拡張性を持たせるにはVB.NETの方が良さそうですが、KNIGHTさんはどう思われますか? ちなみにC言語なんかは多少やってましたので、今回のKNIGHTさんが書かれる記事は、わかり易くて今のとこ理解できてます(^^) ----- C言語をされてたというのは強みだと思いますよ。 オブジェクト指向の事はある程度分かるんじゃないでしょうか? 私の職場の後輩が、C++/CLIで自動売買を作ろうと勉強中です。 理由は、彼の業務エリア的にWindowsだけでは駄目で、Linuxなど 別のOSも相手にしているのでC++を勉強したかったからです。 ですがネックは情報量の少なさです。 .NET Frameworkで実装するならネットの情報量で言えば、VB、C#、C++、J#の 順でしょうか。どの言語でも似たような事が実現出来ます。 J#はSunのJavaに似ているところから情報量がそれなりにあると言えばありますが、 あまり誰も取らない選択肢です。 (Apr 11, 2008 10:16:02 PM)
VBとC#で言えば、言語の完成度から言えばC#の方が上です。新しい言語なので
Javaをさらに改良したような良い言語だと思います。 ですがVBはとっつきやすさから皆さんが選択されます。私もそうです。 Excel/VBAとVB.NETですが、言語としてしっかりしているのはmicorosoftさんが おっしゃる通りVB.NETです。例外処理がきちんとしていて、開発環境の性能も 遥かに上です。ですが、敷居はExcel/VBAより高いでしょうね。 あと、私が質問に答えられるとしたらVB.NETの方です(笑)。 VBAで質問されたら、答えられない可能性は高まると思います(^-^; 最終的にはraicyonさんの好きな方を選べば良いと思います! 曖昧な回答ですみません(汗)。 (Apr 11, 2008 10:16:24 PM)
とりあえず敷居の低そうなExcel/VBAでやってみようと思います(^^;
たぶん試行錯誤の繰り返しになると思うので Excelのほうが視覚的に把握し易いですよね。 でもいずれはVB.NETに移植できればと思いますので KNIGHTさんの連載は永久保存版として読ませて頂きますので 今後も宜しくお願いします(^^; それと一つ質問なのですが クリック証券のWEBサービスのページに 保有一覧などは5秒以上空けてリクエストするように みたいなことが書かれているのですが KNIGHTさんも5秒以上空けて約定の確認を行ってるのでしょうか? サーバー負荷の問題だと思いますが、 値動き激しい銘柄のスキャだと5秒は長い気がしまして・・・(^^; (Apr 12, 2008 06:09:22 PM)
raicyonさん
>とりあえず敷居の低そうなExcel/VBAでやってみようと思います(^^; >たぶん試行錯誤の繰り返しになると思うので >Excelのほうが視覚的に把握し易いですよね。 そうですね。手軽に試せますし、良いと思います。 物足りなくなった時にVB.NETにしても全然遅くないと思います! >でもいずれはVB.NETに移植できればと思いますので >KNIGHTさんの連載は永久保存版として読ませて頂きますので >今後も宜しくお願いします(^^; 永久保存版だなんてそんな大それた内容じゃないですが、VB.NETで 作る時には見て頂けたら幸いです。 (Apr 12, 2008 06:34:16 PM)
>それと一つ質問なのですが
>クリック証券のWEBサービスのページに >保有一覧などは5秒以上空けてリクエストするように >みたいなことが書かれているのですが >KNIGHTさんも5秒以上空けて約定の確認を行ってるのでしょうか? >サーバー負荷の問題だと思いますが、 >値動き激しい銘柄のスキャだと5秒は長い気がしまして・・・(^^; 発注系の注文はいくら呼び出しても良いですが、余力や保有銘柄、 注文一覧などの呼び出しは一応5秒空けろと書かれていますよね。 あまりに間隔が短くてWebサービスをロックされたりしても困りますし 一応気は遣っています(^-^; 例えば購入する時に余力を確かめたり、既に注文が出ているか、 あるいは既に保有銘柄に含まれていないか、などを確認するのは リアルタイムで行っています。 ただ、それはシグナルが出た時にだけ呼び出すので絶えず行っている 訳ではなく大丈夫だと思っています。 それとは別に、例えば売却ロジックが一定間隔で保有銘柄を 確認する(買い注文が約定したら売り注文のための監視を始めたいから)は、 3秒毎とかにしていたと思います。 今の所ロックされた事はありませんので、あまり短い間にガンガンと 呼び出さなければ大丈夫だと思います。 スキャの場合だと、買い注文を入れた後の動きとしては (1)○秒間隔で保有銘柄一覧or約定一覧or注文一覧を見に行って約定を確認 (2)すぐさま売り注文(リアルタイムでOK) (3)○秒間隔で保有銘柄一覧or約定一覧or注文一覧を見に行って約定を確認 みたいになるのでしょうか。(1)と(3)の確認間隔ですが、私は 2~3秒おきぐらいだったら大丈夫じゃないかと思っています。 1秒以内だったりすると怒られそうですね。 ・・・皆さんはどうしてるんでしょうね。 (Apr 12, 2008 06:36:48 PM)
ありがとうございます(^^)
KNIGHTさんは3秒間隔くらいで取得してるんですね それでロックされたことが無いということで安心しました(^^) 自分もそれくらいで作っていこうと思います!出来るかな!?(^^; (Apr 14, 2008 11:32:09 AM)
raicyonさん
>ありがとうございます(^^) >KNIGHTさんは3秒間隔くらいで取得してるんですね >それでロックされたことが無いということで安心しました(^^) >自分もそれくらいで作っていこうと思います!出来るかな!?(^^; ----- 約定確認を3秒間隔で行うと、購入後の平均遅延時間は1.5秒ですよね。 それから売り注文を入れても充分実用に耐える速度だと思います。 発注は手動より高速だと思いますし(^-^) (Apr 14, 2008 12:27:53 PM) |