楽天証券 MarketSpeed RSS サンプルプログラム



(DLJ時代、勉強会に参加してもらった MarketSpeed マグカップ)

このページでは楽天証券 MarketSpeed RSS のサンプルプログラムを掲載しています。




もし君と僕がりんごを交換したら、持っているりんごはやはり、ひとつずつだ。

でも、もし君と僕がアイデアを交換したら、持っているアイデアは2つずつになる。

ジョージ・バーナード・ショー
(劇作家・ノーベル文学賞受賞者)


〜 目次 〜
1. RSS サンプルプログラム
    1-1. C#2010, VB2010, VC++2010, C#2008, VB2008, VC++2008, VB6.0, VC++6.0版
        1-1-1. 画面イメージ
        1-1-2. サンプルプログラムダウンロード
        1-1-3. クラス・メソッド名一覧他
        1-1-4. 特記事項
        1-1-5. Visual Studio 2010 への対応状況
        1-1-6. その他
    1-2. Excel2000版

2. MarketSpeed と RSS の自動操作(起動・終了・ログイン・ログアウト) サンプルプログラム - C#2008版

3. RSS の接続回数確認テスト サンプルプログラム - C#2008版

4. RSS 豆知識
    4-1. 市場部名称

5. リンク

免責事項

1. RSS サンプルプログラム

  RSS のサンプルとしては、楽天証券から Excel のスプレッドシートが公開されてますが、プログラムに関する情報はいまのところ公開されていません。

  しかし RSS のような機能は、プログラムしてこそ真価が発揮されるものと考えます。プログラミング方法が広く知れ渡れば、いろいろ優れたアイデアのオンラインソフトが開発されることになると思いますので、そのような一助になればと思い、RSS を操作するサンプルプログラムをソース付きで公開することにしました。

1-1. C#2010, VB2010, VC++2010, C#2008, VB2008, VC++2008, VB6.0, VC++6.0版

1-1-1. 画面イメージ

(1) C#2010版 (2) VB2010版
         

(3) VC++2010版 (4) C#2008版
         

(5) VB2008版 (6) VC++2008版
         

(7) VB6.0版 (8) VC++6.0版
         


1-1-2. サンプルプログラムダウンロード

Visual Studio言語
Visual Studio 2010C#2010
VB2010
VC++2010
Visual Studio 2008C#2008
VB2008
VC++2008
Visual Studio 6.0VB6.0
VC++6.0



1-1-3. クラス・メソッド名一覧他

言語コールドリンク (同期)
クラス名初期処理
メソッド名
項目値取得
メソッド名
終了処理
メソッド名
C#2010
C#2008
DdeClientColdLink Init GetItemValue Done
VB2010
VB2008
VC++2010
VC++2008
VB6.0 basDDEClientColdLink
(モジュール)
DDEClientColdLinkInit DDEClientColdLinkGetItemValue DDEClientColdLinkDone
VC++6.0 CDDEClientColdLink Init GetItemValue Done

言語ホットリンク (非同期)
クラス名初期処理
メソッド名
項目値取得開始
メソッド名
項目値取得停止
メソッド名
終了処理
メソッド名
項目値更新時の処理内容
C#2010
C#2008
DdeClientHotLink Init Start Stop Done   項目値が更新されると Init メソッド内の DdeInitialize API に渡した HotLinkCallbackInternal メソッドが呼ばれるので、その中で項目値を取得し、Start メソッドに渡した HotLinkCallback メソッドを呼び出しています。(実際にはデリゲートを介しています)。
VB2010
VB2008
HotLinkStart HotLinkStop
VC++2010
VC++2008
Start Stop
VB6.0 basDDEClientHotLink
(モジュール)
DDEClientHotLinkInit DDEClientHotLinkStart DDEClientHotLinkStop DDEClientHotLinkDone   項目値が更新されると Init メソッド内の DdeInitialize API に渡した HotLinkCallback メソッドが呼ばれるので、その中で項目値を取得しています。
VC++6.0 CDDEClientHotLink Init Start Stop Done



1-1-4. 特記事項

言語特記事項
共通
  • 変数名ですが、全般的に変数の型を接頭語としたハンガリアンもどき表記になってます。今流じゃないですね。私はこの方が相変わらず分かりやすいのですが。


  • コールドリンクの GetItemValue メソッドは、直前の銘柄コード(トピック名)と項目名を保存し、文字列ハンドルの再利用及び再接続しないようにしていますが、ここは利用形態によって大いにカスタマイズの余地があります。大量の情報を取得するなど少しでも処理時間を短くしたいときは各自の利用形態に合わせてカスタマイズしてください。例えば複数の銘柄の4本値を取得する場合、4本値の項目名("始値", "高値", "安値", "現在値")は事前に文字列ハンドルを作成しておいて以後はそれを使うなど。


  • 大量ついでに、RSS は DdeInitialize 後 DdeConnect を合計 16,383 回行うと次の 16,384 回目に接続できなくなるようです。これは DdeConnect と対になるように DdeDisconnect を行っても同じです。こうなると DdeUninitialize して再び DdeInitialize してもダメで、MarketSpeed と RSS を再起動・再ログインするしかなくなります。3. RSS の接続回数確認テスト サンプルプログラム - C#2008版に現象確認用のサンプルプログラムを掲載しておきましたのでご参考に。

C#2010, VB2010, VC++2010
  • それぞれの 2008 版を 2010 で読み込んで更新しただけです。一部 2010 に更新したことでエラーとなるものがありましたが修正しています。そのため 1 から書いたわけではないので、言語の癖のようなものはよく分かっていませんのであしからず。

