飞狐交易师特色之一,就是实时预警功能。如果我们想把预警的结果输出到外部文件,可以通过DLL编程来实现。这样的编程,对于有过编程经验的人来说--应该不是很难:知道如何利用C++读写文件,就可完成该功能。
DLL之C++原码:(7月26日更新) //************************************************************************************************ // 把符合条件的股票资料,添加到指定的TXT文件; // 输入2个常数参数: // 参数1: 文件名序号,1:输出到"巅峰飞越.TXT"...... // 参数2: 预警k线的序号 // 调用方法: // "FOXFUNC@TWRITE"(1,1)
__declspec(dllexport) int WINAPI TWRITE(CALCINFO* pData) { if(pData->m_pfParam1 && pData->m_pfParam2 && //参数1,2有效 pData->m_nParam1Start<0 && //参数1为常数 pData->m_pfParam3==NULL) //有2个参数 { float fParam1 = *pData->m_pfParam1; //参数1: 文件名编号 float fParam2 = *pData->m_pfParam2; //参数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; //股票代码也可以转换到CHAR数组: 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程序编译后,在飞狐公式中如何调用呢?
当然,我们希望在满足某个条件时,才激活数据输出的动作。于是,我们想到飞狐的条件语句: IF...THEN... 但是,使用该语句时要特别小心,因为初学者常常遇到代码不能通过的情况,其后往往又百思不得其解......关键的问题,就是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); |