kfckfc3000 發表於 16-8-23 21:11

用C# 寫 Amibroker Data Plugin

怎樣把Callback Function TickerCallBack() 和 Amibroker GetquoteEx() 聯繫在一起嗎?
就是有Ticker 到了,會自動Call Amibroker GetquoteEx() ,
好像可以subscript 這個方法,但如何把Ticker pass 給GetquoteEx() ?

static void NotifyStreamingUpdate()
{
      NativeMethods.SendMessage(DataSource.MainWnd, 0x0400 + 13000, IntPtr.Zero, IntPtr.Zero);
}

我的Ticker 來自SP Trader API,
C# plugin 是參考Github
有高手知道怎樣寫嗎, 謝謝!!

antony 發表於 16-12-30 12:07

我也是用凱基的QuoteCom,最近想要把他的資料用PlugIn的方式導到Amibroker的資料裡面,請問可以交流嗎?

lwhuang 發表於 16-8-24 20:33

本帖最後由 lwhuang 於 16-8-24 20:36 編輯

你這個問題跟C#無關,因為c也是一樣的,沒看過SP,以下以凱基為例,我相信你找的github跟我一樣,因為就只有一個
做一個dictionary
public Dictionary<string, Queue<PI20020>> PriceDict = new Dictionary<string, Queue<PI20020>>();
每次tick callback時就把價格存到裡面
Queue<PI20020> priceq;
if (!PriceDict.ContainsKey(ticker))
          PriceDict.Add(ticker, new Queue<PI20020>());

priceq = PriceDict;
priceq.Enqueue(i20020);
//inform AB price updated
Plugin.NotifyStreamingUpdate();
GetQuotesEx發生時,去那個dictionary撈資料

kfckfc3000 發表於 16-8-24 22:03

非常感謝你的回覆!!!

我們的Github是同一個,我用sp trader 作報價來源
但我還有問題關於plugin完整整合,
大哥,可以方便分享完整代碼作學習交流嗎? 謝謝!!!

kfckfc3000 發表於 16-8-25 19:21

本帖最後由 kfckfc3000 於 16-8-25 19:45 編輯

      static Quotation quote = new Quotation();

      // 這是call back method
      public static void SPTickerCallBack(ref SPApiTicker ticker)
      {
            Queue<Quotation> priceq;
            if (!PriceDict.ContainsKey(ticker.ProdCode))
                PriceDict.Add(ticker.ProdCode, new Queue<Quotation>());

            priceq = PriceDict;
            
            UpdateQuote(out quote, ref ticker);
            priceq.Enqueue(quote);
            <font color="#ff0000">//inform AB price updated</font>
            Plugin.NotifyStreamingUpdate();
      }

      public static void UpdateQuote(out Quotation quote, ref SPApiTicker ticker)
      {
            Debug.WriteLine("UpdateQuote(DateTime: " + ticker.TickerTime +
                ", ticker.Price: " + ticker.Price +
                ", ticker.Qty: " + ticker.Qty + ", ...)");

            quote.DateTime = Convert.ToUInt64(ticker.TickerTime);
            quote.Price = Convert.ToSingle(ticker.Price);
            quote.Open = 0;
            quote.High = 0;
            quote.Low = 0;
            quote.Volume = ticker.Qty;
            quote.OpenInterest = 0;
            quote.AuxData1 = 0;
            quote.AuxData2 = 0;
      }

      public static void NotifyStreamingUpdate()
      {
            NativeMethods.SendMessage(DataSource.MainWnd, 0x0400 + 13000, IntPtr.Zero, IntPtr.Zero);
      }

      
      public static unsafe int GetQuotesEx(string ticker, Periodicity periodicity, int lastValid, int size, Quotation* quotes, GQEContext* context)
      {
            Debug.WriteLine("GetQuotesEx(ticker: " + ticker + ", periodicity: " + periodicity + ", lastValid: " + lastValid + ", size: " + size + ", ...)");

            Queue<Quotation> priceq;

            if (!PriceDict.ContainsKey(ticker))
            {
                PriceDict.Add(ticker, new Queue<Quotation>());
               //如果沒有就subscript 那個symbol
                Spcommon.APIDLL.R_SPAPI_SubscribePrice(ticker, 1);
            }
            else
            {
                priceq = PriceDict;
               
                quotes.DateTime = priceq.Dequeue().DateTime;
                quotes.Open = priceq.Dequeue().Open;
                quotes.High = priceq.Dequeue().High;
                quotes.Low = priceq.Dequeue().Low;
                quotes.Price = priceq.Dequeue().Price;
                quotes.Volume = priceq.Dequeue().Volume;
                quotes.OpenInterest = priceq.Dequeue().OpenInterest;
                quotes.AuxData1 = priceq.Dequeue().AuxData1;
                quotes.AuxData2 = priceq.Dequeue().AuxData2;

                return lastValid + 1;
            }

            return lastValid;
      }


這是我的寫法,可以給給意見嗎?
同一時間subscript 多個symbol 會有問題嗎?
謝謝!!

lwhuang 發表於 16-8-27 10:22

本帖最後由 lwhuang 於 16-8-27 10:26 編輯

如果是tick資料的話,把open, high, low寫進去一樣的資料

拿完資料後要刪掉這筆
同一時間subscript 多個symbol是 sp api的能力,我不知道,但是要是沒有就太誇張了

kfckfc3000 發表於 16-8-27 10:40

SP 可以subscript 多個symbol, 我只昰擔心把tick data 接過來時,
feed 給Amibroker 做得不好, 當call GetQuoteEx, 我應該要lock dictionary 嗎?
如果lock dictionary, 會不會延遲了,我是編程新手, 謝謝!!

lwhuang 發表於 16-8-27 12:41

不用 lock 因為 producer & consumer 都只有一個
Dequeue 就會移除了,這樣你每一行都在移除,當然會是錯的。我會把那個 symbol 的所有資料都取出來
建議你先看官方的 ADK 說明,再對照官方的範例,看懂後再寫成 C#

kfckfc3000 發表於 16-8-27 23:47

就是把 Queue copy 到一個新的Array? 再把Array assign 給 quote
因為我不會C++,而且找不到一些C# real time plugin 的example,
historical 的有一些例子,所以不知道怎做,我會再看一下,謝謝!!

andrewhlleung 發表於 16-10-23 09:24

可否SHARE給我.
我找不到PLUGIN, AMIBROKDER SP TRADER用來睇即時香港期指.

antony 發表於 17-1-24 15:57

antony 發表於 16-12-30 12:07
我也是用凱基的QuoteCom,最近想要把他的資料用PlugIn的方式導到Amibroker的資料裡面,請問可以交流嗎?
...

請問一下,你用的PlugIn的Open Source 可以載入QuoteCom.com 嗎?

如: quoteCom = new Intelligence.QuoteCom(strQuoteServerHost, 8000, "API", "b6eb");

kfckfc3000 發表於 17-4-9 20:29

andrewhlleung 發表於 16-10-23 09:24
可否SHARE給我.
我找不到PLUGIN, AMIBROKDER SP TRADER用來睇即時香港期指.

不好意思,一段時間沒上來,我最後直接用DDE, 沒再折騰,謝謝!
頁: [1]
查看完整版本: 用C# 寫 Amibroker Data Plugin