jerrywang168 發表於 13-1-29 22:05

d大感謝您

我剛剛比過了
沒問題是對的

可以請教您一個問題
您說開另一個WORKING QUEUE 去處理
可以我在目前的THREAD A收到資料時同時先把他存在ARRAY
然後再用另一個THREAD B去讀那ARRAY的值嗎?
同時在THREAD B去作我要作的事

可是您前面提到在單核心下漏TICK狀況較低
這樣用MULTITHREAD效能不是理論上較差

抱歉這部份實在不是很了解
謝謝

dragic 發表於 13-1-29 23:17

jerrywang168 發表於 13-1-29 22:05 static/image/common/back.gif
d大感謝您

我剛剛比過了




單核心不用改NDDE源碼就能不漏
多核心需要改 目前我試的結果似乎是這樣
感覺是DDE這種舊技術在多核心系統效能不佳 所以需要改用多執行緒以及buffer來改善

程式部分
基本上NDDE client本身會自己產生一個thread 所以不用另外再開
而NDDE在client的Advice事件觸發後 所取得到的資料就塞到queue裡面
用一個backgroundworker定期檢查queue裡面有沒有資料 有就處理到queue沒資料為止




jerrywang168 發表於 13-1-30 12:59

dragic 發表於 13-1-29 23:17 static/image/common/back.gif
單核心不用改NDDE源碼就能不漏
多核心需要改 目前我試的結果似乎是這樣
感覺是DDE這種舊技術在多核心 ...

請教您
1.可以指點怎樣叫做QUEUE嗎
   該用何種方式實作(我下面是我自己猜的作法 如有不對可以提出較佳作法 謝謝)
2.如果我是某一主程式 A 在執行
   另外開一個THREAD B去執行NDDE
   照您說是不是這THREAD B就會另開一CLIENT 去讀DDE SERVER資料
   我把這些資料放在一ARRAY C
   主程式A 有另一THREAD D 定期去POOLING ARRAY C
   如有新資料就表示他是要作動作 還是THREAD B 該NOTIFY THREAD D?
   
   可是這樣在單核心狀態執行不是會降低效能讓CPU滿載嗎?
   (因為不是開在VM下嗎?)
   (還是因為VM本身內部是單核 但是我外部WIN 7 還是用多核在跑 所以他有關繪圖
   這部份會往外傳讓WIN 7 多核處理? 抱歉 不是很了解 VM的運作)

3.是不是多核依您說改NDDE 源碼 就可以達到接近不漏TICK
4.還是我這資訊源部份用VM單核跑 把資料外傳(也許用SOCKET OR TEXTFILE)讓在非VM讀
   在非VM下是多核心程式(如MC8)這樣來接收傳進來的資料
   可是這樣接收端(MC8)會有漏TICK嗎?

謝謝您的耐心指導


jerrywang168 發表於 13-1-31 11:25

