调用大智慧dll,简单支持大智慧公式dll接口_公式编辑教程_股票公式
  您的位置:首页 >> 股票公式 >> 公式编辑教程 >> 文章正文

调用大智慧dll,简单支持大智慧公式dll接口

加入日期:2020-1-5 21:17:25

  顶尖财经网(www.58188.com) 股票公式源码交流:

网上看到一个分享贴,说可以调用大智慧公式,只是我没有看懂要如何使用。
 
请问类似这样的调用是要写到哪里,自己的dll里面还是大智慧里面?
 
XDll_Free(Dll相对路径文件名);//释放动态链接库
XDll_Load(Dll相对路径文件名);//加载动态链接库

////////////////////////////////////////////////////////

 次源自客户定制需要,考虑再三,决定支持大智慧公式dll接口

 
大智慧公式dll语言规约和分析家一样.
 
算是给大家的节礼物
 
调用大智慧/分析家公式dll接口函数
 
在调用函数之前要创建缓冲区,并从对应历史数据接口填充k线数据
这个与历史数据接口对应的缓冲区,数据长度固定为480,配有10个输入输出缓冲区,
用作调用dll具体公式函数是时输入输出缓冲区
 
XDll_Free(Dll相对路径文件名);//释放动态链接库
XDll_Load(Dll相对路径文件名);//加载动态链接库
 
功能:释放或加载动态链接库
 
参数:Dll相对路径文件名
 
例如:XDll_Load("autop\qml\xxxxx.dll");
 
XDll_Exec(Dll相对路径文件名,
函数名,K线缓冲区序号,输出缓冲区序号,
参数1有效位置,参数1,参数2,参数3,参数4);//调用库函数
 
功能:调用库函数
 
参数:
 
1.Dll相对路径文件名
2.函数名(dll完全出口函数名,例如在大智慧中是macd,一般完全函数名是_macd)
3.K线缓冲区序号 指的是与历史数据库接口相对应k线数据缓冲区的序号0,1,2
4.输出缓冲区序号(可省) 指定调用库函数的输出缓冲区的序号,为0--9(可以是10个输入输出缓冲区中的任何一个)
默认为0
5.参数1有效位置(可省) 当有参数1时设定参数1的性质,<0时指定参数1是常数输入,这时参数1就是输入数据
当其>=0时,参数1就是选定做输入缓冲区的输入输出缓冲区序号,在库函数调用前一定要设置好预定数据
本参数值指定该系列输入数据的有效起始位置
6.参数1  输入参数,当其明确输入时,与上一参数配合,省略时,库函数调用输入参数为空
6.参数2,参数3,参数4 输入参数,当其明确输入时,将作为库函数调用参数,省略时,库函数对应调用参数为空
 
 
例如:XDll_Exec("autop\qml\xxxxx.dll","_kxian",0,0);//调用库函数
 
 
XDll_DBufDelete();//删除历史数据接口对应k线数据缓冲区
XDll_DBufCreate(开始位置,结束位置);//创建历史数据接口对应k线数据缓冲区,并调入数据
XDll_GetKXData(数据索引,k线数据编号0.t.1.o.2.h.3.l.4.c.5.v);//获取历史数据接口对应k线数据缓冲区数据
XDll_GetIOData(输入输出数据缓冲区号0..9,数据索引);//获取历史数据接口对应数据缓冲区数据
XDll_SetIOData(输入输出数据缓冲区号0..9,数据索引,数据);//设置历史数据接口对应数据缓冲区数据
XDll_CopyIOData(源缓冲区号,目的缓冲区号);//拷贝历史数据接口对应数据缓冲区数据
XDll_ClearIOData(缓冲区号);//清除历史数据接口对应数据缓冲区数据
 
 
功能:历史数据接口对应k线数据缓冲区操作,具体功能看上面标示
 
参数:
 
1.开始位置 对应历史数据接口中的数据开始位置
2.结束位置 对应历史数据接口中的数据结束位置,-1时将直接取值为最后位置
当开始与结束位置的k线根数大于480时,系统会自动将开始位置裁剪为结束位置-450
3 数据索引 等同历史数据库接口索引
4.其他参数同表面意思
 
 
注意:
XDll_DBufCreate函数可以连续调入,并填入数据,其返回值为新的数据根数
在程序中可用
if(XDll_DBufCreate(0,-1))
{
XDll_Exec("autop\qml\xxxxx.dll","_kxian",0,0);//调用库函数 //
.....
}
 
简单测试代码为:
 
OpenLsLib("m1005",64,4,0);
XDll_DBufCreate(0,-1);//创建历史数据接口对应k线数据缓冲区,并调入数据
XDll_Load("autop\qml\xxxxx.dll");//加载动态链接库
XDll_Exec("autop\qml\xxxxx.dll","_kxian",0,0);//调用库函数
......................
 
