【问题标题】:Converting MQL4 to C++?将 MQL4 转换为 C++?
【发布时间】:2021-03-29 11:37:04
【问题描述】:

我想将一堆用 MQL4(.mq4 文件)编写的股票/外汇指标转换为 C++。以前,我只使用 Python 进行编程,很少接触 MQL4 和 C++。此外,我根本不知道解决这样一个问题的方法,以及它是否可行。 (尽管在最坏的情况下,手动重新编码它们绝对是可行的。)

我以一个简单的指标,简单移动平均线为例,开始修改它并使用 C++ 编译器运行它。知道这两种语言的语法高度相似,我认为这可能是一个相对简单的过程,甚至在某种程度上是自动化的。

这是从 .mq4 文件中提取的简单移动平均线脚本at this link

MA_Period=5;
void sma()
  {
   double sum=0;
   int    i,pos=Bars-ExtCountedBars-1;
//---- initial accumulation
   if(pos<MA_Period) pos=MA_Period;
   for(i=1;i<MA_Period;i++,pos--)
      sum+=Close[pos];
//---- main calculation loop
   while(pos>=0)
     {
      sum+=Close[pos];
      ExtMapBuffer[pos]=sum/MA_Period;
       sum-=Close[pos+MA_Period-1];
       pos--;
     }
//---- zero initial bars
   if(ExtCountedBars<1)
      for(i=1;i<MA_Period;i++) ExtMapBuffer[Bars-i]=0;
  }

这是我的 C++ 实现,目前在一个短数组 arr[] 上测试它,代表 MQL4 中的 Close 数组。此外,我删除了 MQL4 的 BarsExtCountedBars 变量(因为我想在静态、历史数据上运行指标),并将 ExtMapBuffer 替换为名为 output[] 的数组,其长度与“价格”数组相同arr[].

#include <iostream>
using namespace std;

int main()
{
    int MA_Period=5;
    int arr[20] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
    double sum=0;
    int    i, pos=0;
    int output[20];
    
    cout << "Pos: " << pos << endl;
    
    //---- initial accumulation
    if(pos<MA_Period) pos=MA_Period;
    for(i=1;i<MA_Period;i++,pos--)
        sum+=arr[pos];
    
    cout << "Sum of past " << MA_Period << " prices : " << sum << endl;
    cout << "Pos = " << pos << endl;
    //---- main calculation loop
    while(pos>=0)
    {
       sum+=arr[pos];
       output[pos]=sum/MA_Period;
       sum-=arr[pos+MA_Period-1];
       pos--;
    }

    for(int j=0;j<sizeof(output)/sizeof(output[0]);j++){
        cout << "output[" << j << "] = " << output[j] << endl;
    }
    return 0;
}

output 数组值的控制台输出是:

output[0] = 3                                                                                                                                   
output[1] = 4                                                                                                                                   
output[2] = 65535                                                                                                                               
output[3] = 1                                                                                                                                   
output[4] = 1706671568                                                                                                                          
output[5] = 32766                                                                                                                               
output[6] = 4197523                                                                                                                             
output[7] = 0                                                                                                                                   
output[8] = 2                                                                                                                                   
output[9] = 0                                                                                                                                   
output[10] = 4197613                                                                                                                            
output[11] = 0                                                                                                                                  
output[12] = 124                                                                                                                                
output[13] = 0                                                                                                                                  
output[14] = 0                                                                                                                                  
output[15] = 0                                                                                                                                  
output[16] = 4197536                                                                                                                            
output[17] = 0                                                                                                                                  
output[18] = 4196352                                                                                                                            
output[19] = 0

这显然是不正确的。在转换为 C++ 时,我尝试尽可能多地保留原始 MQL4 代码,但现在遇到了一个障碍,即为什么输出与预期有很大不同:

output[0] = nan                                                                                                                                   
output[1] = nan                                                                                                                                 
output[2] = nan                                                                                                                               
output[3] = nan                                                                                                                                   
output[4] = 3
output[5] = 4
output[6] = 5
output[7] = 6                                                                                                                                   
output[8] = 7                                                                                                                                   
output[9] = 8                                                                                                                                   
output[10] = 9
output[11] = 10                                                                                                                                  
output[12] = 11                                                                                                                               
output[13] = 12                                                                                                                                 
output[14] = 13                                                                                                                                 
output[15] = 14                                                                                                                                 
output[16] = 15                                                                                                                            
output[17] = 16                                                                                                                                 
output[18] = 17
output[19] = 18

在将 MQL4 代码转换为 C++ 的过程中我遗漏了什么/误解了什么?

【问题讨论】:

    标签: c++ mql4


    【解决方案1】:

    这段代码有几个问题。主要问题是您使用索引ipos。特别是在初始累加之后,pos 等于1,所以主计算循环在完成之前只会运行一次迭代。所以只有output[1] 被写入,数组的其余部分未初始化,并且可能包含任何值。

    另请注意,C 中的数组索引从零开始。您的初始累积循环从1 开始,这不是您想要的。

    我会避免使用两个变量作为索引,而只使用一个。要初始化sum,请编写:

    for (int i = 0; i < MA_Period; ++i) {
        sum += arr[i];
        output[i] = -1;
    }
    

    然后做余数写:

    for (int i = MA_Period; i < sizeof(output) / sizeof(output[0]); ++i) {
        sum += arr[i];
        sum -= arr[i - MA_Period];
        output[i] = sum / MA_Period;
    }
    

    这将为您提供预期的输出。请注意,前 5 个值无法获得 nan,因为 int 永远不会是 nan。如果您将output 设为double 的数组,则可以,例如在初始循环中使用此行:

    output[i] = 0.0 / 0.0;
    

    至于为什么原始 MQL4 代码有效:它将 pos 初始化为 Bars - ExtCountedBars - 1,而您在 C++ 版本中将其初始化为 0

    【讨论】:

      猜你喜欢
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      相关资源
      最近更新 更多