【发布时间】: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 的 Bars 和 ExtCountedBars 变量(因为我想在静态、历史数据上运行指标),并将 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++ 的过程中我遗漏了什么/误解了什么?
【问题讨论】: