Бэктестинг с тиковыми данными

 

Резервное тестирование с тиковыми данными

Я думаю, что нашел хороший способ сделать это в metatrader - и я прошел через этот метод, но застрял, и мне нужна помощь на последнем этапе.

1) Получены тиковые данные от компании (коммерческий источник) символ: CL (нефть) В бесплатных источниках, например, dukascopy и т.д. нет этого символа.
2) Использовал программное обеспечение компании для рендеринга этих тиковых данных в формат бара (без потери разрешения). Формат бара:

дата, время, открытие, максимум, минимум, закрытие, объем.

Каждый бар имеет только 1 тик в нем! Таким образом, для данного бара открытие, максимум, минимум, закрытие все одинаковы, потому что в баре всего 1 тик.

3) Я получаю эти тиковые данные в тестер стратегий metatrader, заходя в папки истории metatrader и удаляя все соответствующие файлы. Я открываю metatrader в автономном режиме и использую центр истории и функцию импорта, чтобы получить эти данные. Конечно, хотя это тиковые данные - со своим форматом баров - они нормально воспринимаются metatrader. Когда я использую тестер стратегий (конечно, все еще в автономном режиме), он может получить доступ к этим данным.

4) НО проблема: согласно metatrader, в этих данных есть несколько баров с одинаковой датой и временем (потому что metatrader игнорирует секунды; самое малое, что он считает - это минуты). Я думаю, что решение этой проблемы заключается в том, чтобы изменить данные так, чтобы все бары имели разные отметки даты и времени (с разрешением, которое может быть воспринято метатрейдером). Так, например, если
один бар имеет метку времени 18:00:00, а следующий - 18:00:08, то второй бар должен быть изменен на метку времени 18:01:00. Чтобы метатрейдер мог принять его за следующий бар. Это, конечно, изменит все временные метки (и метки даты в свое время), но я не думаю, что это действительно важно. Мой вопрос - КАК ИЗМЕНИТЬ ВСЕ ШТАМПЫ ДАТЫ И ВРЕМЕНИ ТАКИМ СПОСОБОМ?

Конечно, в данных слишком много записей для Excel. У меня есть доступ к microsoft Access.

Возможно, сработает скрипт, который будет добавлять 1 секунду итеративно к каждому временному входу. Но при этом нужно будет соответственно менять час по мере роста, а затем, конечно, и дату. Именно это меня и заводит в тупик. Не знаю, как это сделать.


Пример моих тиковых данных, основанных на барах, вырезан и вставлен ниже
(это данные CL - фьючерс на сладкую сырую нефть)

дата, время, открытие, максимум, минимум, закрытие, объем
20100831,18:00:00,71.70,71.70,71.70,71.70,2
20100831,18:00:00,71.70,71.70,71.70,71.70,1
20100831,18:00:00,71.70,71.70,71.70,71.70,1
20100831,18:00:00,71.70,71.70,71.70,71.70,1
20100831,18:00:00,71.70,71.70,71.70,71.70,1
20100831,18:00:01,71.73,71.73,71.73,71.73,2
20100831,18:00:01,71.74,71.74,71.74,71.74,1
20100831,18:00:01,71.73,71.73,71.73,71.73,1
20100831,18:00:01,71.74,71.74,71.74,71.74,1
20100831,18:00:01,71.74,71.74,71.74,71.74,1
20100831,18:00:01,71.74,71.74,71.74,71.74,1
20100831,18:00:01,71.74,71.74,71.74,71.74,1
20100831,18:00:01,71.74,71.74,71.74,71.74,1
20100831,18:00:01,71.74,71.74,71.74,71.74,1
20100831,18:00:01,71.75,71.75,71.75,71.75,7
20100831,18:00:01,71.75,71.75,71.75,71.75,1
20100831,18:00:04,71.75,71.75,71.75,71.75,1
20100831,18:00:05,71.74,71.74,71.74,71.74,1
20100831,18:00:05,71.75,71.75,71.75,71.75,1
20100831,18:00:05,71.75,71.75,71.75,71.75,3
20100831,18:00:08,71.75,71.75,71.75,71.75,7
20100831,18:00:09,71.75,71.75,71.75,71.75,1
20100831,18:00:10,71.75,71.75,71.75,71.75,1
20100831,18:00:10,71.75,71.75,71.75,71.75,1
20100831,18:00:10,71.71,71.71,71.71,71.71,1
20100831,18:00:11,71.70,71.70,71.70,71.70,1
20100831,18:00:11,71.68,71.68,71.68,71.68,1
20100831,18:00:19,71.71,71.71,71.71,71.71,1
20100831,18:00:19,71.71,71.71,71.71,71.71,1
20100831,18:00:19,71.69,71.69,71.69,71.69,1
20100831,18:00:19,71.69,71.69,71.69,71.69,1
20100831,18:00:19,71.68,71.68,71.68,71.68,2
20100831,18:00:19,71.67,71.67,71.67,71.67,1
20100831,18:00:34,71.72,71.72,71.72,71.72,1
20100831,18:00:34,71.72,71.72,71.72,71.72,1
20100831,18:00:35,71.72,71.72,71.72,71.72,1
20100831,18:00:37,71.72,71.72,71.72,71.72,1
20100831,18:00:56,71.71,71.71,71.71,71.71,1
20100831,18:00:56,71.71,71.71,71.71,71.71,1
20100831,18:00:56,71.70,71.70,71.70,71.70,1
20100831,18:01:00,71.71,71.71,71.71,71.71,1
20100831,18:01:02,71.72,71.72,71.72,71.72,1
20100831,18:01:11,71.71,71.71,71.71,71.71,1
20100831,18:01:12,71.71,71.71,71.71,71.71,1
20100831,18:01:13,71.71,71.71,71.71,71.71,1
20100831,18:01:16,71.70,71.70,71.70,71.70,1
20100831,18:01:26,71.70,71.70,71.70,71.70,3
20100831,18:01:26,71.70,71.70,71.70,71.70,5
20100831,18:01:28,71.70,71.70,71.70,71.70,1
20100831,18:01:33,71.71,71.71,71.71,71.71,1
20100831,18:01:36,71.70,71.70,71.70,71.70,4
20100831,18:01:45,71.70,71.70,71.70,71.70,1
20100831,18:01:46,71.71,71.71,71.71,71.71,2
20100831,18:01:46,71.71,71.71,71.71,71.71,4
20100831,18:01:49,71.71,71.71,71.71,71.71,1
20100831,18:02:19,71.70,71.70,71.70,71.70,1
20100831,18:02:25,71.70,71.70,71.70,71.70,1
20100831,18:02:25,71.70,71.70,71.70,71.70,1
20100831,18:02:25,71.70,71.70,71.70,71.70,1
20100831,18:02:25,71.70,71.70,71.70,71.70,1
20100831,18:02:26,71.70,71.70,71.70,71.70,1
20100831,18:02:26,71.70,71.70,71.70,71.70,1
20100831,18:02:39,71.74,71.74,71.74,71.74,1
20100831,18:03:10,71.74,71.74,71.74,71.74,1
20100831,18:03:29,71.75,71.75,71.75,71.75,1
20100831,18:03:34,71.75,71.75,71.75,71.75,1
20100831,18:03:34,71.77,71.77,71.77,71.77,1
20100831,18:03:41,71.78,71.78,71.78,71.78,1
20100831,18:03:41,71.78,71.78,71.78,71.78,5
20100831,18:03:41,71.78,71.78,71.78,71.78,5
20100831,18:03:41,71.79,71.79,71.79,71.79,1
20100831,18:03:44,71.78,71.78,71.78,71.78,1
20100831,18:03:50,71.78,71.78,71.78,71.78,1
20100831,18:03:52,71.79,71.79,71.79,71.79,1
20100831,18:04:14,71.79,71.79,71.79,71.79,1
20100831,18:04:14,71.79,71.79,71.79,71.79,1
20100831,18:04:14,71.80,71.80,71.80,71.80,1
20100831,18:04:14,71.80,71.80,71.80,71.80,2

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

