Ідея коротко
Tom Basso хотів показати, як мало важить точка входу. Він узяв 20 ф'ючерсів, близько 10 років денних даних і замінив сигнал монеткою. Якщо на закритті дня позиції немає, кидаємо монетку: орел купуємо вранці, решка продаємо. Далі позицію веде механічний трейлінг-стоп на 1 або 2 ATR (сам Basso точно не пам'ятає). Розмір задає однаковий відсоток ризику від поточного капіталу.
Один прогін із монеткою нічого не доводить, тому він запустив цикл із 1000 прогонів і усереднив результати. За його словами, кожна така серія в середньому давала прибуток. Висновок Basso: одержимість входом переоцінена, а роботу виконують вихід, розмір позиції, диверсифікація й тисячі угод.
Ця картка не про торгову систему. Це експеримент і еталон: з ним можна порівняти будь-який вхід і зрозуміти, чи додає він щось понад вихід і розмір.
Чому це може працювати
Логіка Basso така. Завдання трендової системи бути в кожному великому русі, а впіймати сьогоднішній обвал міг будь-який сигнал, що поставив у шорт позавчора чи в п'ятницю. Трейлінг-стоп швидко ріже угоди, які пішли не туди, і залишає ті, що пішли в наш бік. Рівний ризик не дає одній угоді зіпсувати результат, а 20 ринків дають достатньо угод, щоб перевага проявилася.
Застереження Finetiq важливіше за сам висновок. Якщо в цінах немає трендів, правило виходу саме по собі не створює додатного очікування: на випадковому блуканні середній результат такої системи дорівнює нулю до витрат і від'ємний після них. Отже, прибуток в експерименті Basso це тренди, які були в цих 20 ринках за ці роки, зібрані трейлінг-стопом. Експеримент показує, що вхід не головне для трендової системи на трендових ринках. Твердження «вхід не важливий узагалі» з нього не випливає.
Правила
Експеримент (автор, параметри Finetiq)
// денні бари, кожен ринок портфеля рахується окремо
IF MarketPosition = 0 на закритті дня
U = Coin(Seed, MarketId, BarDate) // Finetiq: випадкове число 0..1, див. блок нижче
IF U < 0.5 THEN BUY AT NEXT BAR OPEN // автор: орел, купівля вранці
ELSE SELL SHORT AT NEXT BAR OPEN // автор: решка, продаж
ATRn = ATR(21) // Finetiq: 21, як ATR у Keltner автора
k = 2 // автор: «1 або 2 ATR», пам'ятає неточно
// трейлінг-стоп підтягується лише в бік угоди (автор: «тягнув за ціною»)
Long: Stop = MAX(Stop[1], Close - k * ATRn) // Finetiq: від закриття бару
Short: Stop = MIN(Stop[1], Close + k * ATRn)
SELL STOP at Stop // лонг
BUY STOP at Stop // шорт
// після спрацювання стопа позиції немає, на найближчому закритті знову монетка (автор)
// цілі немає: вихід лише за стопом (автор)
Розмір позиції (автор, відсоток Finetiq)
RiskMoney = Equity * 0.5% // автор: однаковий % поточного капіталу
// Finetiq: 0.5%, як стартовий ризик у поточній торгівлі автора
Contracts = floor(RiskMoney / (k * ATRn * PointValue))
// Finetiq: Equity = закриті угоди + відкритий прибуток по всіх ринках, рахується перед кожним входом
// Finetiq: якщо Contracts = 0, угода пропускається, а лічильник пропусків пишеться у звіт
Відтворюваність: зерно, багато прогонів, розподіл (Finetiq)
// 1. монетка як функція від (зерно, ринок, дата), а не черговий виклик генератора
Coin(Seed, MarketId, BarDate) = Hash(Seed, MarketId, BarDate) / HashMax
// послідовний генератор ламає порівняння: інший вихід дає іншу кількість угод,
// і всі наступні монетки зсуваються. Хеш дає той самий кидок того самого дня за будь-якого виходу
// 2. серія прогонів
FOR Seed = 1 TO 1000
прогнати весь портфель
записати: підсумок після витрат, CAGR, MaxDD, кількість угод, % прибуткових, підсумок по ринках
// 3. читаємо розподіл, а не середнє
Median, P5, P95 для підсумку і MaxDD
ShareProfitable = частка прогонів із підсумком > 0 після витрат
// 4. порівняння варіантів: ті самі 1000 зерен, змінюється лише одне правило
// (множник стопа, сайзинг, список ринків). Різниця рахується попарно для кожного Seed
Застосування до картки turtle-4w-2w
// A: черепахи як є. Вхід на пробої 20 барів, вихід за 10-барним екстремумом, однаковий ризик
// B: той самий вихід і той самий ризик, вхід за монеткою, Seed = 1..1000
Percentile = частка прогонів B, у яких підсумок гірший, ніж у A
// A вище 95-го перцентиля B: пробій 20 барів додає едж понад вихід
// A в середині розподілу B: результат роблять вихід і розмір
// Finetiq: у B монетка кидається лише в дні, коли A теж міг би увійти (немає позиції),
// інакше B проводить у ринку більше часу і порівняння нечесне
Параметри
| Параметр | Значення | Звідки |
|---|---|---|
| Ринки | 20 ф'ючерсів | автор |
| Історія | близько 10 років, денні бари | автор |
| Вхід | монетка на закритті без позиції, виконання вранці | автор |
| Вихід | трейлінг-стоп на k ATR, без цілі | автор |
| Множник k | 1 або 2 | автор (пам'ятає неточно) |
| Період ATR | 21 | Finetiq (як у Keltner автора) |
| Розрахунок трейлінгу | від закриття, лише в бік угоди | Finetiq |
| Ризик на угоду | однаковий % поточного капіталу | автор |
| Відсоток ризику | 0.5% | Finetiq (стартовий ризик у торгівлі автора) |
| Кількість прогонів | 1000 | автор |
| Підсумок серії | середнє | автор |
| Підсумок серії в картці | медіана, 5-й і 95-й перцентилі | Finetiq |
| Джерело випадковості | хеш від зерна, ринку й дати | Finetiq |
Що перевірити
- Розподіл після витрат. Повторіть 1000 прогонів із комісією та прослизанням в один тік на вхід і вихід. Дивіться на медіану й частку прибуткових прогонів, а не на середнє: кілька вдалих зерен тягнуть середнє вгору.
- Контроль на даних без трендів. Перемішайте денні зміни ціни кожного ринку й проженіть ті самі 1000 зерен. Прибуток має зникнути. Якщо він залишився, у коді зазирання вперед або помилка розрахунку стопа.
- Множник і період ATR. k = 1, 2, 3 і період 10, 21, 50 на тих самих зернах. При k = 1 угод у рази більше, і витрати важать сильніше.
- Сайзинг. Рівний відсоток ризику проти одного контракту на ринок, ті самі зерна. Так видно, яку частину результату дає розмір, а яку вихід.
- Періоди й ринки. Розбийте історію на відрізки по 5 років і проженіть окремо. Потім 1, 5 і 20 ринків. Basso спирався на портфель: на одному ринку розкид між зернами буде величезним.
- Еталон для своєї стратегії. Схема з блоку «Застосування»: де підсумок вашої системи лежить у розподілі випадкового входу з тим самим виходом і тим самим часом у ринку.
Особливості платформ
TradingView (Pine Script)
math.random(min, max, seed)із заданимseedдає повторювану послідовність. Але це послідовний генератор: за іншого виходу монетки зсунуться. Для попарного порівняння рахуйте свій хеш від зерна йtime.- Стратегія торгує лише символ графіка, портфельного тесту немає (розділ 5 довідника). Експеримент на 20 ринках у Pine не повторити, лише по одному ринку.
- Штатного перебору вхідних параметрів у тестері стратегій немає. 1000 зерен вручну нереально, тому вивантажуйте угоди й збирайте розподіл поза платформою.
- Трейлінг у
strategy.exit(trail_points, trail_offset)задається в тіках. ATR-стоп надійніше передавати ціною черезstop =, перераховуючи на кожному барі.ta.atrзгладжує за Вайлдером.
MultiCharts і TradeStation (EasyLanguage)
- У вбудованої функції
Randomзадається лише верхня межа, зерна в параметрах немає, і однакова послідовність між запусками не гарантована. Для відтворюваності напишіть свій генератор від входуSeed, номера ринку й дати, наприклад лінійний конгруентний на цілих числах у межах точності double. - 1000 прогонів робляться оптимізацією за входом
Seedвід 1 до 1000: звіт оптимізації і є таблицею результатів по зернах. - Портфель із 20 ринків зі спільним капіталом потрібен для правила «відсоток від поточного капіталу». Це Portfolio Maestro або Portfolio Trader. Перевірте, чи підтримує ваша версія портфельного модуля перебір входів, інакше вивантажуйте угоди для кожного зерна.
AvgTrueRangeце просте середнє TrueRange, а не Вайлдер. Стоп ставте ціною:Sell next bar at StopPrice stop, ордер надсилайте на кожному барі.
MetaTrader 5 (MQL5)
- Генератор:
MathSrand(Seed)вOnInitіMathRand(). Для попарних порівнянь краще той самий хеш від зерна, символу й дати бару, що й на інших платформах. - Перебір
Seedвід 1 до 1000 робиться оптимізацією в тестері. Потрібен повний перебір: генетичний алгоритм пропустить частину зерен. - Мультисимвольний режим тестера дає змогу вести 20 символів одним радником. У брокера мають бути всі ринки, а в CFD на ф'ючерси історія часто коротша за 10 років.
iATRце просте середнє TR. Розмір лота з ризику:SYMBOL_TRADE_TICK_VALUE,SYMBOL_TRADE_TICK_SIZE, округлення доSYMBOL_VOLUME_STEP. На малому рахунку багато угод округляться до нуля лотів.
Де ідея може зламатися
- Сам Basso називає такий спосіб торгівлі дурним і вважає, що індикатори додають небагато користі. Це демонстрація, а не стратегія.
- Цифр немає. Ми знаємо лише, що середнє по 1000 прогонах було додатним. Яким був розкид, найгірший прогін, просадка і чи враховувалися витрати, в інтерв'ю не сказано. Кількість років Basso називає за пам'яттю.
- Результат залежить від трендів у конкретних 20 ринках за конкретне десятиліття. На іншому відрізку чи на ринках без стійких трендів випадковий вхід із трейлінгом може дати нуль або збиток після витрат.
- Множник стопа точно невідомий. Між 1 і 2 ATR кількість угод і вага витрат різняться в рази.
- Випадкова система майже весь час у ринку: після стопа позиція відкривається вже наступного дня. Порівнювати її зі стратегією, яка більшу частину часу поза ринком, без вирівнювання експозиції некоректно.