D大您好 我改了K大的程式碼
我的作法是
1.直接只開一個Service(CATDDE->E-Leader) Topic -> FUTOPT<FO>TXFB3   
當我按btnAddConnect_Click啟動後直接開兩個ITEM(CurPrice, TickVol)


    public partial class DDEClientFrm : Form
    {
      private Hashtable ht_conn;   //保存以 (連線字串) 為 key; 所建立的 DdeClient instance 為 object.
      //private Hashtable ht_item;    //保存以 (連線字串+項目名稱) 為 key; 項目值為 object
      private Hashtable ht_gdv;    // 保存以 (連線字串+項目名稱) 為 key;   
      private Queue myQueue = new Queue();   // 保存DDEClient 收到的 Item
      public DDEClientFrm()
      {
            InitializeComponent();
            ht_conn = new Hashtable();
            //ht_item= new Hashtable();
            ht_gdv   = new Hashtable();
            //Queue myQueue = new Queue();
      }

      /** 新增 DDE連線 的事件處理
         *
         */
      private void btnAddConnect_Click(object sender, EventArgs e)
      {
         if (ht_conn.ContainsKey(txtService.Text + "|" + txtTopic.Text))
         {
               MessageBox.Show("連線字串不能重覆!");
               return;
         }
         DdeClient dc = new DdeClient(txtService.Text, txtTopic.Text);
         //register the event handler            
         dc.Disconnected += client_Disconnected;
         dc.Advise += client_Advise;
         try
         {
                // Connect to the server.It must be running or an exception will be thrown.
                dc.Connect();
               
                dgConnection.Rows.Add(txtService.Text, txtTopic.Text, "已連線");

                //利用 "service|topic" 為 HashTable 的 Key; DdeClient 為 Object.
                string key = txtService.Text + "|" + txtTopic.Text;
                ht_conn.Add(key, dc);
               
            }
            catch (Exception thrown)
            {
               MessageBox.Show("無法連結 DDE Server:" + thrown.Message);
             }
            /* Added By Jerry
             * Add Items
             * End Added By Jery*/
            this.AddItem(dc, "CurPrice");    //新增 Item

            this.AddItem(dc, "TickVol");    //新增 Item
         }

2. 在 client_Advise 中把收到的item 直接放進myQueue中
      private void client_Advise(object sender, DdeAdviseEventArgs args)
      {
            DdeClient dc = (DdeClient)sender;
            ValueItem it = new ValueItem();
            it.item = args.Item;
            it.value = args.Text;
            it.time = DateTime.Now;
            
            myQueue.Enqueue(it);
         
      }

3.目前測試中所以一直讓QUEUE自動增加到我按停止連線同時Output 整個Queue
      void BtnStopConnectClick(object sender, EventArgs e)
      {
             string key = txtService.Text + "|" + txtTopic.Text;
             DdeClient client_conn = (DdeClient)ht_conn;

             this.Stop_advise(client_conn, "CurPrice");
             this.Stop_advise(client_conn, "TickVol");


            //刪除所儲存連線資訊的 key/value, 以及將該 DdeClient 連線移除。
            ht_conn.Remove(key);
            client_conn.Dispose();

            //將所在的連線資料列刪除掉
            dgConnection.Rows.RemoveAt(0);
            
            using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"R:\DDE.txt"))

            while (myQueue.Count > 0)
            {
               ValueItem it = (ValueItem) myQueue.Dequeue();
               file.WriteLine(it.item);
               file.WriteLine(it.value);
               file.WriteLine(it.time);
            }
             
      }

jerrywang168 發表於 13-1-31 11:36

D大想請教您

我收到的今天TICK到11:03如附件
我即時看E-LEADER比較方現好像只有92%

我是用i7 加上改了NDDE 的start_advise
只是沒有用單核的VM

我晚點再試看看
請問用Virtual PC 的XP Mode可以嗎?

jerrywang168 發表於 13-2-4 20:46

D大

我今天用VirtualBox 上裝XP SP3 用單核心去跑
在上面同時跑E-LEADER 後
才發現原來我之前在多核心測試的結果和單核結果一樣
是不到50%
因為中間有些只出現VOL 或只出現PRICE
如果你看我上一篇附件就知
可以請教是那出問題嗎
還是要用VM

jerrywang168 發表於 13-2-4 20:47

還是我不能用太大的QUEUE
應該改用ARRAY?
我等下改用ARRAY 明天試看看

jerrywang168 發表於 13-2-4 20:52

請問會是因為ELEADER本身DDE弱嗎

我知道我這樣改一定有點問題
因為之前我用M大的XDDE 收到的比我改的還多TICK

jerrywang168 發表於 13-2-5 23:25

大大我今天用VirtualBox + 寶來點金靈測試
OK 得到和你之前測的結果(基本上非常接近了
TICK數接近 但還沒IMPORT到MC去測試)

只是有一問題為什麼我同樣程式在WIN7下居然抓不到資料
只剩明天可測了

jerrywang168 發表於 13-2-21 20:13

d大您好

經過這幾天的測試
我找到問題了

1.您測試的結果嚴格來說是錯的
怎說呢
因為我和期交所的資料去比後發現
原來真的差很多
請參考這篇T大提供的軟體
http://www.coco-in.net/thread-19125-2-1.html

2.您說連點金靈發現資料正確是對的 這句也是正確
因為資料和點金靈比是一樣的 但實際這資料和期交所比是錯的
好像改NDDE的DLL後 我不論用單核或是多核 結果都可以正確
(明天再來測不改NDDE的DLL)

3.如果不改NDDE的DLL結果也能和點金靈一樣
那表示應該是點金靈的DDE SERVER本身較穩定
其他像ELEADER就不穩定

4.不管怎樣還是謝謝您
頁: 1 2 [3]
查看完整版本: 請問有那家付費的訊號源能有完整的TICK即時資料