Скрипт экспорта МТ4

Следующий скрипт 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());
}

Итак, мой вопрос, какие изменения необходимо внести в сценарий, чтобы экспортировать данные из прошлого в текущий порядок?


person user4677456    schedule 16.03.2015    source источник
comment
Ваша попытка сгенерировать .CSV с помощью предварительного условия bar==0 должна привести к созданию одной строки в выводе csv. Цикл должен выполняться ровно один раз. Проверьте логику обработки вывода, почему ваш вывод остался, как возражали, пустым.   -  person user3666197    schedule 21.03.2015


Ответы (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
person user3666197    schedule 21.03.2015
comment
Ваша логика также должна как-то справляться с крайними случаями. т.е. когда ваш MT4.History не содержит 20000 свечей в DB.POOL и ваша обработка слепых указателей будет давать сбой из-за отсутствия записей (за пределами глубины индексированной по времени истории). В MT4 есть встроенная переменная / механика для этого. - person user3666197; 21.03.2015
comment
Приятно знать, что ответ помог вам. StackOverflow Сетевой этикет призывает пользователей выражать это кликами [+1]. Не стесняйтесь голосовать и показывать это как за хорошие вопросы, так и за ответы, когда вы найдете полезные знания, которые вы считаете полезными. Наслаждайтесь тем, что являетесь активным участником этого замечательного сообщества StackOverflow. - person user3666197; 22.03.2015