使用自定义指示符和C++ DLL时,访问违反读取错误和MT4崩溃

2024-07-08 12:53:31 发布

您现在位置:Python中文网/ 问答频道 /正文

< >我正在编写一个从C++ DLL调用函数的指示器。我只需要传递关闭率DLL和返回一个字符串从DLL。在

MQL4代码:

#import "PythonZones.dll"
void CalculateZones(double &data[], double quantile, int arraySize,char&[]);
#import

#property indicator_chart_window
char buffer[4096];
input color M5color = clrTurquoise;

input int WINDOW = 446;
input double PARAM_SHIFT = 0.14;

int start()
  {
    if (IsNewBar()){
         double data[];
         ArrayResize(data,WINDOW);
         Rate(data,WINDOW);
         Print(data[0]);
         CalculateZones(data,PARAM_SHIFT ,WINDOW,buffer);
         string zones = CharArrayToString(buffer);
         Print(zones);
  }
   return(0);
}

void Rate(double &out[],int len){
        for(int i=(len - 1);i>-1;i--){
         double close = iClose(NULL,0,i+1);
         out[i] = close;
      }   
 }

和C++ +DLL代码:

^{pr2}$

指示器工作得很好,但是当我从图表中删除指示器并重新添加它时,它不再工作,并返回错误“accessviolationread”。在

而且当我在Strategy Tester中使用它时,MetaTrader在没有记录任何错误的情况下崩溃。在

我认为问题出在数组引用上。我尝试用^ {< CD1}}代替数组,但是我不能编译它,因为我不知道MQL4或C++。在

我怎样才能解决这个问题?在


Tags: 代码importinputdataparambufferwindow指示器
2条回答

问题出在numpy包中。在C++中使用时,不应初始化两次。Py_finilize()工作不正常,并且不删除numpy模块对象。我从这里开始求解https://github.com/numpy/numpy/issues/8097

Q: How can I solve the problem?

使用string-s的MQL4/DLL集成是一次疯狂的尝试

但是,第一步应该是修复#import调用签名,其中提供了接口详细信息供MQL4编译器使用:

#import "PythonZones.dll"
void CalculateZones( double &data[],
                     double  quantile,
                     int     arraySize,
                     char   &buffer[]   // this line is a suspect for mystifying compiler
                     );
#import

如果调用DLL签名的修复,以满足您发布的呼叫接口,这将不起作用(我们不能测试没有测试的DLL的副本),您需要一个专家来进行这种双重系统集成(具有双重领域的专门知识,C++不足以使MQL4编排工作)。在

我祈祷你能用修复的#import呼叫签名来解决这个问题。几十年来这个双重领域的故障排除告诉了我为什么要这样祈祷。在

相关问题 更多 >

    热门问题