tags:

views:

194

answers:

0

If I am working on creating a watch list. What is the best way through DDE to get the name, volume, bid, ask, and last trade? I am going to be using Think or Swim's Desktop software, which only supports DDE.

I am using NDDE.

I am looking for an answer from this website: http://ndde.codeplex.com/Thread/View.aspx?ThreadId=63269

I am looking to be able to get multiple topics out of one connection. Thank you!

Since MathWorks (MATLAB) and Microsoft decided to do away with DDE functionality still in use by some widespread applications, I had to find an alternate way of creating hot links. Using NDde, I tried creating a single connection to the data manager of the ESIGNAL financial data feed (winros.exe) and running multiple advisory links (multiple items). The VB express 2008 test program started OK and then crashed. I had a single OnAdvise call back function where I thought I could check the contents of args.Item, but that didn't work too well. Does anyone know if it is possible to call multiple items on a single connection and how that's done in VB?

I also tried two connections with a single advisory link per connection. That appears to work OK. The working code is as follows:

Imports NDde.Client Public Class Form1

Dim client As DdeClient
Dim client2 As DdeClient

Delegate Sub SetTextCallback(ByVal [text] As String)
Delegate Sub SetTextCallback2(ByVal [text] As String)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    client = New DdeClient("winros", "last")
    client.Connect()
    client.StartAdvise("6E U9", 1, True, 60000)
    AddHandler client.Advise, AddressOf OnAdvise

    client2 = New DdeClient("winros", "bid")
    client2.Connect()
    client2.StartAdvise("6J U9", 1, True, 60000)
    AddHandler client2.Advise, AddressOf OnAdvise

End Sub

Private Sub OnAdvise(ByVal sender As Object, ByVal args As DdeAdviseEventArgs)
    Dim NewText As String = args.Text
    Dim NewText2 As String = args.Item

    If NewText2 = "6E U9" Then
        If Me.TextBox1.InvokeRequired Then
            ' It's on a different thread, so use Invoke.
            Dim d As New SetTextCallback(AddressOf SetText)
            Me.Invoke(d, New Object() {NewText})
        Else
            ' It's on the same thread, no need for Invoke.
            Me.TextBox1.Text = NewText
        End If
    ElseIf NewText2 = "6J U9" Then
        If Me.TextBox2.InvokeRequired Then
            ' It's on a different thread, so use Invoke.
            Dim b As New SetTextCallback2(AddressOf SetText2)
            Me.Invoke(b, New Object() {NewText})
        Else
            ' It's on the same thread, no need for Invoke.
            Me.TextBox2.Text = NewText
        End If
    End If
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim NewText As String = "Done"

    If client.IsConnected() Then client.Disconnect()
    If client2.IsConnected() Then client2.Disconnect()

    If Me.TextBox1.InvokeRequired Then
        ' It's on a different thread, so use Invoke.
        Dim d As New SetTextCallback(AddressOf SetText)
        Me.Invoke(d, New Object() {NewText})
    Else
        ' It's on the same thread, no need for Invoke.
        Me.TextBox1.Text = NewText
    End If

End Sub
Private Sub SetText(ByVal [text] As String)
    Me.TextBox1.Text = [text]
End Sub
Private Sub SetText2(ByVal [text] As String)
    Me.TextBox2.Text = [text]
End Sub

End Class