Есть ли возможность сохранить синхронизированные по времени тайм серии в CSV файл?

 

Вопрос в теме.

Если на примере, то есть котировки, допустим EURUSD на М5, в которых пропушены некоторые бары, когда цена не менялась, на графике эти пропущенные бары не отображаются по опр. причинам, но хотелось бы узнать, можно ли экспортировать в CSV полные данные штатными средствами MQL или единственный способ - писать скрипт, который будет заполнять пропуски?

 

В МТ4 такое возможно, даже статья была - "Графики без дыр". Там лишь код нужно обновить под новый стандарт записи данных в файл.

А вот в МТ5 - никак.

Графики без "дыр" - Статьи по MQL4
  • www.mql5.com
Графики без "дыр" - Статьи по MQL4: примеры использования экспертов, тестирования и оптимизации
 
Scriptong:

В МТ4 такое возможно, даже статья была - "Графики без дыр". Там лишь код нужно обновить под новый стандарт записи данных в файл.

А вот в МТ5 - никак.

Я выразился слишком размыто, на самом деле мне не надо формировать коттировки для отображения их на графике, достаточно корректного синхронизированного экспорта в CSV.

Например, в МТ5 если просто сделать Save As на активном графике, то он сохранится как CSV файл, к сожалению, с пропусками баров ... вот если бы можно было сделать то же самое, но без пропусков ...

Update : Только что сформулировал по-другому и нашел это https://www.mql5.com/ru/code/1252 - дома проверю, возможно это оно, если так, то получается если для этого пишут скрипты, то встроенных средств для экспорта синхронизированной истории в таком формате нет?

              Open      Close     High      Low

01.01.2014    0.1234    0.1234    0.1234    0.1234

02.01.2014    0.1234    0.1234    0.1234    0.1234

03.01.2014    0.1234    0.1234    0.1234    0.1234

04.01.2014    0.1234    0.1234    0.1234    0.1234

05.01.2014    0.1234    0.1234    0.1234    0.1234

06.01.2014    0.1234    0.1234    0.1234    0.1234
sHistoryExport - удобный скрипт для экспорта исторических данных в формате МetaТrader 4
sHistoryExport - удобный скрипт для экспорта исторических данных в формате МetaТrader 4
  • голосов: 27
  • 2012.11.12
  • Andrey Khatimlianskii
  • www.mql5.com
Экспорт всех необходимых инструментов и тайм-фреймов одним кликом с загрузкой и проверкой истории.
 

Нужно писать скрипт, штатными средствами не получится.

А при заполнении дыр нужно учесть выходные, праздники и переход на летнее время, это не так просто, как кажется.

 
komposter:

Нужно писать скрипт, штатными средствами не получится.

А при заполнении дыр нужно учесть выходные, праздники и переход на летнее время, это не так просто, как кажется.

Переход на летнее время синхронизацию между инструментами скорее всего не портит - время будет переведено сразу везде. Насколько я понял, автора вопроса беспокоят только те дыры, которые специфичны для отдельного инструмента.
 
это не для торговли, поэтому там чуть проще - мне просто нужны были синхронизированные тайм серии для их анализа в стат. пакетах, типа R, поэтому в данном случае все выходные и дыры от застоя цены достаточно просто подменять значениями пред. бара, главное, чтобы пропуски не влияли на общую статистическую картину, чтобы не было искусственных выбросов при анализе из-за дырок в истории
 
artemiusgreat:
это не для торговли, поэтому там чуть проще - мне просто нужны были синхронизированные тайм серии для их анализа в стат. пакетах, типа R, поэтому в данном случае все выходные и дыры от застоя цены достаточно просто подменять значениями пред. бара, главное, чтобы пропуски не влияли на общую статистическую картину, чтобы не было искусственных выбросов при анализе из-за дырок в истории

Можете растолковать в чём проблема, тема топика так заявлена что складывается впечатление что в Mql5 нет возможности работать с файлами, нет возможности получить данные истории, короче вообще ничего нет.

Если буквально читать название топика то вопрос решается так:

 получаете таймсерию в динамичный массив MqlRates, получаете вторую серию по другому инструменты, синхронизируете их по таймам (при отсутствии какого либо бара заполняете значением close предбара, со сдвигом серии), далее по алгоритму добавляете новые таймсерии и синхронизируете все к новому, чем дальше в лес тем всё меньше и меньше будут изменения в уже обработанных массивах (обрабатывать скорее придётся вновь добавленные таймсерии), затем после добавления всех интересующих таймсерий сохраняете всё это добро в CSV файл.

В чём проблема? 

 
Urain:

Можете растолковать в чём проблема, тема топика так заявлена что складывается впечатление что в Mql5 нет возможности работать с файлами, нет возможности получить данные истории, короче вообще ничего нет.

Если буквально читать название топика то вопрос решается так:

 получаете таймсерию в динамичный массив MqlRates, получаете вторую серию по другому инструменты, синхронизируете их по таймам (при отсутствии какого либо бара заполняете значением close предбара, со сдвигом серии), далее по алгоритму добавляете новые таймсерии и синхронизируете все к новому, чем дальше в лес тем всё меньше и меньше будут изменения в уже обработанных массивах (обрабатывать скорее придётся вновь добавленные таймсерии), затем после добавления всех интересующих таймсерий сохраняете всё это добро в CSV файл.

В чём проблема? 

:)

проблемы нет, в первом сообщении уточнил, что интересуют, именно штатные, т.е. встроенные средства МТ, чтобы сделать такое, ведь есть же возможность просто сохранить котировки через CTRL + S