20100831,18:00,71.70,71.70,71.70,71.70,2
20100831,18:00,71.70,71.70,71.70,71.70,1
20100831,18:00,71.70,71.70,71.70,71.70,1
20100831,18:00,71.70,71.70,71.70,71.70,1
20100831,18:00,71.70,71.70,71.70,71.70,1
20100831,18:00,71.73,71.73,71.73,71.73,2
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.73,71.73,71.73,71.73,1
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.75,71.75,71.75,71.75,7
20100831,18:00,71.75,71.75,71.75,71.75,1
20100831,18:00,71.75,71.75,71.75,71.75,1
20100831,18:00,71.74,71.74,71.74,71.74,1
20100831,18:00,71.75,71.75,71.75,71.75,1
20100831,18:00,71.75,71.75,71.75,71.75,3
20100831,18:00,71.75,71.75,71.75,71.75,7
20100831,18:00,71.75,71.75,71.75,71.75,1
20100831,18:00,71.75,71.75,71.75,71.75,1
20100831,18:00,71.75,71.75,71.75,71.75,1
20100831,18:00,71.71,71.71,71.71,71.71,1
20100831,18:00,71.70,71.70,71.70,71.70,1
20100831,18:00,71.68,71.68,71.68,71.68,1
20100831,18:00,71.71,71.71,71.71,71.71,1
20100831,18:00,71.71,71.71,71.71,71.71,1
20100831,18:00,71.69,71.69,71.69,71.69,1
20100831,18:00,71.69,71.69,71.69,71.69,1
20100831,18:00,71.68,71.68,71.68,71.68,2
20100831,18:00,71.67,71.67,71.67,71.67,1
20100831,18:00,71.72,71.72,71.72,71.72,1
20100831,18:00,71.72,71.72,71.72,71.72,1
20100831,18:00,71.72,71.72,71.72,71.72,1
20100831,18:00,71.72,71.72,71.72,71.72,1
20100831,18:00,71.71,71.71,71.71,71.71,1
20100831,18:00,71.71,71.71,71.71,71.71,1
20100831,18:00,71.70,71.70,71.70,71.70,1
20100831,18:01,71.71,71.71,71.71,71.71,1
20100831,18:01,71.72,71.72,71.72,71.72,1
20100831,18:01,71.71,71.71,71.71,71.71,1
20100831,18:01,71.71,71.71,71.71,71.71,1
20100831,18:01,71.71,71.71,71.71,71.71,1
20100831,18:01,71.70,71.70,71.70,71.70,1
20100831,18:01,71.70,71.70,71.70,71.70,3
20100831,18:01,71.70,71.70,71.70,71.70,5
20100831,18:01,71.70,71.70,71.70,71.70,1
20100831,18:01,71.71,71.71,71.71,71.71,1
20100831,18:01,71.70,71.70,71.70,71.70,4
20100831,18:01,71.70,71.70,71.70,71.70,1
20100831,18:01,71.71,71.71,71.71,71.71,2
20100831,18:01,71.71,71.71,71.71,71.71,4
20100831,18:01,71.71,71.71,71.71,71.71,1
20100831,18:02,71.70,71.70,71.70,71.70,1
20100831,18:02,71.70,71.70,71.70,71.70,1
20100831,18:02,71.70,71.70,71.70,71.70,1
20100831,18:02,71.70,71.70,71.70,71.70,1
20100831,18:02,71.70,71.70,71.70,71.70,1
20100831,18:02,71.70,71.70,71.70,71.70,1
20100831,18:02,71.70,71.70,71.70,71.70,1
20100831,18:02,71.74,71.74,71.74,71.74,1
20100831,18:03,71.74,71.74,71.74,71.74,1
20100831,18:03,71.75,71.75,71.75,71.75,1
20100831,18:03,71.75,71.75,71.75,71.75,1
20100831,18:03,71.77,71.77,71.77,71.77,1
20100831,18:03,71.78,71.78,71.78,71.78,1
20100831,18:03,71.78,71.78,71.78,71.78,5
20100831,18:03,71.78,71.78,71.78,71.78,5
20100831,18:03,71.79,71.79,71.79,71.79,1
20100831,18:03,71.78,71.78,71.78,71.78,1
20100831,18:03,71.78,71.78,71.78,71.78,1
20100831,18:03,71.79,71.79,71.79,71.79,1
20100831,18:04,71.79,71.79,71.79,71.79,1
20100831,18:04,71.79,71.79,71.79,71.79,1
20100831,18:04,71.80,71.80,71.80,71.80,1
20100831,18:04,71.80,71.80,71.80,71.80,2
20100831,18:04,71.80,71.80,71.80,71.80,1
20100831,18:04,71.80,71.80,71.80,71.80,3
20100831,18:04,71.80,71.80,71.80,71.80,17
20100831,18:04,71.80,71.80,71.80,71.80,1
20100831,18:04,71.80,71.80,71.80,71.80,4
20100831,18:04,71.79,71.79,71.79,71.79,1

 
Тестер использует файлы FXT, и они также имеют секунды. К сожалению, эти FXT файлы перезаписываются при каждом последующем тестировании, поэтому пользователи не могут поместить в них свои собственные данные (в старых версиях MT4 это было возможно -> https://www.mql5.com/en/forum/103180/page6#321081). Есть способ преодолеть это препятствие... Подробную информацию смотрите здесь -> http://eareview.net/tick-data.
 

этот сайт кажется стандартным ответом на все, что касается клещей.

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

Действительно, при использовании моего метода нет необходимости использовать старую версию metatrader. Если я прав. Я тоже почти у цели - мне просто нужна помощь на последнем этапе,

 

Что вы думаете?

1) Я на правильном пути?

