winplusx 发表于 2014-7-14 21:14:42

NumericArray 能传入到dll里面吗

ptLibert 发表于 2014-7-15 14:25:42

winplusx 发表于 2014-7-14 21:14 static/image/common/back.gif
NumericArray 能传入到dll里面吗

可以啊。
不就一float指针吗,跟序列一样的

hslixuexue 发表于 2014-8-12 01:28:28

本帖最后由 hslixuexue 于 2014-8-12 01:50 编辑

以下是我根据教程,用vc2010编写的:1111.cpp的全部代码。其后注解为自己的理解。金魔方的引用公式,逐行模式下,代码是:
k1:"1111@MYMACLOSE"(5);

问题:
1、不能输出正确均线,输出一直线,全部为0;
2、函数调用参数由m_pfParam1--m_pfParam4带入,究竟带入了什么?周期?barpos?怎么判断是不是null?
3、函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,即:
m_pResultBuf[返回值] -- m_pResultBuf间为有效值.到底什么条件下返回!前面不成立(pData->m_pResultBuf = fTotal/nPeriod; ),自然返回后面的语句吗(return nPeriod-1; 以及 return -1; )?
感谢!:handshake

// 1111.cpp : 定义 DLL 的初始化例程。
#include "stdafx.h"//vc自动设定头文件
#include "1111.h"//
#define TimeType int //兼容时间,影响到typedef struct tagSPLITDATA里面TimeType m_time;        
#ifdef _DEBUG//vc自动设定
#define new DEBUG_NEW//vc自动设定
#endif//vc自动设定

//基本数据
typedef struct tagSTKDATA        
{ //C语言定义结构必须typedef struct,tag是c语言中变量标识,表明其后为变量
  //当前图形上的开高低收量额等信息传入DLL,图上没有的不纳入范围,以指针STKDATA* m_pData组成序列数据进入运算函数,长度是m_nNumData
        TimeType m_time;                // 时间,UCT
        float        m_fOpen;                //开盘,m_f,金魔方数据存储名字?
        float        m_fHigh;                //最高
        float        m_fLow;                        //最低
        float        m_fClose;                //收盘
        float        m_fVolume;                //成交量(手)
        float        m_fAmount;                //成交额(元)/持仓(未平仓合约,仅期货有效)
        WORD        m_wAdvance;                //上涨家数(仅大盘有效),WORD:一个字节8bit,2个字节为一个字,即word,2个字为双字,即dword
        WORD        m_wDecline;                //下跌家数(仅大盘有效)
} STKDATA;


//扩展数据,用于描述分笔成交数据的买卖盘
typedef union tagSTKDATAEx
{
        struct
        {
                float m_fBuyPrice;                //买1--买3价
                float m_fBuyVol;                        //买1--买3量
                float m_fSellPrice;                //卖1--卖3价        
                float m_fSellVol;                //卖1--卖3量
                DWORD m_dwToken;                        //成交方向,2个字为双字,即dword
        };
        float m_fDataEx;
} STKDATAEx;

//除权数据
typedef struct tagSPLITDATA        
{
        TimeType        m_time;                        // 时间,UCT
        float                m_fHg;                        //红股
        float                m_fPg;                        //配股
        float                m_fPgj;                        //配股价
        float                m_fHl;                        //红利
} SPLITDATA;

//扩展调用参数项结构???
typedef struct tagCALCPARAM
{
        union
        {//联合,数据对象中只对其中一个成员进行赋值
                const float m_fParam; //数值参数???
                const float* m_pfParam; //序列参数,指向一个浮点型数组???        
                const char* m_szParam; //字符串参数???
        };
        //序列参数有效起始位置
        const int        m_nParamStart;//???
}CALCPARAM;