VB2008
  • ラインナップを揃えるために初めて触ったのでコードはあまりスマートじゃないかもしれませんのであしからず。


  • ホットリンクの項目値取得停止メソッド名は Stop にしたかったのですが予約語 Stop と重なって使えませんでした。このため項目値取得開始/停止は HotLinkStart/HotLinkStop にしています。


  • DdeErr クラスの _ddeErrNoAndMsg 変数にエラー番号とエラーメッセージの一覧を初期値設定していますが、DMLERR_INVALIDPARAMETER の箇所は他の版と違って複数行のエラーメッセージがコメントアウトされていません。これは次の行への継続を示す行末の _(アンダースコア)がコメント行の中でも有効になってしまうためです。

VC++2008
  • ラインナップを揃えるために初めて触ったのでコードはあまりスマートじゃないかもしれませんのであしからず。特にマネージとアンマネージの相互運用は情報が少なかったり古かったりとやたら苦労しました。


  • DDE API が格納されている user32.dll がリンクできなかったので、main メソッドのある msrss.cpp に #pragma comment(lib, "user32.lib") と書いて対応しています。


  • DDE API に LPDWORD を渡すところ(DdeInitialize 関数)ではアドレスをそのまま渡せないみたいなので、同じ型の変数をその場で作成して渡しています。普通の変数と区別するためにその変数名の最初には __ (アンダースコア2個)を付けています。


  • DDE API に LPTSTR を渡すところ(DdeCreateStringHandle 関数)ではアドレスをそのまま渡せないみたいなので、PtrToStringChars メソッドを使って pin_ptr 型に変換した変数を渡しています。普通の変数と区別するためにその変数名の最初には __ (アンダースコア2個)を付けています。


  • VC++2008 版は Unicode でコンパイルしているので他の版と違いコードページは CP_WINUNICODE を使っています。DdeCreateStringHandle 関数に CP_WINANSI を指定して作成した文字列ハンドルを使って DdeConnect 関数を呼ぶとエラーになるので。しかし RSS はシフトJISで項目値を返してくるので、項目値を取得した後シフトJISから Unicode に変換しています。

VB6.0
  • API の BOOL 型の TRUE/FALSE は 1/0 ですが、VB6.0 の Boolean 型の True/False は -1/0 となっており、TRUE と True の値が違います。この影響か、DdeFreeStringHandle 関数など BOOL 型を返す API を Declare 宣言で As Boolean としてしまうと、例えば Dim bRtn As Boolean bRtn = DdeFreeStringHandle(...) が成功し TRUE が返ってきたとき、If (Not bRtn) Then でエラー判定すると Not bRtn が偽にならず真になってしまう現象が発生します。それを回避するため、サンプル中では BOOL 型の API も Long 型とし、API_FALSE(0 の Const) と比較するようにしています。


  • ホットリンクのアドバイズループを停止するときに DdeClientTransaction 関数に ADVSTOP (&H40& Or XCLASS_NOTIFICATION) を渡しますが、WIN32API.TXT 中の XCLASS_NOTIFICATION は &H8000 となっており、このままだと整数型(Integer)のため -32768 となってしまい ADVSTOP の値が正しく設定されず DdeClientTransaction がエラーになります。このためサンプルの定数宣言では長整数(Long)を表す & を末尾に付け &H8000& と宣言しています。



1-1-5. Visual Studio 2010 への対応状況 (2008 版を 2010 で読み込んだ場合。2010 版ではこれらの問題は修正されています)

言語変換時変換後
ビルド実行
C#2008問題なし問題なし問題なし
VB2008問題なし問題なし DdeClientColdLink/DdeClientHotLink 両クラスの Done メソッド内の DdeApi.DdeUninitialize() で PInvokeStackImbalance 例外が発生します。しかし DdeApi クラスの DdeUninitialize() 宣言を以下のように修正すると解決します。
修正前Public Declare Function DdeUninitialize Lib "user32" Alias "DdeUninitialize" (ByVal idInst As Long) As Boolean
修正後Public Declare Function DdeUninitialize Lib "user32" Alias "DdeUninitialize" (ByVal idInst As UInteger) As Boolean
VC2008警告が 10 個くらい表示されるが変換できる。問題なし問題なし


1-1-6. その他




1-2. Excel2000版 (Download)





2. MarketSpeed と RSS の自動操作(起動・終了・ログイン・ログアウト) サンプルプログラム - C#2008版 (Download) (C#2010 でも問題なく変換・ビルド・実行できます)





3. RSS の接続回数確認テスト サンプルプログラム - C#2008版 (Download) (C#2010 でも問題なく変換・ビルド・実行できます)





4. RSS 豆知識

4-1. 市場部名称



5. リンク

楽天証券・MarketSpeed

楽天証券
MarketSpeed
MarketSpeed 操作ガイド (PDF) (RSS に関しては40頁〜)


技術関連

MSDN - Dynamic Data Exchange (DDE) マネージメント ライブラリ
猫でもわかるプログラミング (DDE のサンプルは、■Windows SDK編 第2部 ■第150 〜 155章。但しC言語)
やました工房
Mottaツール工房


オンラインソフトウェア

楽天証券 MarketSpeed 用マイページ自動切替ツール MSMyPageChanger


その他

自動売買ソフトの販売・レンタル業者についてのご注意 (クリック証券)
自動売買ソフト及び関連業者についてのご注意 (トレイダーズ証券)
自動売買ソフトについてのご注意 (松井証券)







免責事項

  情報提供のみを目的としてこのWebページ(プログラムおよび文章)は作成されています。投資の判断と結果は各自の自己責任にて行なわれたものとし、HP主催者は一切の責任を負わないものといたします。


Home