分享

飞狐编程:实时警告写入TXT文件

 禁忌石 2012-03-17
飞狐编程:实时预警写入TXT文件
2010-04-11 12:49
飞狐交易师特色之一,就是实时预警功能。如果我们想把预警的结果输出到外部文件,可以通过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);

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多