//调用接口的信息数据结构???dll内函数调用金魔方数据接口,应该放在其他数据结构后面
typedef struct tagCALCINFO
{
        DWORD m_dwSize; //结构大小???
        DWORD m_dwVersion; //调用软件版本(V3.00 : 0x300)???
        DWORD m_dwSerial; //调用软件序列号???
        char* m_strUserName; //软件用户名???
        char* m_strStkLabel; //股票代码???
        BOOL m_bIndex; //大盘???
        int m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)???
        STKDATA* m_pData; //已定义结构:常规数据,注意:当m_nNumData==0时可能为NULL???
        STKDATAEx* m_pDataEx; //已定义结构:扩展数据,分笔成交买卖盘,注意:可能为 NULL???
        int m_nParam1Start; //参数1开始有效位置???每个m_pfParam1数组序列的有效起始位是m_nParam1Start,并非所有m_pfParam1组成的序列的有效起始位,起始位小于0表示是单值(用 *m_pfParam1 来获取)。起始位大于等于0时,是序列数据
        float*         m_pfParam1; //调用参数1,传入数据???起始位大于等于0时,有效数据为: m_pfParam1,m_pfParam1,m_pfParam1...m_pfParam1 ,通过下标表示元素
        float*         m_pfParam2; //调用参数2,传入数据???
        float*         m_pfParam3; //调用参数3,传入数据???
        float*         m_pfParam4; //调用参数4,传入数据???最多可传4个数组序列。                                
        float* m_pResultBuf; //结果缓冲区,实际上是以变量形式设置的,函数返回数值序列的存放位置,m_pResultBuf[]带下标表示序列,序列的类型是float, 长度是int m_nNumData;
        int m_dataType; //数据类型???
        float* m_pfFinData;        //财务数据???
        //以上与分析家兼容,所以沿用其结构和名称
        //以下为 FoxTrader 扩展
        DWORD m_nFncType; // function type???
        int m_nNumParam; // 调用参数数量???
        CALCPARAM* m_pCalcParam; //已定义结构:调用参数性质???
        float* m_pResultBufExt; //扩展结果缓冲区???
        int m_nResultStart; //扩展结果有效位置???
        void* m_pUserData; // 用户数据(102400字节)???
        //内部函数计算用
        int m_nParam2Start; //参数2开始有效位置???
        int m_nParam3Start; //参数3开始有效位置???
        int m_nParam4Start;        //参数4开始有效位置???               
        char* m_strStkName; //股票名称                        
        SPLITDATA* m_pSplitData; //已定义结构:除权数据                        
        int m_nNumSplitData; //除权次数               
        int m_iCurIndex;        //计算当前下标数据               
        void* m_pReserved1;//???
        void* m_pReserved2;//???
        void* m_pReserved3;//???
        void* m_pReserved4;//???
} CALCINFO;
//以上结构套结构,根据每一k线上的数据,组成一个复杂的数据库,包含了全方位的原始数据,该数据库属于每一根k线具有的属性集合

//示例函数:计算收盘价的均价。
//本函数一个常数参数,表示计算周期。
//调用方法:
//"FOXFUNC@MYMACLOSE"(5),
extern "C" __declspec(dllexport) int WINAPI MYMACLOSE(CALCINFO* pData)
{
  //extern声明其后变量为全局变量;"C"声明其后函数为C语言;
  //__declspec(dllexport)声明后面函数对外导出;WINAPI声明其后函数为Windows操作系统应用程序;
  //MYMACLOSE为DLL的函数名,最好使用全大写;CALCINFO* pData变量类型为CALCINFO的、名pData的指针变量,作为MYMACLOSE函数的参数,是函数所有数据来源;
  
        if ( pData->m_pfParam1 &&//参数1有效。&&逻辑与,前后判断为1和1,表达式取1,其余0。
                 pData->m_nParam1Start<0 &&//参数1为单值常数。->间接成员运算符,左边是结构指针变量,右边是所指的结构中的一个成员
                 pData->m_pfParam2==NULL )        //仅有一个参数
        {
                float fParam = *pData->m_pfParam1; //通过参数进行变量赋值
                int nPeriod = (int)fParam;        //变量转数据类型并赋值
                if(nPeriod>0)
                {
                        float fTotal;//定义变量
                        int i, j;//定义变量
                        for ( i = nPeriod-1; i < pData->m_nNumData; i++ )//计算nPeriod周期的均线,数据从nPeriod-1开始有效,图显区间
                        {
                                fTotal = 0.0f;//0.0f表示0.0是float,fTotal = 0.0f表示,赋值fTotal为0.0f
                                for ( j = 0; j < nPeriod; j++ ) //累加
                                        fTotal += pData->m_pData.m_fClose; //累加,m_pData为基本数据,.m_fClose是联合成员值
                            pData->m_pResultBuf = fTotal/nPeriod;  //求平均,并以序列数据方式存在设定的空间中,函数有效值将有m_pResultBuf带回
                        }
                        return nPeriod-1;//部分错误,返回第一个有效值位置???
                }
        }
        return -1;//有解释说错误或数据无效返回-1???
}


