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

: Настройка интерфейса

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

Бектест в скальпинге, и в частности в терминале MoonBot, нужен не для повторения результата 1 в 1, а для того, чтобы посмотреть общее поведение стратегий на различных примерах рыночных ситуаций, и настроить их оптимальным образом под них.

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

В отличие от классических алгоритмов на свечах, где все цифры всегда четко заданы, и можно 10 раз посчитать “2+2=4” и получить всегда одинаковый результат “4” – у нас в скальпинге цифры случайны!

Причины случайности, которые разобраны ниже на примере двух терминалов MoonBot, которые торгуют одну пару одновременно с одинаковыми настройками, с двух разных выделенных серверов (VDS):

1) Лаг трейдов. 1 терминал получил трейды на 10мс позже другого, и подставил свой ордер на 10мс позже, и дальше ситуация пошла развиваться по полностью другому сценарию: первый терминал купил и продал в плюс, а второй терминал купил позже, НЕ продал в том же месте, и закрыл сделку по стопу. Чем более активен рынок, тем больше выражен этот фактор. Самый яркий пример – это стратегия “MoonStrike”, где в одной и той же ситуации один терминал успевает купить, а другой – нет.

Бектест работает в режиме ЭМУЛЯТОР и специально имеет встроенный фактор случайной задержки, чтобы эмулировать эту ситуацию.

2) Пересчет всяких параметров не происходит непрерывно в силу дискретности. То есть первый терминал посчитал что-то, второй раз он посчитает новое состояние рынка через время T1. Второй терминал делает такой же расчет чуть в другое время T2, даже 1мс разницы приведет к тому, что в расчет попадет уже новый трейд и результат расчета для второго терминала будет чуть другим. Другие расчетные цифры приведут к другим параметрам ордера, или отсутствию детекта на втором терминале.

Фактор дискретности также имеется и в бектесте, так как момент нажатия на кнопку “Старт” не синхронизирован с циклами пересчета рынка.

3) Аналогичные вещи происходят с Sell ордером, если вы используете те или иные алгоритмы управления Sell ордером, например: PriceDown (снижение Sell ордера по времени), SellLevel (подстройку Sell ордера под предыдущий максимум цены), SellShot (следование Sell ордера в заданных коридорах значений), SellSpread (подстройку Sell ордера под спред цены) и даже StopLoss. Сама операция перестановки Sell ордера не мгновенна. Разные моменты перестановки Sell ордера могут привести к разным итоговым ценам закрытия. В бектесте есть эмуляция времени перестановки ордера: случайная задержка 10-20мс, как и на реальной бирже.