|
飛狐交易師特色之一,就是實時預警功能。如果我們想把預警的結(jié)果輸出到外部文件,可以通過DLL編程來實現(xiàn)。這樣的編程,對于有過編程經(jīng)驗的人來說--應該不是很難:知道如何利用C++讀寫文件,就可完成該功能。
DLL之C++原碼:(7月26日更新) //************************************************************************************************ // 把符合條件的股票資料,添加到指定的TXT文件; // 輸入2個常數(shù)參數(shù): // 參數(shù)1: 文件名序號,1:輸出到"巔峰飛越.TXT"...... // 參數(shù)2: 預警k線的序號 // 調(diào)用方法: // "FOXFUNC@TWRITE"(1,1)
__declspec(dllexport) int WINAPI TWRITE(CALCINFO* pData) { if(pData->m_pfParam1 && pData->m_pfParam2 && //參數(shù)1,2有效 pData->m_nParam1Start<0 && //參數(shù)1為常數(shù) pData->m_pfParam3==NULL) //有2個參數(shù) { float fParam1 = *pData->m_pfParam1; //參數(shù)1: 文件名編號 float fParam2 = *pData->m_pfParam2; //參數(shù)2: 預警k線的序號 int nName = (int)fParam1; int nBars = (int)fParam2;
char a[128] ; if(nName==1) strcpy(a,"巔峰飛越"); else if (nName==2) strcpy(a,"曙光初露"); else strcpy(a,"明日之星"); //... ... time_t k_now; k_now = pData->m_pData[nBars-1].m_time; //K線時間 struct tm *Klocal; Klocal=localtime(&k_now); char CDate[40]; strftime(CDate,100,"%m%d",Klocal); strcat(a,CDate); strcat(a,".txt");
const char *stkp = pData->m_strStkLabel; const char *stkNm = pData->m_strStkName; //股票代碼也可以轉(zhuǎn)換到CHAR數(shù)組: char stkNo[6],stkName[12]; strcpy(stkNo, stkp); strcpy(stkName, stkNm);
//打開文件 fstream File((char *)a,ios::in | ios::out |ios::app); //添加紀錄 File << stkNo <<"\t"<<stkName<<"\t";
char Ctime[40],Cprice[20]; strftime(Ctime,100,"%x %X",Klocal); File << Ctime <<"\t";
float fclose = 0.0; fclose = pData->m_pData[nBars-1].m_fClose; sprintf(Cprice, "%-5.2f", fclose); File << Cprice <<"\n"; File.close();
} return -1; }
DLL程序編譯后,在飛狐公式中如何調(diào)用呢?
當然,我們希望在滿足某個條件時,才激活數(shù)據(jù)輸出的動作。于是,我們想到飛狐的條件語句: IF...THEN... 但是,使用該語句時要特別小心,因為初學者常常遇到代碼不能通過的情況,其后往往又百思不得其解......關(guān)鍵的問題,就是IF后面跟著的條件,不能是序列變量......但可以是序列變量中某個元素的值
正確的寫法: TOTAL:= ......選股的某些條件......; //注:TOTAL此時就是序列變量 IF TOTAL[datacount] THEN wr:="FOXFUNC@TWRITE"(1,datacount]);
而下面的代碼,是不能通過的: TOTAL:= ......選股的某些條件......; IF TOTAL THEN wr:="FOXFUNC@TWRITE"(1,datacount]);
如果條件選股: TOTAL:= ......選股的某些條件......; for i=1 to datacount do IF (TOTAL[i]) THEN wr:="FOXFUNC@TWRITE"(1,i); |