Как тестируете стратегии для биржи? - страница 3

Aleksey Vyazmikin #:
Конечно происходит. У Брокера триггер сработал и только после этого он заявку на биржу от вашего лица передаёт - за это время что угодно может произойти.

Уточню: начисление положительного проскальзывания по цене до акцепта SL, как видно по тиковой распечатке. С тем что должно быть по Last или лучше по следующему bid - согласен.

Aleksei Kuznetsov #:

Уточню: начисление положительного проскальзывания по цене до акцепта SL, как видно по тиковой распечатке. С тем что должно быть по Last или лучше по следующему bid - согласен.

Я специально ответил на вопрос про реальность, а не тестер.

В своё время писал про тестер ещё у брокера Открытие - проблемы никто решать не будет - убедился я.

Да и потом - тестер только примерный результат может дать - и это надо принять.

На форексе так же полно особенностей, если покопаться, которые тестер не воспроизводит.

Aleksei Kuznetsov #:

Уточню: начисление положительного проскальзывания по цене до акцепта SL, как видно по тиковой распечатке. С тем что должно быть по Last или лучше по следующему bid - согласен.

По Last не может быть. Процитирую еще раз (инлайн):

Stanislav Korotky #:

Принято говорить "особенность", а не "ошибка" тестера ;-). 

Давайте называть ошибки и призывать их исправить. Отправлю ссылку на мой пост с описанием в ветки, которые разработчики читают (иногда/наверно)

Stanislav Korotky #:

PPS. В качестве решения можно посмотреть сюда.

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

Stanislav Korotky #:

По Last не может быть. 



Ну Last же исполняется об уровень в стакане, и если все предыдущие съедены, то этот уровень на долю секунды стал Bid. Впрочем от 1000 лотов Bid за 1 мс стал еще ниже и по этому Bid=Last больше никто не купит, так как выкуплены и другие уровни в стакане. Так что надо использовать следующий известный Bid. Согласен.

Итого: ошибка в том, что используется предыдущий Bid, а не следующий.

Проскальзывания могут показаться мелочью. Но это не так. В рассмотренном примере:

Сумма проскальзываний 124. Сумма пипсов от торговли -968. Общий итог -844. Проскальзывания улучшили результат на 13%.

То есть если все тесты на всех биржевых инструментах улучшены этой ошибкой на 13%, то люди будут иметь ошибочные результаты тестирования, будут торговать по заведомо бесприбыльным/убыточным стратегиям (ведь 13% довольно много и из 50/50 могут показать 37/63) и люди будут терять реальные деньги.

Aleksei Kuznetsov #:

Проскальзывания могут показаться мелочью. Но это не так. В рассмотренном примере:

Сумма проскальзываний 124 пт. Сумма пипсов от торговли -968. Общий итог -844. Проскальзывания улучшили результат на 13%.

То есть если все тесты на всех биржевых инструментах улучшены этой ошибкой на 13%, то люди будут иметь ошибочные результаты тестирования, будут торговать по заведомо бесприбыльным/убыточным стратегиям (ведь 13% довольно много и из 50/50 могут показать 37/63) и люди будут терять реальные деньги.

Или ошибка поэтому и не "замечается" и не исправляется? 

Поясню табличные данные с этого скрина.

В четвертой строке снизу Bid/Ask = 923.6/923.8.


Далее идут в одну миллисекунду Last-тики с таким флагом.

88 TICK_FLAG_LAST TICK_FLAG_VOLUME TICK_FLAG_SELL


Это владельцы (PriceMaker) BuyLimit-ов (формируют bid-банды - bid-цена и т.д.) в стакане получают срабатывание своих ордеров о крупный SELL-маркет (PriceGiver).

И это происходит в одну миллисекунду, но последовательно.

BuyLimit = 923.6 Volume = 15
BuyLimit = 922.8 Volume = 36 + 118
BuyLimit = 922.6 Volume = 10 + 30 + 30 + 3 + 252
BuyLimit = 922.4 Volume = 5 + 15 + 1 + 60 + 150 + 150
BuyLimit = 922.2 Volume = 5 + 30 + 30 + 30 + 30

Итого, выжрали все bid-банды разом от 923.6 до 922.2 (этот, возможно, не полностью). Поэтому в этот момент bid <= 922.2.

После этого через пять миллисекунд PriceMaker выставляет BuyLimit = 922.4 (и SellLimit = 923.6), тем самым поднимая bid до 922.4.


Как можно видеть, ценами исполнения сделок являются только bid/ask-цены. last-цены (с соответствующим флагом направления) - это общая DEAL-история биржи. Никакого отношения к Тестеру она не имеет.

fxsaber #:

Как можно видеть, ценами исполнения сделок являются только bid/ask-цены. last-цены (с соответствующим флагом направления) - это общая DEAL-история биржи. Никакого отношения к Тестеру она не имеет.

Про ошибку в тестере вы не упомянули: SL сработал по цене Bid до тригера SL, а не по цене Bid после него.

Еще кусочек информации о ситуации: выше я сделал небольшой скриншот (для читаемости без лишних кликов), вот полный:


Обратите внимание на время закрытия сделки с проскальзыванием +12: 2025.10.10 07:11:13.426

Это время именно Last тика, а не Bid в 2025.10.10 07:11:13.431

Тут пример неудачный, и можно решить, что SL тригенрулся об Bid, а не Last. 

Вод другой пример для первого тика с проскальзыванием +4:

SL установлен на 1 004.4. Время закрытия сделки = 2025.09.17 16:27:42.394, что соответствует времени Last c ценой равной SL, а не следующему Bid.

Следующий Bid равен 1004.6 и не являлся бы тригером для SL. То есть в тестере MQ тригером для SL являются именно цены Last. Отношение к тестеру здесь прямое. 

Думаю, что тестер правильно тригерит SL по Last (очевидно это и на бирже происходит из за выбирания уровней стакана), но не правильно то, что цена Bid берется предыдущая, а не следующая. 
Программист MQ просто немного поленился и применил Bid, который оставался на момент времени Last. Но повторюсь - этот уровень стакана уже полностью исчерпан и мой SL не может быть исполнен по этой цене.
Надо доделать немного и найти следующий в потоке тиков Bid. В данном примере тоже было бы положительное праскальзывание, но +2 по новому Bid, а не +4 по старому.