Обсуждение статьи "Пользовательские символы: основы применения на практике" - страница 5

 
Mr David Frederick Roberts #:

Спасибо за ответ. Это очень странно, я действительно использую режим реальных тиков и не знал, что в MT5 есть опция фиксированного спреда, так что я уверен, что это не так (я больше знаком с MT4).Я не заметил, что спреды одинаковы для каждого бара, на самом деле, просматривая полный файл, кажется, что они меняются только на границах 1 минуты. Я предполагаю, что я прав, думая, что вызовы SymbolInfoDouble() должны возвращать цены для обрабатываемого тика в результате вызова события OnTick() - а не какое-то значение M1?

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

EDIT: Как я уже сказал, я относительно новичок в MQL5 - я только что нашел SymbolInfoTick(), может быть, я должен использовать его вместо того, что я делаю! Я попробую это и посмотрю, что произойдет...


Окей, это ничего не изменило, точно такие же результаты, но ни один из них не связан с диалогом "Symbol Ticks" в терминале. Я ошибся, сказав, что значение миллисекунд всегда нулевое - оно ненулевое ровно в течение одной минуты, а именно за минуту до полуночи!

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

Боюсь, не совсем понятно, как вы создаете свой пользовательский символ. Приложенные csv-файлы одинаковы (BTW, я не знаю, зачем вам нужны две копии под разными именами), и оба имеют неправильный формат: тиковые файлы должны иметь следующие колонки для импорта в пользовательский символ MT5: дата, время, bid, ask, last, volume. Таким образом, в настоящее время невозможно создать пользовательский символ из тиков без дополнительных манипуляций.

Было бы проще, если бы вы выложили изображения импортированных тиков в MT5 UI и лог вашего советника бок о бок. Представленные выше изображения неполные, и тики выглядят по-разному на изображениях и в сравнении с csv-файлами.

 
Stanislav Korotky #:

Боюсь, не совсем понятно, как вы создаете свой пользовательский символ. Приложенные csv-файлы одинаковы (BTW, я не знаю, зачем вам нужны две копии под разными именами), и оба имеют неправильный формат: тиковые файлы должны иметь следующие колонки для импорта в пользовательский символ MT5: дата, время, bid, ask, last, volume. Таким образом, в настоящее время невозможно создать пользовательский символ из тиков без дополнительных манипуляций.

Было бы проще, если бы вы выложили изображения импортированных тиков в MT5 UI и лог вашего советника бок о бок. Представленные выше изображения неполные, и тики выглядят по-разному на изображениях и в сравнении с csv-файлами.

Тиковые данные были импортированы в MT5 как пользовательский символ из экспорта из моего MT4 'Tick Data Suite' с использованием данных Dukascopy (CSV файлы размером около 8 ГБ).

Файлы csv, которые я отправил, никоим образом не предназначены для импорта в качестве тиковых данных, они являются выходом моего тестового советника (который прилагался), который записывает цены Bid и Ask и время для каждого полученного события OnTick. Эти два файла просто получены разными методами - один использует SymbolInfoDouble(...) для получения цен Bid и Ask, а другой - SymbolInfoTick(...). Тот факт, что они одинаковые, просто доказывает мне, что между методами нет никакой разницы.

Все дело в том, что цены и время Bid и Ask в CSV-файлах, записанных тестовым советником, не совпадают с изображением импортированных тиков в пользовательском интерфейсе MT5 (который я также отправил). Итак...

  1. Время тиков на скриншоте UI не совпадает с временем, записанным тестовым советником - почему?
  2. Время, записанное тестовым советником, имеет нулевую миллисекундную составляющую, за исключением минуты перед полуночью - почему?
  3. Хотя цены Bid, записанные тестовым советником, близки к ценам в пользовательском интерфейсе MT5, цены Ask могут сильно отличаться (а значит, и спред) - почему?
  4. Цены, зафиксированные тестовым советником, дают результирующий спред, который, похоже, изменяется только на минутных границах - почему?
  5. Тестовый советник регистрирует меньше событий OnTick, чем тиковых записей в пользовательском интерфейсе MT5 - почему?

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

Ниже я попытался как можно точнее совместить часть данных, записанных тестовым советником (слева) и пользовательским интерфейсом MT5 (справа). Точно совместить их невозможно, потому что тиков, записанных советником, меньше, чем в пользовательском интерфейсе MT5. Также обратите внимание, что значение миллисекунд, записанное тестовым советником, равно нулю до 23:59.

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

Советник записывает Bid 1.16504 и Ask 1.16513 (спред = 9).

Пользовательский интерфейс MT5 показывает Bid 1.16504 и Ask 1.16518 (спред = 14)

 
Mr David Frederick Roberts #:


У вас много "почему", но трудно дать ответ (без предположений). Возможно, проблема в вашей процедуре или исходном коде.

Вы можете опубликовать небольшую часть из 8 Гб истории тиков, которую легко импортировать в пользовательский символ и проверить ваш код.

В норме SymbolInfoTick должен получать точно такие же тики (включая миллисекунды), которые вы видите в графическом интерфейсе MT5 для того же пользовательского символа.

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

 
Mr David Frederick Roberts #:

Тиковые данные были импортированы в MT5 как пользовательский символ из экспорта из моего MT4 'Tick Data Suite' с использованием данных Dukascopy (CSV файлы размером около 8 ГБ).

Файлы csv, которые я отправил, никоим образом не предназначены для импорта в качестве тиковых данных, они являются выходом моего тестового советника (который прилагался), который записывает цены Bid и Ask и время для каждого полученного события OnTick. Эти два файла просто получены разными методами - один использует SymbolInfoDouble(...) для получения цен Bid и Ask, а другой - SymbolInfoTick(...). Тот факт, что они одинаковые, просто доказывает мне, что между методами нет никакой разницы.

Все дело в том, что цены и время Bid и Ask в CSV-файлах, записанных тестовым советником, не совпадают с изображением импортированных тиков в пользовательском интерфейсе MT5 (который я также отправил). Так что...

  1. Время тиков на скриншоте UI не совпадает с временем, записанным тестовым советником - почему?
  2. Время, записанное тестовым советником, имеет нулевую миллисекундную составляющую, за исключением минуты перед полуночью - почему?
  3. Хотя цены Bid, записанные тестовым советником, близки к ценам в пользовательском интерфейсе MT5, цены Ask могут сильно отличаться (а значит, и спред) - почему?
  4. Цены, зафиксированные тестовым советником, дают результирующий спред, который, похоже, изменяется только на минутных границах - почему?
  5. Тестовый советник регистрирует меньше событий OnTick, чем тиковых записей в пользовательском интерфейсе MT5 - почему?

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

Ниже я попытался как можно точнее совместить часть данных, записанных тестовым советником (слева) и пользовательским интерфейсом MT5 (справа). Точно совместить их невозможно, потому что тиков, записанных советником, меньше, чем в пользовательском интерфейсе MT5. Также обратите внимание, что значение миллисекунд, записанное тестовым советником, равно нулю до 23:59.

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

Советник записывает Bid 1.16504 и Ask 1.16513 (спред = 9).

Пользовательский интерфейс MT5 показывает Bid 1.16504 и Ask 1.16518 (спред = 14)

Похоже, что тики, которые собирает ваш советник, являются симулированными тиками, а не реальными тиками. Проверьте журналы тестера стратегий.
 
Alain Verleyen #:
Похоже, что тики, которые собирает ваш советник, являются симуляцией тиков, а не реальными тиками. Проверьте журналы тестера стратегий.

Спасибо, Ален, я полностью согласен. Тиковые данные есть в пользовательском интерфейсе, но когда они попадают в советник, создается впечатление, что он берет первую попавшуюся пару Bid/Ask и применяет этот спред в течение следующей минуты - или что-то в этом роде.

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

Большое спасибо, Дэвид.

Файлы:
 
Mr David Frederick Roberts #:

Спасибо, Ален, я полностью согласен. Тиковые данные есть в пользовательском интерфейсе, но когда они попадают в советник, создается впечатление, что он берет первую попавшуюся пару Bid/Ask и применяет этот спред в течение следующей минуты - или что-то в этом роде.

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

Большое спасибо, Дэвид.

В вашем журнале написано "генерируется каждый тик", что означает искусственные тики. Должно быть "генерируется на основе реальных тиков". Пожалуйста, ознакомьтесь с документацией тестера.

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

Strategy Testing - Algorithmic Trading, Trading Robots - MetaTrader 5 Help
Strategy Testing - Algorithmic Trading, Trading Robots - MetaTrader 5 Help
  • www.metatrader5.com
The Strategy Tester allows you to test and optimize trading strategies ( Expert Advisors ) before using them for live trading. During testing, an...
 
Stanislav Korotky #:

В вашем журнале написано "генерация каждого тика", что означает искусственные тики. Должно быть "генерация на основе реальных тиков". Пожалуйста, обратитесь к документации тестера.

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

Спасибо, Станислав, я ценю помощь каждого, но я нигде не могу разобраться.

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

Тестирование и оптимизация на реальных тиках максимально приближены к реальным условиям. Вместо сгенерированных тиков, основанных на минутных данных, можно использовать реальные тики, накопленные брокером. Это тики от бирж и поставщиков ликвидности.

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

Итак, что я сделал...

  1. Экспортировал тиковые данные EURUSD из моего MT4 "Tick Data Suite" в формат MT5 ( Tick Data Suite (eareview.net)), который генерирует огромный CSV-файл (скриншот ниже).
  2. Импортировал этот файл в пользовательский символ в MT5, который я назвал EURUSD_TDS.
  3. Сделал скриншот части получившихся тиков в пользовательском интерфейсе MT5.
  4. Написал тестовый советник, который просто записывает цену и время Bid и Ask в каждом вызове OnTick() в CSV-файл (надо было назвать его TXT-файлом!).
  5. Запустил тестовый советник на EURUSD_TDSс настройками, показанными на скриншоте, который я приложил в ZIP-файле.
  6. Сравнил результаты в файле с тиками в пользовательском интерфейсе MT5 за те же даты - они не совпадают.
  7. Попросил помощи в выяснении причин несовпадения.
  8. Обнаружил, что, по-видимому, тестер генерирует искусственные тики - но дальше я не продвинулся.



Tick Data Suite
  • eareview.net
Everything you need to make your Metatrader 4 backtests accurate, get 99% modeling quality and to immediately spot which expert advisor is worth your time. From download to backtest, everything has been streamlined in an easy-to-use format. Updated often and offering premium-level support, the Tick Data Suite also has an associated recurring...
 
Mr David Frederick Roberts #: Я проверил документацию и не могу найти ничего, что объяснило бы мне, почему тестер генерирует искусственные тики, когда у него есть полный набор тиковых данных! На самом деле в ней говорится...

Потому что вы не выбрали"Каждый тик основан на реальных тиках " в настройках тестера:


 
Andrey Khatimlianskii #:

Тоже наткнулся на "HistoryCache: container header read error [0]" и следующий за ним "HistoryBase: invalid container (1970.01.01) found".

При этом, из истории пользовательского инструмента удаляется история за январь 2022, получается гэп с 31 декабря по сегодня.

Проявляется только на 2х компьютерах, ресурсов достаточно.

@Slava, какие нужны детали для воспроизведения?

Еще раз случилось. При переходе через полночь, похоже:

FK      3       23:59:27.790    HistoryCache    'BTCUSDT.bnf' container header read error [0]
PR      3       23:59:27.790    HistoryBase     'BTCUSDT.bnf' invalid container (1970.01.01) found (off: 3144282240, size: 86589, file: 1925419658)
HQ      3       23:59:28.071    HistoryCache    'LUNAUSDT.bnf' container header read error [0]
HD      3       23:59:28.071    HistoryBase     'LUNAUSDT.bnf' invalid container (1970.01.01) found (off: 3144242580, size: 86589, file: 1925434658)
RK      3       23:59:28.344    HistoryCache    'MANAUSDT.bnf' container header read error [0]
EJ      3       23:59:28.344    HistoryBase     'MANAUSDT.bnf' invalid container (1970.01.01) found (off: 3144247980, size: 86589, file: 1925447087)
CD      3       23:59:28.633    HistoryCache    'ATOMUSDT.bnf' container header read error [0]
KQ      3       23:59:28.633    HistoryBase     'ATOMUSDT.bnf' invalid container (1970.01.01) found (off: 3144177171, size: 86589, file: 1925399738)
HN      0       00:14:15.224    Terminal        MetaTrader 5 x64 build 3210 started for MetaQuotes Software Corp.
NS      0       00:14:15.225    Terminal        Windows 10 build 17763, 20 x Intel Xeon  E5-2650 v3 @ 2.30GHz, 12 / 15 Gb memory, 53 / 111 Gb disk, admin, GMT+3

В какую сторону копать?

 
Fernando Carreiro #:

Потому что вы не выбрали"Каждый тик основан на реальных тиках " в настройках тестера:


Аа, наконец-то :-)

Спасибо, Фернандо, я подозревал, что я делаю что-то глупое, но я просто не мог этого увидеть! Как я уже сказал, я гораздо больше знаком с MT4 (около 8 лет) и я не заметил, что в MT5 есть две опции "£Every Tick". Я просто запустил ее, увидел, что она установлена на "Every Tick" и предположил, что если у нее есть реальные тики, она будет использовать их.

Это должно было быть что-то простое, и я еще раз благодарю вас за то, что вы заметили это.

Дэвид.