飛狐dll接口及實(shí)例程序
本接口同樣支持大智慧新一代!
[第一講]準(zhǔn)備的東東 1.安裝VC++ 6.0軟件 2.下載分析家C語(yǔ)言接口文件。 3.具備C++編程的知識(shí)。 如果不會(huì),自己下載教學(xué)軟件,或找本相關(guān)的書籍。 4.會(huì)分析家基本公式編寫。 如果不會(huì),在本站下載相關(guān)分析家公式編寫資料。 準(zhǔn)備好后,我開始講一個(gè)完整公式的編寫過(guò)程?! ?br>[第二講]練習(xí)編譯dll文件。 1.解包分析家c語(yǔ)言接口 2.啟動(dòng)Vc++ 點(diǎn)擊菜單[File]選Open Workspace。 選擇文件FxjFunc.dsw 3.選擇菜單[Build],選擇Build FxjFunc.dll 生成FxjFunc.dll文件。如果沒(méi)有錯(cuò)誤,顯示下面結(jié)果。 --------------------Configuration: FxjFunc - Win32 Debug-------------------- FxjFunc.dll - 0 error(s), 0 warning(s) 4.生成的FxjFunc.dll文件在D:\SUPERSTK目錄中。 如果不在當(dāng)前使用的分析家目錄,可以將FxjFunc.dll文件復(fù)制到分析家目錄中,也可以復(fù)制到飛狐 \FoxTrader\FmlDLL目錄中。 5.在飛狐或分析家建立公式,看看結(jié)果。公式只有下面一句,10日close均線。 ma1:"[email=fxjfunc@mymaclose]fxjfunc@mymaclose"(10[/email]); 如果結(jié)果正確,你已經(jīng)成功編寫了dll公式了。 在后面的講課中介紹編寫技巧。 第三講]分析家擴(kuò)展函數(shù)規(guī)范及設(shè)計(jì) 分析家擴(kuò)展函數(shù)規(guī)范如下: /////////////////////////////////////////////////////////////////////////// #ifndef __FXJFUNC_H_INCLUDE #define __FXJFUNC_H_INCLUDE /* /////////////////////////////////////////////////////////////////////////// 分析家擴(kuò)展函數(shù)規(guī)范V3.10 1.本規(guī)范適用于分析家3.10標(biāo)準(zhǔn)版和專業(yè)版公式系統(tǒng). 2.擴(kuò)展函數(shù)用于實(shí)現(xiàn)系統(tǒng)函數(shù)不能實(shí)現(xiàn)的特殊算法. 3.擴(kuò)展函數(shù)用windows 32位動(dòng)態(tài)連接庫(kù)實(shí)現(xiàn),建議使用Microsoft Visual C++編程. 4.調(diào)用時(shí)在公式編輯器中寫"動(dòng)態(tài)庫(kù)名稱@函數(shù)名稱"(參數(shù)表)即可,例如下面函數(shù)可以寫 為"[email=FXJFUNC@MYCMALOSE]FXJFUNC@MYCMALOSE"(5[/email]) 5.動(dòng)態(tài)連接庫(kù)名稱和函數(shù)名稱可以自己定義. 6.使用時(shí)可以將動(dòng)態(tài)庫(kù)拷貝到分析家目錄下使用. */ #ifdef __cplusplus extern "C" { #endif //__cplusplus /////////////////////////////////////////////////////////////////////////// //分析周期 enum DATA_TYPE { TICK_DATA=2, //分筆成交 MIN1_DATA, //1分鐘線 MIN5_DATA, //5分鐘線 MIN15_DATA, //15分鐘線 MIN30_DATA, //30分鐘線 MIN60_DATA, //60分鐘線 DAY_DATA, //日線 WEEK_DATA, //周線 MONTH_DATA, //月線 MULTI_DATA //多日線 }; /////////////////////////////////////////////////////////////////////////// //基本數(shù)據(jù) typedef struct tagSTKDATA { time_t m_time; //時(shí)間,UCT float m_fOpen; //開盤 float m_fHigh; //最高 float m_fLow; //最低 float m_fClose; //收盤 float m_fVolume; //成交量 float m_fAmount; //成交額 WORD m_wAdvance; //上漲家數(shù)(僅大盤有效) WORD m_wDecline; //下跌家數(shù)(僅大盤有效) } STKDATA; //////////////////////////////////////////////////////////////////////////// //擴(kuò)展數(shù)據(jù),用于描述分筆成交數(shù)據(jù)的買賣盤 typedef union tagSTKDATAEx { struct { float m_fBuyPrice[3]; //買1--買3價(jià) float m_fBuyVol[3]; //買1--買3量 float m_fSellPrice[3]; //賣1--賣3價(jià) float m_fSellVol[3]; //賣1--賣3量 }; float m_fDataEx[12]; //保留 } STKDATAEx; ///////////////////////////////////////////////////////////////////////////// /*財(cái)務(wù)數(shù)據(jù)順序(m_pfFinData內(nèi)容) 序號(hào) 內(nèi)容 0 總股本(萬(wàn)股), 1 國(guó)家股, 2 發(fā)起人法人股, 3 法人股, 4 B股, 5 H股, 6 流通A股, 7 職工股, 8 A2轉(zhuǎn)配股, 9 總資產(chǎn)(千元), 10 流動(dòng)資產(chǎn), 11 固定資產(chǎn), 12 無(wú)形資產(chǎn), 13 長(zhǎng)期投資, 14 流動(dòng)負(fù)債, 15 長(zhǎng)期負(fù)債, 16 資本公積金, 17 每股公積金, 18 股東權(quán)益, 19 主營(yíng)收入, 20 主營(yíng)利潤(rùn), 21 其他利潤(rùn), 22 營(yíng)業(yè)利潤(rùn), 23 投資收益, 24 補(bǔ)貼收入, 25 營(yíng)業(yè)外收支, 26 上年損益調(diào)整, 27 利潤(rùn)總額, 28 稅后利潤(rùn), 29 凈利潤(rùn), 30 未分配利潤(rùn), 31 每股未分配, 32 每股收益, 33 每股凈資產(chǎn), 34 調(diào)整每股凈資, 35 股東權(quán)益比, 36 凈資收益率 */ ///////////////////////////////////////////////////////////////////////////// //函數(shù)數(shù)據(jù)結(jié)構(gòu) typedef struct tagCALCINFO { const DWORD m_dwSize; //結(jié)構(gòu)大小 const DWORD m_dwVersion; //調(diào)用軟件版本(V2.10 : 0x210) const DWORD m_dwSerial; //調(diào)用軟件序列號(hào) const char* m_strStkLabel; //股票代碼 const BOOL m_bIndex; //大盤 const int m_nNumData; //數(shù)據(jù)數(shù)量(pData,pDataEx,pResultBuf數(shù)據(jù)數(shù)量) const STKDATA* m_pData; //常規(guī)數(shù)據(jù),注意:當(dāng)m_nNumData==0時(shí)可能為 NULL const STKDATAEx* m_pDataEx; //擴(kuò)展數(shù)據(jù),分筆成交買賣盤,注意:可能為 NULL const int m_nParam1Start; //參數(shù)1有效位置 const float* m_pfParam1; //調(diào)用參數(shù)1 const float* m_pfParam2; //調(diào)用參數(shù)2 const float* m_pfParam3; //調(diào)用參數(shù)3 const float* m_pfParam4; //調(diào)用參數(shù)3 float* m_pResultBuf; //結(jié)果緩沖區(qū) const DATA_TYPE m_dataType; //數(shù)據(jù)類型 const float* m_pfFinData; //財(cái)務(wù)數(shù)據(jù) } CALCINFO; /* 注: 1.函數(shù)調(diào)用參數(shù)由m_pfParam1--m_pfParam4帶入,若為NULL則表示該參數(shù)無(wú)效. 2.當(dāng)一個(gè)參數(shù)無(wú)效時(shí),則其后的所有參數(shù)均無(wú)效. 如:m_pfParam2為NULL,則m_pfParam3,m_pfParam4一定為NULL. 3.參數(shù)1可以是常數(shù)參數(shù)或序列數(shù)參數(shù),其余參數(shù)只能為常數(shù)參數(shù). 4.若m_nParam1Start<0, 則參數(shù)1為常數(shù)參數(shù),參數(shù)等于*m_pfParam1; 5.若m_nParam1Start>=0,則參數(shù)1為序列數(shù)參數(shù),m_pfParam1指向一個(gè)浮點(diǎn)型數(shù)組, 數(shù)組大小為m_nNumData,數(shù)據(jù)有效范圍為m_nParam1Start--m_nNumData. 在時(shí)間上m_pData[x] 與 m_pfParam1[x]是一致的 */ /////////////////////////////////////////////////////////////////////////////////// /* 函數(shù)輸出 __declspec(dllexport) int xxxxxxxx(CALCINFO* pData); ---------- A __declspec(dllexport) int xxxxxxxxVAR(CALCINDO* pData); ---------- B 1.函數(shù)名稱需全部大寫. 2.函數(shù)必須以上述A,B兩種形式之一聲明,請(qǐng)用實(shí)際函數(shù)名稱替代xxxxxxxx; 對(duì)于C++程序還需包括在 extern "C" { } 括號(hào)中. 3.上述形式A用于聲明不帶參數(shù)或全部參數(shù)為常數(shù)的函數(shù); 形式B用于聲明參數(shù)1為序列數(shù)的函數(shù);兩種函數(shù)的區(qū)別在于后者以VAR結(jié)尾. 4.函數(shù)計(jì)算結(jié)果用pData->m_pResultBuf帶回. 5.函數(shù)返回-1表示錯(cuò)誤或全部數(shù)據(jù)無(wú)效,否則返回第一個(gè)有效值位置,即: m_pResultBuf[返回值] -- m_pResultBuf[m_nNumData-1]間為有效值. 6.函數(shù)名稱長(zhǎng)度不能超過(guò)15字節(jié),動(dòng)態(tài)連接庫(kù)文件名不能超過(guò)9字節(jié)(不包括擴(kuò)展名),動(dòng)態(tài)庫(kù)名稱不能叫 SYSTEM,EXPLORER 7.編譯時(shí)請(qǐng)請(qǐng)選擇1字節(jié)對(duì)齊 */ //示例函數(shù),使用時(shí)用實(shí)際名稱替換 __declspec(dllexport) int WINAPI MYMACLOSE(CALCINFO* pData); __declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData); __declspec(dllexport) int WINAPI MYMACLOSE_CALC_PREV(CALCINFO* pData); __declspec(dllexport) int WINAPI MYMAVAR_CALC_PREV(CALCINFO* pData); #ifdef __cplusplus } #endif //__cplusplus #endif //__FXJFUNC_H_INCLUDE //////////////////////////////////////////////////////////////////////// 分析家的數(shù)據(jù)結(jié)構(gòu)見上面。 //基本數(shù)據(jù) typedef struct tagSTKDATA { time_t m_time; //時(shí)間,UCT float m_fOpen; //開盤 float m_fHigh; //最高 float m_fLow; //最低 float m_fClose; //收盤 float m_fVolume; //成交量 float m_fAmount; //成交額 WORD m_wAdvance; //上漲家數(shù)(僅大盤有效) WORD m_wDecline; //下跌家數(shù)(僅大盤有效) } STKDATA; 在前一講中,求均線ma(c,x),是用收盤價(jià),我們可以改成中值(h+l+c)/3的均線。 將FxjFunc.cpp程序中 fTotal += pData->m_pData[i-j].m_fClose; 改為 fTotal=fTotal + ( pData->m_pData[i-j].m_fClose+ pData->m_pData[i-j].m_fLow+ pData->m_pData [i-j].m_fHigh )/3; 將上面接口規(guī)范看懂后,你可以創(chuàng)作各種函數(shù)。 當(dāng)將你公式中的一些分析家函數(shù)替換成dll中的函數(shù),可以實(shí)現(xiàn)簡(jiǎn)單的加密。 另一方面,使用dll文件讀取數(shù)據(jù),是沒(méi)有經(jīng)過(guò)精度轉(zhuǎn)換的原始記錄數(shù)據(jù),有助 于精確分析。此外用c++編寫公式可以使用循環(huán),遍歷等很多分析家所不能實(shí)現(xiàn) 的功能。 [第四講]公式中的數(shù)據(jù)傳遞 一.dll公式計(jì)算的結(jié)果如何返回到分析家中 dll函數(shù)計(jì)算結(jié)果用pData->m_pResultBuf帶回. 也就是說(shuō)dll函數(shù)必須有值返回。 函數(shù)返回-1表示錯(cuò)誤或全部數(shù)據(jù)無(wú)效,否則返回第一個(gè)有效值位置,即: m_pResultBuf[返回值] -- m_pResultBuf[m_nNumData-1]間為有效值. 例如上例:i表示當(dāng)前所計(jì)算的周期。 pData->m_pResultBuf = fTotal/nPeriod; 全部數(shù)據(jù)為m_nNumData組。超過(guò)會(huì)出現(xiàn)錯(cuò)誤。數(shù)據(jù)下標(biāo)從0開始到m_nNumData-1二.分析家中公式的參數(shù)如 何傳遞到dll公式。 1.函數(shù)調(diào)用參數(shù)由m_pfParam1--m_pfParam4帶入,若為NULL則表示該參數(shù)無(wú)效. 2.當(dāng)一個(gè)參數(shù)無(wú)效時(shí),則其后的所有參數(shù)均無(wú)效. 如:m_pfParam2為NULL,則m_pfParam3,m_pfParam4一定為NULL. 3.參數(shù)1可以是常數(shù)參數(shù)或序列數(shù)參數(shù),其余參數(shù)只能為常數(shù)參數(shù). 4.若m_nParam1Start<0, 則參數(shù)1為常數(shù)參數(shù),參數(shù)等于*m_pfParam1; 5.若m_nParam1Start>=0,則參數(shù)1為序列數(shù)參數(shù),m_pfParam1指向一個(gè)浮點(diǎn)型數(shù)組,數(shù)組大小為m_nNumData, 數(shù)據(jù)有效范圍為m_nParam1Start--m_nNumData.在時(shí)間上m_pData[x] 與 m_pfParam1[x]是一致的 在參數(shù)上,分析家不如飛狐交易師靈活。分析家只允許1個(gè)變化序列數(shù)據(jù),飛狐可以允許四個(gè)變化序列數(shù) 據(jù)。三.公式的設(shè)計(jì)和使用 1.調(diào)用時(shí)在公式編輯器中寫"動(dòng)態(tài)庫(kù)名稱@函數(shù)名稱"(參數(shù)表)即可,例如下面函數(shù)可以寫 為"[email=FXJFUNC@MYCMALOSE]FXJFUNC@MYCMALOSE"(5[/email]) 2.動(dòng)態(tài)連接庫(kù)名稱和函數(shù)名稱可以自己定義. 3.使用時(shí)可以將動(dòng)態(tài)庫(kù)拷貝到分析家目錄下使用. 分析家在SUPERSTK目錄中 飛狐在FoxTrader\FmlDLL目錄中例子:在公式接口中有,這個(gè)例子告訴你如何使用兩個(gè)參數(shù)。 //計(jì)算均價(jià),2個(gè)參數(shù),參數(shù)1為待求均線的數(shù)據(jù),參數(shù)2表示計(jì)算周期 //調(diào)用方法: // MYMAVAR(CLOSE-OPEN,5) __declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData) { float f,fTotal; const float* pvalue; int nPeriod,nFirst,i,j; if(pData->m_pfParam1 && pData->m_pfParam2 && //參數(shù)1,2有效 pData->m_nParam1Start>=0 && //參數(shù)1為序列數(shù) pData->m_pfParam3==NULL) //有2個(gè)參數(shù) { pvalue = pData->m_pfParam1; //參數(shù)1 nFirst = pData->m_nParam1Start; //有效值 f = *pData->m_pfParam2; nPeriod = (int)f; //參數(shù)2 if(nFirst>=0 && nPeriod>0) { for(i=nFirst+nPeriod-1;i<pData->m_nNumData;i++) { fTotal = 0.0f; for(j=0;j<nPeriod;j++) //累加 fTotal += pData->m_pData[i-j].m_fClose; pData->m_pResultBuf = fTotal/nPeriod; //平均 } return nFirst+nPeriod-1; } } return -1; }大家可以參照上例來(lái)設(shè)計(jì)自己的dll公式。實(shí)際上我設(shè)計(jì)公式也是從看懂例 |
|