int m_daya=XDll_GetIOData(0,m_dsp_dir);
 
 
 
#ifndef __DzhFUNC_H_INCLUDE
#define __DzhFUNC_H_INCLUDE
 
 
 
#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 //多日线
};
 
///////////////////////////////////////////////////////////////////////////
//基本数据
 
typedef struct tagSTKDATA
{
time_t m_time; //时间,UCT
float m_fOpen; //开盘
float m_fHigh; //最高
float m_fLow; //最低
float m_fClose; //收盘
float m_fVolume; //成交量
float m_fAmount; //成交额
WORD m_wAdvance; //上涨家数(仅大盘有效)
WORD m_wDecline; //下跌家数(仅大盘有效)
} STKDATA;
 
 
////////////////////////////////////////////////////////////////////////////
//扩展数据,用于描述分笔成交数据的买卖盘
 
typedef union tagSTKDATAEx
{
struct
{
float m_fBuyPrice[3]; //买1--买3价
float m_fBuyVol[3]; //买1--买3量
float m_fSellPrice[3]; //卖1--卖3价
float m_fSellVol[3]; //卖1--卖3量
};
float m_fDataEx[12]; //保留
} STKDATAEx;
 
/////////////////////////////////////////////////////////////////////////////
 
 
/////////////////////////////////////////////////////////////////////////////
//函数数据结构
 
typedef struct tagCALCINFO
{
const DWORD m_dwSize; //结构大小
const DWORD m_dwVersion; //调用软件版本(V2.10 : 0x210)
const DWORD m_dwSerial; //调用软件序列号
const char* m_strStkLabel; //股票代码
const BOOL m_bIndex; //大盘
 
const int m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)
const STKDATA* m_pData; //常规数据,注意:当m_nNumData==0时可能为 NULL
const STKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为 NULL
 
const int m_nParam1Start; //参数1有效位置
const float* m_pfParam1; //调用参数1
const float* m_pfParam2; //调用参数2
const float* m_pfParam3; //调用参数3
const float* m_pfParam4; //调用参数3
 
float* m_pResultBuf; //结果缓冲区
const DATA_TYPE m_dataType; //数据类型
const float* m_pfFinData; //财务数据
} CALCINFO;
 
 
 
 
///////////////////////////////////////////////////////////////////////////////////
 
 
//示例函数,使用时用实际名称替换
__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 //__DZHFUNC_H_INCLUDE
 
// FxjFunc.cpp : Defines the entry point for the DLL application.
//
 
#include "stdafx.h"
#include "FxjFunc.h"
 
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
 
//计算收盘价的均价,一个常数参数,表示计算周期
//调用方法:
// MYMACLOSE(5)
 
__declspec(dllexport) int WINAPI MYMACLOSE(CALCINFO* pData)
{
float f,fTotal;
int nPeriod,i,j;
if(pData->m_pfParam1 && //参数1有效
pData->m_nParam1Start<0 && //参数1为常数
pData->m_pfParam2==NULL) //仅有一个参数
{
f = *pData->m_pfParam1;
nPeriod = (int)f; //参数1
if(nPeriod>0)
{
for(i=nPeriod-1;i<pData->m_nNumData;i++) //计算nPeriod周期的均线,数据从nPeriod-1开始有效
{
fTotal = 0.0f;
for(j=0;j<nPeriod;j++) //累加
fTotal += pData->m_pData[i-j].m_fClose;
pData->m_pResultBuf[i] = fTotal/nPeriod; //平均
}
return nPeriod-1;
}
}
return -1;
}
 
__declspec(dllexport) int WINAPI MYMACLOSE_CALC_PREV(CALCINFO* pData)
{
if(pData->m_pfParam1 && pData->m_nParam1Start<0)
{
float f = *pData->m_pfParam1;
return ((int)f) - 1;
}
return 0;
}
 
//计算均价,2个参数,参数1为待求均线的数据,参数2表示计算周期
//调用方法:
// 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 && //参数1,2有效
pData->m_nParam1Start>=0 && //参数1为序列数
pData->m_pfParam3==NULL) //有2个参数
{
pValue = pData->m_pfParam1; //参数1
nFirst = pData->m_nParam1Start; //有效值
f = *pData->m_pfParam2;
nPeriod = (int)f; //参数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[i] = fTotal/nPeriod; //平均
}
return nFirst+nPeriod-1;
}
}
return -1;
}
 
__declspec(dllexport) int WINAPI MYMAVAR_CALC_PREV(CALCINFO* pData)
{
if(pData->m_pfParam2)
{
float f = *pData->m_pfParam2;
return ((int)f) - 1;
}
return 0;
}

编辑: 来源: