来自一个 "傻瓜 "的问题 - 页 111

 
openlive:

现在它给我...

2012.02.26 15:47:46 测试文件C:\Users\openlive\AppData\Roaming\MetaQuotes\Terminal\9C3619DDD286B60B1DB9B9989A2FFC701\MQL5\Files\signal10000.csv打开错误[32] 。

首先,检查你在C:\Users\openlive\AppData\Roaming\MetaQuotes\Terminal\9C3619DDD286B60B1DB9B989A2FFC701\MQL5Files\ 文件夹里有什么。

第二:MQL5中没有错误32。 很奇怪...你是否在尝试打开文件后检查句柄,在尝试打开文件后检查最后的错误代码

 
DenisR:
什么是 "数学模式"?
在数学计算模式下,没有历史运行--由于这个原因,当你需要进行数学计算而不使用交易操作 时,可以达到最高速度。在这种模式下,如果你优化一个交易 专家顾问,你将不得不自行建立市场环境模型(历史数据、价差等)。在这种情况下,你可以使用任何历史数据,从预先准备好的文件中提取。
 
DenisR:
什么是 "数学计算模式"?

在这种模式下,只有OnTester()被调用;然而,OnTester()的复杂性和计算量不受限制。 如果你计算你的Expert Advisor在给定输入参数下的利润,你可以使用测试仪的遗传算法 进行优化。
 

请帮助我理解,我的大脑正在沸腾。

1.我理解,切换到x64操作系统与不可能在4个字节上 "分割 "出超过4GB的内存这一事实有关。我有x64操作系统,为什么指针会占用4个字节(这不仅涉及mql,也涉及C++))?

2.关于MT4的问题:为什么我调用dll函数时。

#import "MemoryDLL.dll"
void fn(double j[]);           // Подозреваю что так отдается адрес?
#import

int start()
{
   double dVal[1];
   fn(dVal);
   retutn(0);
} 

在这些变体中,dll变量可以正常取用。

extern "C" __declspec(dllexport) void fn(double &j);       // Почему так работает????
// и так
extern "C" __declspec(dllexport) void fn(double *j);       // Думаю что должно работать только так

虽然我认为指针和引用,从概念上来说应该是不兼容的,例如,在我的例子中,指向双倍的指针需要4个字节。

它的工作原理是这样的。

#import "MemoryDLL.dll"
void fn(double j);           
#import
                                                  // Согласен

extern "C" __declspec(dllexport) void fn(double j);  

不起作用。

#import "MemoryDLL.dll"
void fn(double j);           
#import
                                                  // Почему нет???

extern "C" __declspec(dllexport) void fn(double &j);  

至少,它将如何工作(我想传递多个数组)?我不想通过回溯来做。

 
220Volt:

至少如何正确操作(我想传递几个数组)?因为我不想走后门。

而在MQL中,谁会把&放在函数声明中?
 
sergeev:
而在MQL中,谁会把&放在函数声明中?

是的,这可能是正确的做法。但无论如何,MQL在C语言中并不工作(我可能是错的)。

 
220Volt:

是的,这可能是正确的做法。反正只有MKL在某种程度上不能通过C来工作(我可能是错的)。

在传递方面有一个区别--所有的东西都需要通过引用来传递,而通过指针'*'只能传递类对象

 

我以为一个基本的内存区域由两部分组成--地址和值。如果传输地址,它必须在某个变量中,在 "值 "字段中包含被传输区域的地址。这就是为什么我不明白这样的变体如何能同时正确工作。

extern "C" __declspec(dllexport) void fn(double &j);  
// и так
extern "C" __declspec(dllexport) void fn(double *j);  
// Прототип для MQL - void fn(&s[]);

我们可以尝试找到一种解释,比如--它是 "按原样 "传输的内存区域,接收方决定如何处理它(将地址写入数值或复制地址)。但这一假设被破坏了,因为它并不是这样工作的。

extern "C" __declspec(dllexport) void fn(double j);  

// Прототип для MQL - void fn(&s[]);

我们可以再次尝试找到解释--在第一个重复中,"值 "字段中的地址被作为输入,而接收方决定如何处理它。与此相反的是,在C++中,编译器说不要这样做,在它看来还是如此。

fn(int *x)
{
}

int i;
fn(&i);

或者这样。

fn(int &x)
{
}

int i;
fn(i); 
总而言之,我只看到了矛盾。
 

你问,我答。

我得出的结论是,链接和指针在本质上是一回事。有轻微的差异。

  • 你只能将一个地址写入引用一次,写入指针多次。
  • 不同的语法

非常重要的一点是:如果被调用的函数 有一个引用或指针作为参数,那么这个地址实际上是被传递的。在从dll调用时,理解这一点非常重要。

 

你能告诉我如何找到主线和随机指标线交叉的确切数值吗?

在视觉上很容易,但如何在程序上实现它?