【问题标题】:MT4 export scriptMT4 导出脚本
【发布时间】:2015-11-10 08:14:56
【问题描述】:

以下 MQL4 脚本将数据从 MetaTrader 导出到 csv 文件。不幸的是(至少对我而言),生成的csv 文件中的数据顺序从 0 到 1000,0 是最新的(从现在到过去)。我希望文件从 1000 排序到 0(从过去到现在)。

我将下面的写入数据循环更改为:for (int bar=Export_Bars; bar==0 bar--),但这只是生成了一个空的csv 文件。

#property script_show_inputs

input string    Export_FileName = "data\\data.csv"; 
input int       Export_Bars     = 20000; 
input int       StartHour = 10;
input int       EndHour = 19;

void OnStart()   
{
    int file = FileOpen(Export_FileName, FILE_WRITE|FILE_CSV|FILE_ANSI, ',');
    if (file != INVALID_HANDLE && (Hour() >= StartHour) && Hour() < EndHour)
    {
        // Write the header of data

        string row="";
        for (int i=0; i<=5; i++)
        {
            if (StringLen(row)) 
                row += ",";
            row += "Open"+i+",High"+i+",Low"+i+",Close"+i;
        }
        FileWrite(file, row);

        // Copy all required information from the history

        MqlRates rates[], rate;
        int count = Export_Bars + 5;
        if (CopyRates(Symbol(), Period(), 1, count, rates) < count)
        {
            Print("Error! Not enough history size for exporting required information.");
            return;
        }
        ArraySetAsSeries(rates, true);

        // Write data      

        for (int bar=0; bar<Export_Bars; bar++)
        {
            row="";
            double zlevel=0;
            for (int y=0; y<=5; y++)
            {
                if (StringLen(row)) 
                    row += ",";
                rate = rates[bar+y];
                if (y==0) 
                    zlevel = rate.open; // level of price calculation
                row += NormalizeDouble(rate.open -zlevel, Digits()) + ","
                       + NormalizeDouble(rate.high -zlevel, Digits()) + ","
                       + NormalizeDouble(rate.low  -zlevel, Digits()) + ","
                       + NormalizeDouble(rate.close-zlevel, Digits());
            }
            FileWrite(file, row);
        }

        FileClose(file);
        Print("Export of data is finished successfully.");
    } else Print("Error! Failed to create the file for data export. ", GetLastError());
}

所以我的问题是需要对脚本进行哪些更改才能将过去的数据导出到当前顺序?

【问题讨论】:

  • 您尝试通过 bar==0 的前置条件生成.CSV 应该在csv 输出中生成一行。 循环只运行一次。检查你的输出处理逻辑,为什么你的输出保持为空。

标签: export algorithmic-trading metatrader4 mt4


【解决方案1】:

为 Time-Reverse-Iterator 步进更改循环构造函数:

 for ( int bar  = Export_Bars - 1;        // .LOOP-INIT(s)
           bar >= 0;                      // .LOOP-RUN-PRE-CONDITION
           bar--                          // .LOOP-RUN-POST-UPDATE(s)
       ) {...}                            // .LOOP-RUN-BODY

【讨论】:

  • 你的逻辑也应该以某种方式应对极端情况。 IE。当您的 MT4.History 在 DB.POOL 中不包含多达 20000 根蜡烛时,您的盲点处理将由于缺少记录(超出时间索引历史的深度)而崩溃。 MT4 有一个内置的变量/机制来做这个“干净”。
猜你喜欢
  • 2020-03-23
  • 1970-01-01
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 2017-06-15
相关资源
最近更新 更多