Как я уже сказал, я просто не могу использовать путь а-ля этот сайт (Birt EA), так как он не действителен для моей начальной точки.

2) Если да - есть ли у вас идеи, как преодолеть этот последний камень преткновения?

 
Либо вы не поняли метод Бирта, либо я не понимаю вас. Следующее не имеет смысла:


mikey:

[...]

4) НО проблема: согласно metatrader, в этих данных есть несколько баров с одинаковой датой и меткой времени (потому что metatrader игнорирует секунды; самое малое, что он считает - это минуты). Я думаю, что решение этой проблемы заключается в том, чтобы изменить данные так, чтобы все бары имели разные отметки даты и времени (с разрешением, которое может быть воспринято метатрейдером). [...]

Это ничего не решит, поскольку тестер всегда будет сначала интерполировать тики для бэктестинга, независимо от того, что вы делаете в центре истории. Основная идея метода Бирта заключается в том, чтобы заменить файл интерполированных тиков файлом, содержащим реальные тики, на которых тестер будет тестировать. Даже если вы преуспеете в вашей текущей попытке, тестер все равно будет интерполировать тики для проверки, так что это не имеет смысла.


Я рекомендую вам прочитать это -> https://www.mql5.com/en/articles/1511 и еще раз просмотреть учебник Бирта. Вашей целью должно быть создание правильного FXT файла с реальными тиками для замены FXT файла, сгенерированного тестером. Используя метод Бирта, вы можете отключить "пересчет" и таким образом заставить тестер использовать ваш FXT файл (с вашими реальными тиками).

 

Все зависит от следующего:

1) Интерполирует ли metatrader тики только ВНУТРИ баров? (Я думаю, что да)

2) И он делает это, руководствуясь и ограничиваясь заданными значениями бара: open, high, low, close?

Если [1] и [2] верны, я думаю, что мой метод действителен, потому что в моем методе каждый бар имеет только 1 тик. Таким образом, открытие, максимум, минимум и закрытие имеют одинаковое значение. Поэтому, когда metatrader использует их для интерполяции тиков - все интерполированные тики получают одинаковое значение/цену. Таким образом, интерполяция metatrader новых тиков не является проблемой - она ничего не меняет.

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

 
mikey:

1) Интерполирует ли metatrader тики только ВНУТРИ баров? (Я думаю, что да)

2) И он делает это, руководствуясь и ограничиваясь заданными значениями бара: open, high, low, close?

Если [1] и [2] верны, я думаю, что мой метод действителен, потому что в моем методе каждый бар имеет только 1 тик. Таким образом, открытие, максимум, минимум и закрытие имеют одинаковое значение. Поэтому, когда metatrader использует их для интерполяции тиков - все интерполированные тики получают одинаковое значение/цену. Таким образом, интерполяция metatrader новых тиков не является проблемой - она ничего не меняет. [...]

Понятно... Спасибо за разъяснение. Ну, если бар имеет O=C=H=L и объем=1, то действительно должен быть сформирован только 1 тик. Но это означает, что вы "растягиваете" временную шкалу на средний объем бара. И вы растягиваете его "равномерно", хотя разные бары имеют разные объемы. Это должно иметь серьезные последствия для большинства экспертов. Это также означает, что даты/время в отчетах о тестировании будут растянуты, и что своп будет сделан в бесчисленное количество раз больше, чем следовало бы. Это звучит крайне ненадежно, и я думаю, что это просто не будет "работать" для большинства экспертов.


В любом случае, отвечая на ваш вопрос "как это сделать". Просто создайте файл M1 HST с каждым баром, представляющим один тик. Это можно сделать с помощью скрипта. Структура HST-файла описана в руководстве (Terminal Help), и вы можете повторно использовать некоторый код из скрипта csv2fxt.


p.s. Если вам интересно, как интерполяция выполняется в тестере, есть хорошая статья о том, как это делается в тестере MT5... Должно быть очень похоже (если не то же самое) на то, что происходит в MT4 Tester -> https://www.mql5.com/en/articles/75.

 

В качестве дополнительного пояснения к моему предыдущему:

Каждому тику присваивается свой собственный бар M1 (бар с уникальной датой и меткой времени, с разрешением времени в целых минутах).

Таким образом, это означает, что время смещается - бар тика может иметь совсем другое время, чем то, когда этот тик произошел на самом деле.

Но для меня это НЕ проблема. Мне не нужно точно знать время. Я знаю, какие данные я поместил в бэктест (с этой даты по эту дату) и в конце я узнаю, была ли прибыль или убыток получена в конце этого периода с помощью этого метода. (Точная дата/время на выходном графике меня не волнует).

Опять же - меня могут поправить. Это все разумно или безумие? Пожалуйста, найдите время, чтобы понять, что я сказал, а не просто отсылайте меня к Биртсу, потому что если я могу правильно донести и передать это, и это разумно - я думаю, это может быть лучшим способом делать вещи.

 

mikey:

[...] Но для меня это НЕ проблема. Мне не нужно точно знать время. Я знаю, какие данные я поместил в бэктест (с этой даты по ту дату), и в конце я узнаю, была ли получена прибыль или убыток в конце этого периода с помощью этого метода. (точная дата/время на выходном графике меня не волнует) [...].

ХОРОШО. Но уверены ли вы, что это не повлияет на эксперта? Например - любой эксперт, который полагается на учет таймфреймов или индексов, основанных на таймфреймах, не будет работать так, как должен. Вам также придется сбросить своп на ноль, потому что он точно не будет рассчитан правильно. Могут быть и другие побочные эффекты, о которых я сейчас не думаю... Звучит очень опасно для меня.
 
BTW, вам придется отказаться от данных об объеме, поскольку они не имеют отношения к тому, как он рассчитывается в MT4 (объем = количество тиков, полученных в баре).
 

Да. Ваш ответ только что появился, когда я отправил свой последний.

RE: volume...- если мой советник не "читает" объем, я в безопасности? Мне не нужно беспокоиться об этом? Я не думал об объеме - но, как я уже сказал, мой советник не "читает" его ни для чего. Итак, просто чтобы прояснить - я могу игнорировать объем? Или я должен установить объем равным 1 для всех баров?