hslixuexue 发表于 2014-8-12 10:39:12

RE: 金魔方DLL接口

ptLibert 发表于 2012-9-21 14:42 static/image/common/back.gif
除了可以处理序列,DLL还能传入传出单值。
在DLL中写一段这样的代码:
然后在公式中声明:


#RunMode Run_By_Bar
extern 'FoxFunc.dll' void my_ma(NumericSeries resultArray, NumericSeries array, int n, int barpos);

这行代码金魔方编译通不过,提示dll,参数逗号分割,array出了问题,加个0,编译通过

hslixuexue 发表于 2014-8-12 12:23:53

RE: 金魔方DLL接口

ptLibert 发表于 2012-9-21 15:34 static/image/common/back.gif
其中,foxfunc.rar是DLL的c源码
dllcall.rar中是使用DLL的范例公式代码

下载的dllcall  0704  1921  版编译通不过

hslixuexue 发表于 2014-8-12 12:23:53

RE: 金魔方DLL接口

ptLibert 发表于 2012-9-21 15:34 static/image/common/back.gif
其中,foxfunc.rar是DLL的c源码
dllcall.rar中是使用DLL的范例公式代码

下载的dllcall  0704  1921  版编译通不过

ptLibert 发表于 2014-8-12 14:40:37

hslixuexue 发表于 2014-8-12 12:23 static/image/common/back.gif
下载的dllcall  0704  1921  版编译通不过

报什么错

hslixuexue 发表于 2014-8-13 13:36:54

ptLibert 发表于 2014-8-12 14:40 static/image/common/back.gif
报什么错

解决了,下了新版,谢谢

hslixuexue 发表于 2014-8-14 12:51:17

本帖最后由 hslixuexue 于 2014-8-14 12:56 编辑

ptLibert 发表于 2014-8-12 14:40 static/image/common/back.gif
报什么错
把头文件和cpp文件里面的array,全部改为array0  .
编译通过了,但是新接口,根本没反应!
#RunMode Run_By_Bar#MAINCHART

extern 'FoxFunc.dll' void my_ma(NumericSeries resultArray, NumericSeries array0, int n, int barpos);

ma1:=0;
my_ma(ma1,close,5,barpos);



hslixuexue 发表于 2014-8-14 13:25:51

ktdev 发表于 2012-12-6 20:49 static/image/common/back.gif
请把 array 改成 array1 ,array现在是关键字了

把头文件和cpp文件里面的array,全部改为array0  .
编译通过了,但是新接口,根本没反应!
#RunMode Run_By_Bar#MAINCHART

extern 'FoxFunc.dll' void my_ma(NumericSeries resultArray, NumericSeries array0, int n, int barpos);

ma1:=0;
my_ma(ma1,close,5,barpos);
页: 1 2 3 4 5 6 7 8 [9] 10
查看完整版本: 金魔方DLL接口