請選擇 進入手機版 | 繼續訪問電腦版

COCO研究院

 找回密碼
 註冊
搜索
查看: 2215|回復: 3

[API] 不用滴滴咿改寫吸嘉嘉感覺好帥(ADK)

[複製鏈接]
上次把模擬資料用DDE打到EXCEL上

再用AmiBroker的Plug-In去收雖然用C#寫蠻簡單的(ptid=145893 #8樓)

但是有個EXCEL有時還是感覺很礙眼,還有DDE的欄位設定囉唆又難看

之前也看ADK說VC6和DevC可以用,只是不知怎麼開始

寫程式總是看別人寫出來後覺得簡單,自己要從頭開始寫都覺得很難

終於孤狗到一個可用的ADK資料,看起來就是和以前舊公司所收藏的到的API有關

總是要有個起頭,想說街口轉1000索討試試看無妨,就收到了網頁所描述神奇的C++專案程式源碼了

先把bin的dll丟進AmiBroker的Plugins的資料夾內,有vc,devc,bcb好幾個版本,先試其中一個32位元的

果然順利在AmiBroker上可以查看到

Plugin查看

點擊載入圖片


加入新的database觀察看看,確實可以選擇這個資料源

不過這個資料源要載入另一個dll不存在,所以出現訊息提示

就把之前接收模擬資訊源用的dll丟進去AB的安裝資料夾內

重開AB,還是有錯誤,原來是我的dll太舊了

不支援功能的訊息

點擊載入圖片

原來是dll版本太舊的樣子

點擊載入圖片


不過上面的種種現象說明這個ADK開發的plugin是可以運作的,所以就來研究程式碼吧!

因為這份ADK的IDE有很多版,想說就在這台AB的測試虛機中下載了小小的DevC

這個不用安裝,硬碟只吃60MB,把專案一開,居然是這樣寫

DevC的ADK專案

點擊載入圖片


最重要的是按了編譯就真的出來新的dll了,這也表示值得花時間看下去

這個看下去我看了很久,看了好多天就不用說出來笑了

重點是我改成功了,看影片
AB-RealtimeADK.rar (38.98 KB, 下載次數: 7, 售價: 1 金錢)



上一篇︰跪求每日接DDE報價的台指指數與筆差數據
下一篇︰【2019年01月28日~2019年02月01日元富期貨國際金融焦點數據】
 樓主| 發表於 19-1-29 09:34|載入全部圖片 | 顯示全部樓層
kuolung 發表於 19-1-28 20:56
最核心的 getquoteex 的程式沒 show 出來

WOW
kuolung大來出考題了

不過這比較像是考我的抄襲能力耶

其實像上次用EXCEL作皮看報價,現在換用AB作皮而已

如果會收行情,收行情那塊就能把需要的資料都弄齊也能寫檔不會有什麼問題

也就是收行情本身也是能獨立運作的,AB是平行作業再收一份行情

這樣收行情與存檔的部分才不會因為AB要開開關關而受影響

看kuolung大也是另寫server,AB則透過server收行情與回補這也是相同的概念吧!

模擬資訊源那種行情源原本就有TickWriter可紀錄Tick,

要組成各種cycle的KD或轉成歷史也都沒什麼問題

所以如果存檔就在AB跑的PC上,那GetQuotesEx就是讀檔回補就可以了

很多情況下我只有想要報價而已,歷史對我來說沒什麼意義

在這裡就表現一下程式大概怎麼寫的想法,不然太過累贅就又不好讀了

以網路這份資料 webrtqt.fortunengine.com.tw/rtdata/k-chart/day-2330.txt 存檔作示範

用之前nes大那個CsvReader的dll,抄這份程式碼的作法

弄成很獨立完整加入就可以用的程式碼,像這樣(原本ADK的註解也保留)

  1. typedef long (WINAPI *pWWXfunc_demoTest_LoadFile)(char *TxtFile);
  2. static char WWXfunc_demoTest_LoadFile[] = "demoTest_LoadFile";/* DLL中對應的API名稱 */

  3. typedef long (WINAPI *pWWXfunc_demoTest_ParserCsvLine)(long LineNo);
  4. static char WWXfunc_demoTest_ParserCsvLine[] = "demoTest_ParserCsvLine";/* DLL中對應的API名稱 */

  5. typedef char * (WINAPI *pWWXfunc_demoTest_GetField)(long FieldIndex);
  6. static char WWXfunc_demoTest_GetField[] = "demoTest_GetField";/* DLL中對應的API名稱 */

  7. //啟用指定函數
  8. WWXfunc_DllFuncAdd(demoTest_LoadFile)
  9. WWXfunc_DllFuncAdd(demoTest_ParserCsvLine)
  10. WWXfunc_DllFuncAdd(demoTest_GetField)

  11. #define CsvReadDllLibSource "CsvReader_x32.dll"

  12. HMODULE hmCsvRead = NULL;

  13. //////////////////////////////////////
  14. // GetQuotesEx is a most important function
  15. // for every data plugin
  16. // it is called by AmiBroker everytime AmiBroker
  17. // needs new data for given symbol.
  18. //
  19. // Internally AmiBroker caches response obtained
  20. // from GetQuotes function but you may force it to
  21. // get new data by sending appropriate message to AmiBroker
  22. // main window.
  23. //
  24. //
  25. // When AmiBroker calls GetQuotes function it allocates
  26. // array of quotations of size equal to default number of bars as set in
  27. // File->Database Settings,
  28. // and fills the array with quotes that are already present in the
  29. // database.
  30. // Filled area covers array elements from zero to nLastValid
  31. //
  32. // In your DLL you can update the array with more recent quotes.
  33. // Depending on the data source you can either fill entire array
  34. // from the scratch (Metastock, TC2000, QP2 plugins do that)
  35. // or just add/update a few recent bars and leave the remaining bars
  36. // untouched (eSignal, myTrack, QuoteTracker plugins do that)

  37. // GetQuotesEx function is functional equivalent fo GetQuotes but
  38. // handles new Quotation format with 64 bit date/time stamp and floating point volume/open int
  39. // and new Aux fields
  40. // it also takes pointer to context that is reserved for future use (can be null)
  41. // Called by AmiBroker 5.27 and above
  42. PLUGINAPI int GetQuotesEx( LPCTSTR pszTicker, int nPeriodicity, int nLastValid, int nSize, struct Quotation *pQuotes, GQEContext *pContext  )
  43. {
  44.         //AFX_MANAGE_STATE( AfxGetStaticModuleState() );

  45.         if (!hmCsvRead)
  46.         {
  47.                 hmCsvRead = LoadLibrary(CsvReadDllLibSource);
  48.                 if (hmCsvRead)
  49.                 {
  50.                         WWXfunc_DllImport(hmCsvRead, demoTest_LoadFile);
  51.                         WWXfunc_DllImport(hmCsvRead, demoTest_ParserCsvLine);
  52.                         WWXfunc_DllImport(hmCsvRead, demoTest_GetField);
  53.                 }
  54.         }//這段載入dll對應api的部分應該寫在Init()那邊就好,放這邊是便於看懂關聯性

  55.         if (strcmp(pszTicker, "2330"))
  56.                 return 0;

  57.         if (hmCsvRead)
  58.         {
  59.                 if (nLastValid < 0)
  60.                 {
  61.                         long LineCount = demoTest_LoadFile("2330.txt.csv");
  62.                         if (nSize > LineCount)
  63.                         {
  64.                                 long i;
  65.                                 for (i = LineCount; --i > 0; )
  66.                                 {
  67.                                         if (demoTest_ParserCsvLine(i) > 7)//IndexDate,Date,Open,High,Low,Close,Volume
  68.                                         {
  69.                                                 int year,mon,day;
  70.                                                 if (sscanf(demoTest_GetField(1), "%04d/%02d/%02d", &year, &mon, &day) == 3)
  71.                                                 {
  72.                                                         nLastValid = atol(demoTest_GetField(0)) - 1;
  73.                                                         //pQuotes[ nLastValid ].DateTime.Date;

  74.                                                         //時間
  75.                                                         pQuotes[ nLastValid ].DateTime.Date                = DAILY_MASK; // EOD
  76.                                                         struct PackedDate &DateTime = pQuotes[ nLastValid ].DateTime.PackDate;
  77.                                                         DateTime.Year                = year;
  78.                                                         DateTime.Month                = mon;
  79.                                                         DateTime.Day                = day;
  80.                                                         DateTime.Hour                = 14;
  81.                                                         DateTime.Minute                = 30;
  82.                                                         DateTime.Second                = 0;
  83.                                                         DateTime.MilliSec        = 0;
  84.                                                         DateTime.MicroSec        = 0;

  85.                                                         //KD
  86.                                                         Set_float(pQuotes[ nLastValid ].Open        , demoTest_GetField(2)        );
  87.                                                         Set_float(pQuotes[ nLastValid ].High        , demoTest_GetField(3)        );
  88.                                                         Set_float(pQuotes[ nLastValid ].Low                , demoTest_GetField(4)        );
  89.                                                         Set_float(pQuotes[ nLastValid ].Price        , demoTest_GetField(5)        );
  90.                                                         //pQuotes[ nLastValid ].OpenInterest;
  91.                                                         Set_float(pQuotes[ nLastValid ].Volume        , demoTest_GetField(6)        );
  92.                                                         //pQuotes[ nLastValid ].AuxData1;
  93.                                                         //pQuotes[ nLastValid ].AuxData2;
  94.                                                 }
  95.                                         }
  96.                                 }
  97.                                 return ++nLastValid;
  98.                         }
  99.                 }
  100.         }
  101.         return 0;
  102. }
複製代碼

於AB上出來就是這樣

2330 2019-09-28收盤

點擊載入圖片


由DataWindow對照網頁內容
IndexDateDateOpenHighLowCloseVolume
15
2017/2/2
188
188.5
184
184.5
153703
右邊紅色的的量是最後一根(2019-01-28)
IndexDateDateOpenHighLowCloseVolume
510
2019/1/28
229.5
229.5
228
229
25986

其實這裡並不難,如果收行情那裡就直接用ADK的struct Quotation格式保存了資料

那GetQuotesEx可能就也只是以assign為主,頂多考慮各種KD是否要在這裡組出來

就像行情那裡也是,因為收行情那裡直接用ADK的struct RecentInfo保存資料,

所以GetRecentInf簡單成這樣
  1. PLUGINAPI struct RecentInfo * GetRecentInfo( LPCTSTR pszTicker )
  2. {
  3.         if (hmDbfTCdll)
  4.         {
  5.                 RecentItemRefer *spRecentRefer = GetRecentItemRefer(pszTicker);
  6.                 if (spRecentRefer)
  7.                         return &(spRecentRefer->spRecentItem->sRecentInfo);
  8.         }
  9.         return NULL;
  10. }
複製代碼

考慮線圖Tick進來則大概是這樣的作法,在行情這邊通知AB來重撈資料
  1. PLUGINAPI struct RecentInfo * GetRecentInfo( LPCTSTR pszTicker )
  2. {
  3.         if (bTickNotify)
  4.         {
  5.                 bTickNotify = false;
  6.                 PostMessage( g_hAmiBrokerWnd, WM_USER_STREAMING_UPDATE, 0, 0 );
  7.         }

  8.         if (hmDbfTCdll)
  9.         {
  10.                 RecentItemRefer *spRecentRefer = GetRecentItemRefer(pszTicker);
  11.                 if (spRecentRefer)
  12.                         return &(spRecentRefer->spRecentItem->sRecentInfo);
  13.         }

  14.         return NULL;
  15. }
複製代碼

東抄西抄的...這份作業花了我好多時間阿


發表於 19-1-29 10:49|載入全部圖片 | 顯示全部樓層
高手推,不過標題讓我以為這篇文是什麼怪怪的東西  
發表於 19-1-30 22:51|載入全部圖片 | 顯示全部樓層
kuolung 發表於 19-1-30 07:31
我那是出考題啊 我只最近被群益的 skcom.dll 害慘了 想回來用 元大的 想說有人已經寫好了 就不用自己傷腦 ...

我還要感謝您提供了群益的 skcom.dll ,讓我可以去玩[API] 群益 API 2.13.9 C# 實作 。這畫面就是美呀,看起來好專業!


群益 API 2.13.9 C# 實作

群益 API 2.13.9 C# 實作
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

手機版|Archiver|站長信箱|廣告洽詢|COCO研究院  |網站地圖

GMT+8, 19-8-23 21:31

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表
理財討論網站 | 優質玻尿酸隆鼻 專業皮膚科診所 推薦電波拉皮效果 優質淨膚雷射效果 推薦微晶瓷隆鼻 | 徵信社精選| SEO優化|