您现在的位置:程序化交易>> 期货公式>> 金字塔等>> 金字塔知识>>正文内容

VBS自动化调用C++,C++ OLE异常,求救! [金字塔]

  • 咨询内容: 基本情况:
    我是用图表指标逐K线调用VBS,VBS主要用Gethistorydata取5s数,给C++,复杂的逻辑计算放在C++里头。同时C++里头拟调用数据库 SQlite。 
    这么做的原因是,模型不成熟,最好还是用图表可以观察观察。同时因为计算量大,所以之前VBS+access的效率不可用,所以想挪到C++里,也换轻型的内存数据库 SQlite。同时也可以利用VBS的Order之类的,以后换成Adi,或者DLL改动也少。
    测试环境:
    WIN7 64位,VS2008+SP1,Debug 32,金字塔 2.962可调试版本

    程序如下:
    PEL:   R_INIT:= INIT_1(1540);
    VBS: 
    Function INIT_1(Formula,N)
        INIT_1=0       Set Grid = Formula.ParentGrid    Set History = Grid.GetHistoryData        daysnumber = DateDiff("d", #1/1/1970# , History.date(0) )    time_temp = right(History.date(0),8)    timesnumber = 60*60*hour(time_temp)+ 60* minute(time_temp) + second(time_temp)               date_5s = daysnumber    time_5s = timesnumber     open_5s = History.open(0)    close_5s = History.close(0)    high_5s = History.high(0)    low_5s = History.low(0)             date_1m =  daysnumber  ‘一分钟与5分钟暂用5秒的代替    time_1m = timesnumber     open_1m = History.open(0)    close_1m = History.close(0)    high_1m = History.high(0)    low_1m = History.low(0)         date_5m = daysnumber    time_5m = timesnumber     open_5m = History.open(0)    close_5m = History.close(0)    high_5m = History.high(0)    low_5m =  History.low(0)        Set MyAddin = CreateObject("MyActiveXDemo.VBSAddin")
        call MyAddin.INIT_1(date_5s,time_5s,open_5s,close_5s,high_5s,low_5s,date_1m,time_1m,open_1m,close_1m,high_1m,low_1m,date_5m,time_5m,open_5m,close_5m,high_5m,low_5m)
    End Function
    C+: 
    float VBSAddin::INIT_1(long Date_5s, long Time_5s, float Open_5s, float Close_5s, float High_5s, float Low_5s, long Date_1m, long Time_1m, float Open_1m, float Close_1m, float High_1m, float Low_1m, long Date_5m, long Time_5m, float Open_5m ,float Close_5m, float High_5m, float Low_5m) {
       sqlite3 *db=NULL;   char *zErrMsg = 0;   int rc;    //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件   rc = sqlite3_open("test1.db", &db);
       if(rc)   {        fprintf(stderr, "Can’t open database: %s\n", sqlite3_errmsg(db));        sqlite3_close(db);        return (1);    }   else        printf("You have opened a sqlite3 database named Winstock.db successfully!\n");     return 0.0f;}
    问题,是只要加了rc = sqlite3_open("test1.db", &db); 附加进程调试的断点,就进不去了,同时还有OLE异常错误,如下图而,我没有OLE的单独的sqlite测试是没问题的。
    自己用try catch也没找到错误,请大哥们帮忙看看

    此主题相关图片如下:1.gif



    我附上VC的包,   太大了 ,我可以发邮件
    江湖救急,多谢了!

     

  • 金字塔客服:

    逐K线模式下你这种使用方法是让人蛋疼的,你自己应该能想到每根K线都去调用一次,你的代码这样没有效率的反复进行初始化操作,不断打开和关闭数据库。

     

    我们没有办法为你免费修改你的代码,但是可以给你提供一个效率较高的思路。

    1,将 Set MyAddin = CreateObject("MyActiveXDemo.VBSAddin") 放到外面做为全局变量使用

    2,判断Formula.barpos=0时这是第一次调用第一根k线,你要做的事情就是对代码进行初始化,比如做数据库的打开及初始化动作

    3,然后Formula.barpos>0时你就可以把之前打开并初始化过的数据直接做处理了,这样效率会提高很多,希望对你能有所帮助

     

  • 用户回复: 王老师,多谢了!
    其实我PEL代码没写全,在公式初次调用时,会按bapos =0与>0 分别进行处理的
    盘中动态时,会用论坛 KLC的方式,每K线跳动,只刷末根线1次
    主要是调用时创建数据库出错了,我去再研究吧,谢谢了

     

  • 网友回复: 王老师,免费查错不方便,要不付费可以吗? 总得弄好哈
    float VBSAddin::INIT_1(long Date_5s, long Time_5s, float Open_5s, float Close_5s, float High_5s, float Low_5s, long Date_1m, long Time_1m, float Open_1m, float Close_1m, float High_1m, float Low_1m, long Date_5m, long Time_5m, float Open_5m ,float Close_5m, float High_5m, float Low_5m) {
       sqlite3 *db=NULL;   char *zErrMsg = 0;   int rc;    //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件   rc = sqlite3_open("test1.db", &db);
       if(rc)   {        fprintf(stderr, "Can’t open database: %s\n", sqlite3_errmsg(db));        sqlite3_close(db);        return (1);    }   else        printf("You have opened a sqlite3 database named Winstock.db successfully!\n");     return 0.0f;}
    C++ 参数是传进去了,但只要问题,是只要加了rc = sqlite3_open("test1.db", &db); 附加进程调试的断点,就进不去了,同时还有OLE异常错误,我没有OLE的单独的sqlite测试是没问题的。 [此贴子已经被作者于2014/8/29 14:16:08编辑过]

     

  • 网友回复:

    不要用附加进程调试, 请到管网下载 2.962版, 这个版本支持调试的, 建议你在VC6下运行

 

有思路,想编写各种指标公式,程序化交易模型,选股公式,预警公式的朋友

可联系技术人员 QQ: 1145508240  点击这里给我发消息进行 有偿 编写!不贵!点击查看价格!


【字体: 】【打印文章】【查看评论

相关文章

    没有相关内容