самописный скрипт уже есть, сейчас как раз проверяю правильно ли он все делает ...

 
artemiusgreat:
это не для торговли, поэтому там чуть проще - мне просто нужны были синхронизированные тайм серии для их анализа в стат. пакетах, типа R, поэтому в данном случае все выходные и дыры от застоя цены достаточно просто подменять значениями пред. бара, главное, чтобы пропуски не влияли на общую статистическую картину, чтобы не было искусственных выбросов при анализе из-за дырок в истории

Ну, если 2880 лишних одинаковых баров каждую неделю не портят стат. картину, то, конечно, просто заполняйте выходные одинаковыми данными. 

 

marketeer:
Переход на летнее время синхронизацию между инструментами скорее всего не портит - время будет переведено сразу везде. Насколько я понял, автора вопроса беспокоят только те дыры, которые специфичны для отдельного инструмента.

Я понял иначе.

Но если достаточно синхронизировать конечное число тайм-серий (а не сделать одну "эталонную"), то действительно проще заполнять только те дыры, в которых на других тайм-сериях есть данные. 

 
//
// YURAZ yzh@mail.ru
// MQL5 
// функция определяет летнее или зимнее время
// перевод часов на зимнее время проводится в ночь последнего воскресенья октября
// а летнее время включают в ночь последнего воскресенья марта
// более надежного варианта вычисления летнего или зимнего времени не существует
// возврат 0 - летнее время
// возврат 1 - зимнее время
//
 int YZ_summer_time(datetime pdt)
  {
   MqlDateTime dt;
   TimeToStruct(pdt,dt);
   int code=1;
   if(dt.mon>=11 || dt.mon<=2) // ЗИМА
     {
      code=1;
     }
   if(dt.mon>=4 && dt.mon<=9) // ЛЕТО
     {
      code=0;
     }
   datetime tSeek;
   MqlDateTime dtf;
   if(dt.mon==10) // октябрь
     {
      if(dt.day<25) // ночью в последнее воскресенье октября - переход на зимнее время
         code=0; // еще лето
      else
        {
         TimeToStruct(pdt,dtf);
         tSeek=StringToTime(IntegerToString(dtf.day_of_year)+".10.31 02:00");  // установим последний день октября
         while(dtf.day_of_week!=0) //  // ищем первое воскресенье с конца
           {
            tSeek=tSeek-86400;
            TimeToStruct(tSeek,dtf);
           }
         if(pdt<tSeek)
           {
            code=0; // лето
           }
         else
            code=1; // зима
        }
     }
   if(dt.mon==3) // март
     {
      if(dt.day<25) // ночью в последнее воскресенье октября - переход на зимнее время
         code=1; // еще зима
      else
        {
         TimeToStruct(pdt,dtf);
         tSeek=StringToTime(IntegerToString(dtf.day_of_year)+".03.31 03:00");  // установим последний день октября
         while(dtf.day_of_week!=0) //  // ищем первое воскресенье с конца
           {
            tSeek=tSeek-86400;
            TimeToStruct(tSeek,dtf);
           }
         if(pdt>tSeek)
           {
            code=0; // лето
           }
         else
            code=1; // зима
        }
     }
   return( code);
  }
 
YuraZ:

Доработал алгориртм

 //
// YURAZ yzh@mail.ru
// функция определяет летнее или зимнее время
// перевод часов на зимнее время проводится в ночь последнего воскресенья октября
// а летнее время включают в ночь последнего воскресенья марта
// более надежного варианта вычисления летнего или зимнего времени не существует
// возврат 0 - летнее время
// возврат 1 - зимнее время
//
int YZ_summer_time(datetime pdt)
  {
   MqlDateTime dt;
   TimeToStruct(pdt,dt);
   int code=1;
   if(dt.mon>=11 || dt.mon<=2) // ЗИМА
     {
      code=1;
     }
   if(dt.mon>=4 && dt.mon<=9) // ЛЕТО
     {
      code=0;
     }
   datetime tSeek;
   MqlDateTime dtf;
   if(dt.mon==10) // октябрь
     {
      if(dt.day<25) // ночью в последнее воскресенье октября - переход на зимнее время
         code=0; // еще лето
      else
        {
         TimeToStruct(pdt,dtf);
         tSeek=StringToTime(IntegerToString(dtf.year)+".10.31 02:00");  // установим последний день октября
         TimeToStruct(tSeek,dtf);
         for(int i=31; i>=25;  i--)
           {
            if(dtf.day_of_week==0 ) // Необходимо  найти именно ночь  с субботы на воскресенье
               break;  
            tSeek=tSeek-86400; // ( НАХОДИТЬ  именно 2 часа ночи  т е сам переход не имеет смысла так как рынок форекс с субботы на воскроесенье закрыт  )
            TimeToStruct(tSeek,dtf);
           }
         if(pdt<tSeek)
           {
            code=0; // лето
           }
         else
            code=1; // зима
        }
     }
   if(dt.mon==3) // март
     {
      if(dt.day<25) // ночью в последнее воскресенье марта  - переход на летнее время
         code=1; // еще зима
      else
        {
         TimeToStruct(pdt,dtf);
         tSeek=StringToTime(IntegerToString(dtf.day_of_year)+".03.31 03:00");  // установим последний день марта
         for(int i=31; i>=25;  i--)
           {
            if(dtf.day_of_week==0 ) // Необходимо  найти именно ночь  с субботы на воскресенье
               break;  
            tSeek=tSeek-86400; // ( НАХОДИТЬ  именно 3 часа ночи  т е сам переход не имеет смысла так как рынок форекс с субботы на воскроесенье закрыт  )
            TimeToStruct(tSeek,dtf);
           }
         if(pdt>tSeek)
           {
            code=0; // лето
           }
         else
            code=1; // зима
        }
     }
  return( code);
  }
Причина обращения: