NDde Client.Request()の実行
こんばんわ
掲載のサンプルを参考にして以下の様なプログラムを作成したのですが、RequestでExceptionを受け取って中断します。アドバイスを頂けないでしょうか。
 実行環境は、マーケットスピードとRSSが稼働していて、Excelの数式では受信出来ている環境です。

Module Module1

Sub Main()

Console.WindowWidth = 135

Dim Client As DdeClient

Client = New NDde.Client.DdeClient("RSS", "8411.T")
Client.Context.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
Client.Connect()
Dim itemMap = New Dictionary(Of String, String) ' Itemとその値を格納する
itemMap.Add("前日終値", "")
itemMap.Add("現在値時刻", "")
itemMap.Add("出来高", "")
itemMap.Add("最良売気配値1", "")
itemMap.Add("最良買気配値1", "")

For Each itemName As String In itemMap.Values
Dim value As String = Client.Request("前日終値", 1000)
itemMap.Item(itemName) = value
Next

Client.Disconnect()

End Sub

End Module

よろしくお願い申します。
  • karankoron
  • 2013/04/14 (Sun) 04:14:14
NDde Client.Request()の実行:訂正
直前投稿を訂正します。
Dictionaryの使用は初めてで、使い方の理解不足が原因でした。
ForループのitemMap.ValuesをitemMap.Keysに変更し、Requestの第一引数をitemName に変更したところValueに該当のValueを取得することができました。
大変失礼いたしました。
HotLinkも試してみたいと思います。
今後ともよろしくお願い申します。
  • karankoron
  • 2013/04/14 (Sun) 06:41:26
NDde Client.Request()の実行:ご報告
ColdLinkのサンプルの稼働を確認しました。
Dictionary操作の部分がそのままでは動かなかったので修正を入れています。

Module Module1

Sub Main()

Console.WindowWidth = 135

Dim Client As DdeClient

Client = New NDde.Client.DdeClient("RSS", "8411.T")
Client.Context.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
Client.Connect()

'Itemとその値を格納する
Dim itemMap As New Dictionary(Of String, String)
itemMap.Add("現在値", "")
itemMap.Add("現在値時刻", "")
itemMap.Add("出来高", "")
itemMap.Add("最良売気配値1", "")
itemMap.Add("最良買気配値1", "")

'値を変更したDictionaryのKeyをForEachのInで参照するとエラーとなるので、
'DictionaryのKeyのリストを作成し、これをInで参照してForEachする。
Dim keyList As New List(Of String)(itemMap.Keys)

For Each itemKey As String In keyList
Try
'value = Client.Request(itemKey, 1000)
itemMap(itemKey) = Client.Request(itemKey, 1000)
Console.WriteLine(itemKey + " : " + itemMap(itemKey))
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
Next

Console.Read()

Client.Disconnect()

End Sub

End Module

最初の実行時に例外を受け取ってCatchの方に入る場合がありますが、もう一度実行するとデータを受け取ることができています。まだ原因は不明です。連続的に実行すると途中でも発生するのかもしれません。
Console.read()は、確認メッセージ出力を見る為に入れています。Returnキー押下で終了します。

HotLinkの方も確認しましたので、載せておきます。

Module Module1

Dim itemMap As Dictionary(Of String, String)

Sub Main()

Console.WindowWidth = 135

Dim Client = New NDde.Client.DdeClient("RSS", "8411.T")
Client.Context.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
Client.Connect()

' Itemとその値を格納する
itemMap = New Dictionary(Of String, String)
itemMap.Add("現在値", "")
itemMap.Add("現在値時刻", "")
itemMap.Add("出来高", "")
itemMap.Add("最良売気配値1", "")
itemMap.Add("最良買気配値1", "")

AddHandler Client.Advise, AddressOf ChangeValue
For Each itemName As String In itemMap.Keys
Client.StartAdvise(itemName, 1, True, False, 1000, Nothing)
Next

Console.Read()

For Each itemName As String In itemMap.Keys
Client.StopAdvise(itemName, 1000)
Next
RemoveHandler Client.Advise, AddressOf ChangeValue

Client.Disconnect()

End Sub

Sub ChangeValue(ByVal sender As Object, ByVal e As NDde.Client.DdeAdviseEventArgs)

Try

Dim Client As NDde.Client.DdeClient = DirectCast(sender, NDde.Client.DdeClient)
Dim topicName As String = Client.Topic
'Console.WriteLine("topicName: " + topicName)
If itemMap.ContainsKey(e.Item) Then
itemMap(e.Item) = e.Text
Console.WriteLine(e.Item + " : " + itemMap(e.Item))
End If

Catch ex As Exception
Console.WriteLine("例外が発生しました。" + vbCrLf + ex.Message)
End Try

End Sub

End Module

DictionaryのitemMapは二つの関数から参照するので、Moduleレベルの変数としました。
ForEachのInで参照するメンバーをKeysに変更しています。
この場合のConsole.read()はメッセージ出力確認だけでなく、非同期に呼び出されるChangeValue()の実行の前にMain()が終了してはいけないだろう思い、入れています。実際の運用でこの辺りをどうするのか、アイデアを頂ければ幸いです。
ザラ場での実行確認はまだですが、一回だけデータを受け取るところまでは確認しています。
実運用までにはまだ確認項目、対処項目がありそうです。今後ともよろしくお願い申します。
  • karankoron
  • 2013/04/14 (Sun) 18:46:53
Re: NDde Client.Request()の実行
右京です。

回答が遅くなって申し訳ありません。

■(1)ColdLinkについて

「最初の実行時に例外が発生する場合がある」、とのことですが、
・「最初」とは、アプリ起動の最初という意味か、Windows起動の最初という意味でしょうか?
・どのような例外が発生するか、掲載してもらえると、分かるかもしれません。


■(2)HotLinkについて

さすがに、Console.Read() では、自動化にはなりませんね。
この部分は、無限ループに置き換え、内部で値を読みます。
コードのイメージを以下に書きます。(実際に動くように適宜修正してください)

While true

'値を取得する
currentValue =itemMap("現在値")

'読み取った値を使って、売買判定を行い、シグナルが発生したら、売買注文を行う。
(ここは自由に書いてください)

'1秒に1回取得する。(この間隔は、自由に変えてもよいです)
Threading.Thread.Sleep 1000


'午後3時になったら、ループを抜ける
if Datetime.Now().Hour >= 15 Then
Exit While
End If

End While

かなり苦戦されているようですね。
私も初めは大変でしたから、頑張ってください。
また分からなければ、質問どうぞ。
  • 右京武彦
  • 2013/04/21 (Sun) 14:40:07
Re: NDde Client.Request()の実行
 こんにちは
 ご対応ありがとうございます。

「最初の実行時に例外が発生する場合がある」の件
 Client.Request()を実行した時だと思います。例外の種類は控えてないので、又アップします。
 発生すると連続しますが、少し時間をおいてリトライするとOKなので、RSSのタイミングの問題かなと思っています。RSSの始動時に起こるというわけでもなく、暫くRSSがアイドルして後にアクセスすると起こる、という感じでしょうか。
 ホットリンク起動時にも発生したので、いきなりホットリンクするのではなく、最初にRequest()で露払いをして、ホットリンクに入るようにしています。ホットリンクは変化がないと送らない、というポリシーのようなので、欲しいデータがなかなかもらえない、という場合もあり、そのような情報はRequest()で最初にもらっておく、という形にしています。
 リトライすることで対応可能と思っています。

HotLinkについて
 受信可能になりました。
 イベントハンドラ-を指定してAdviseしておけば、ループを作らなくてもデータを受信するとハンドラ-が呼び出されるので、その中で受信時の処理を実行しています。現状は、4本値のExcelへのリスティングです。同時に受信して負荷状況がどうなるかが気になっているのですが、16銘柄位なら全く問題なさそうです。

Tickデータの一括受信(Msts)
 添付のC#のサンプルを参考にVBで書き直して受信可能となりました。

 新たな質問をさせて下さい。
 Log4Netですが、VisualStudio2010でコンソールアプリケーションでプログラムに組み込んで使っていた時にはちゃんとLog出力ができていたのですが、同じapp.configでフォームアプリケーションで出力させようとするとLog用のフォルダも含めてLogファイルが作られない、という問題に遭遇しています。
 そのようなご経験はありませんか。

 ところで、この投稿のシリーズは他の方の投稿とは別のスレッドのような形で表示されているのですが、私の最初の投稿時に不備があったものと思われます。このシリーズの最初の投稿ではパスワードを設定してなかったので一旦削除して質問箱の方に入力し直す、ということも出来ない状況でここまで来てしまいました。
 もし可能であれば右京様の方で、削除する等の調整をして頂いても構いません。

 今後ともよろしくお願い申します。
  • karankoron
  • 2013/05/17 (Fri) 15:17:04
Re: NDde Client.Request()の実行
右京です。

>「最初の実行時に例外が発生する場合がある」の件

■私も経験があるのですが、おそらく、はじめ4本値など数値データを取得すると、
データが入っていない(空文字、または、null)ことがあります。
というのも、その日の約定がまだ起こっていないときは、データがそもそもないからです。
もしこの状態で、数値変換しようとすると、例外が発生しているのではないでしょうか。
きちんと、空文字、または、nullちぇっくをすれば、ホットリンクだけでもうまくいくと思います。

■Log4netについて
フォームアプリでも、ログは出力させることができます。
ただ気になるのは、コンソールアプリのapp.configを使っていること。
ログの出力先やappender-refの設定に誤りがあると出力されないことがあります。
確認してみてください。
  • 右京武彦
  • 2013/05/19 (Sun) 18:11:30
Re: NDde Client.Request()の実行
はじめまして
NDdeについて調べていてここにきました。
karankoron様の投稿でHotLinkでイベントハンドラ-を指定してAdviseしておけば、
ループを作らなくてもデータを受信できるとの事ですが
どの様なコードを書けばいけるのでしょうか?もう少し詳しく教えていただけないでしょうか。
よろしくお願いします。
  • るー
  • 2015/12/12 (Sat) 13:01:34
Re: NDde Client.Request()の実行
よろしくお願い申します。
  • add
  • URL
  • 2019/09/02 (Mon) 01:49:32

返信フォーム






プレビュー (投稿前に内容を確認)