Лотерея на форексе
Цель этой статьи написание советника реализующего лотерею на форексе.
План статьи
Задачи торговли на
рынке Форекс
Задачи торговли на рынке Форекс можно разделить на три большие группы: «Заработать», «Сохранить» и «Преумножить». Рассмотрим каждую группу в отдельности.
1. «ЗАРАБОТАТЬ». Это стандартная задача на рынке Форекс. Звучит она так:
«У меня есть капитал, и я хочу, торгуя на рынке, его увеличить. Дайте мне советника, который из 100 рублей через сутки сделает гарантированно 101 рубль».
В задачах этого типа требуется гарантированное увеличение в среднем капитала.
Задачу «заработать» решает громадное количество конкурентов. Они прекрасно технически и информационно вооружены. Поэтому эта задача очень сложна, хоть и не безнадёжна. Исследования показывают, что валютные курсы отличаются от чисто случайных. Поиск своей торговой стратегии похож на поиск золота во времена золотой лихорадки.
2. «СОХРАНИТЬ». Звучит она так. «У меня есть 1000 рублей. Я хочу потратить их в отпуске в следующем году. Если я положу их в банк(у), то потеряю на инфляции где-то процентов 10. Дайте мне советника, который сохранит мои деньги. Я не хочу ни зарабатывать, ни терять деньги». По сути, в этой задаче требуется обменять рубли на валюту и обратно валюту на рубли в подходящие моменты времени.
В задачах типа «сохранить» требуется гарантированное сохранение в среднем капитала. «Сохранением» капитала занимается подавляющее большинство наших сограждан. Об этом говорят большое количество уличных обменных валютных пунктов и мультивалютные вклады в банках.
Задача «сохранить» не является математически сложной. Даже если выбирать моменты входа-выхода на рынок случайно, то в среднем отыграть инфляцию рубля вполне удаётся.
3. «ПРЕУМНОЖИТЬ». Задачи этого типа формулируются так. «Лотерея. У меня есть 100 рублей. Чтобы купить машину мне надо ещё миллион рублей. Дайте мне советника, который делает из 100 рублей один миллион. Я понимаю, что в среднем я теряю деньги. Вероятность выиграть миллион меньше чем сто/миллион. Но меня это устраивает».
Менее агрессивная формулировка такая. «У меня есть 1000 рублей. На закуску этого хватит, а вот на выпивку и девочек – нет. Дайте мне советника, который из 1000 рублей сделает 10 000 рублей. Пусть я потеряю свою тысячу с вероятностью больше чем 0.9 – закуска без выпивки и девочек мне всё равно не нужна. Зато с вероятностью чуть меньше чем 0.1 у меня будет всё».
Ещё одна востребованная задача. «На моём электронном кошельке осталось несколько центов (рублей). На них ничего не купить и не вывести в наличные. Дайте мне советника, который пусть и с небольшой вероятностью превратит их в значимую сумму.»
В задачах этого типа капитал в среднем гарантировано теряется. Но это всех устраивает. Вероятность выигрыша лотереи, разумеется, должна быть максимально возможной.
Этой задачей на рынке форекс мало кто занимается осознанно. Те не менее, судя по количеству лотерейных билетиков в различных кассах, эта задача в обществе востребована.
Математически задача «преумножить» давно решена. Воплощением в MQL5 советника этого типа мы и займёмся в этой статье.
В выше приведённую классификацию не входят задачи типа «Азартная игра – хочу адреналина!», «Красивая интеллектуальная игрушка – хочу поиграть на досуге» и многие другие вкусные задачи.
Итак, постановка задачи: требуется реализовать лотерею на рынке форекс. То есть увеличить капитал в несколько раз с какой-то вероятностью или разориться. Увеличивать капитал в среднем не требуется. Вероятность выигрыша должна быть по возможности максимальна. Форекс нужен как источник денег в случае выигрыша. Форекс используется также как всеми видимый генератор случайных чисел.
Идея алгоритма.
Предлагается следующий тривиальный алгоритм для решения задачи.
1. Входим в рынок в случайном направлении.
2. Ждём заданное время Т.
3. Выходим из рынка.
4. Проверяем
состояние счёта. Если выиграли лотерею или разорились, то заканчиваем торговлю,
иначе переходим снова к пункту 1.
Этот алгоритм исходит из того, что валютный курс есть курс монетки, то есть валютный курс представляет собой чисто случайное блуждание (http://www.mql5.com/ru/articles/248). Конечно, более адекватные модели рынка дадут более эффективный алгоритм.
Для начала оценим теоретическую вероятность выигрыша P. Обозначим начальный депозит Nd, размер выигрыша V. Тогда P=Nd / V. В реальном советнике вероятность выигрыша будет заведомо меньше, так как необходимо платить спрэды.
До написания советника на языке программирования MQL5 алгоритм необходимо детализировать. При детализации необходимо решить следующие вопросы
1. Размер кредитного плеча
2. Размер ставки
3. Тейк профиты и стоп лоссы.
4. Время ожидания Т
5. Выбор валютной пары
Ставка и кредитное
плечо
Так как мы угадываем с вероятностью 50 на 50 и нам необходимо платить спрэды, то количество сделок должно быть как можно меньше. На каждом трейде мы теряем один спрэд. Поэтому и размер кредитного плеча, и размер ставки должны быть максимальны,
чтобы за минимальное количество трейдов получить результат (разориться или выиграть лотерею).
Обычно, максимальный объём сделки по одной валютной паре ограничен брокером. Это ограничивает размер выигрыша и минимальные сроки проведения лотереи.
Рассчитаем, на какое время растянется розыгрыш лотереи. Допустим максимальный объём сделки 5 лотов. Это значит, что в торговле у нас находится 500 000 долларов. При «достаточно удачной» торговле в день мы можем выиграть 500 000*0.02=10000 долларов.
Коэффициент 0.02 имеет размерность «долларов прибыли с доллара капитала в день». Этот коэффициент является экспериментальной константой для рынка форекс. Он не зависит от таймфрейма на котором торгуем (без учёта спредов и свопов) и от валютной пары. Его можно измерить, исходя из относительного среднего размера бара и зная теорему о пьяном матросе (смотри ниже индикатор максимальной доходности курса и выбор валютной пары). Точность коэффициента 2-3 раза.
Если мы торгуем 100 дней, то дневную прибыль 10000 долларов надо умножать не на 100, а на корень квадратный из 100, то есть 10, так как мы торгуем на курсе монетки. И за 100 дней «достаточно удачной» торговли мы выиграем 100 000 долларов. А за 400 дней «достаточно удачной» торговли мы выиграем 200 000 долларов. Если кредитное плечо было 1:100, то, значит, начальный депозит был не менее 5 000 долларов
(500 000/100). Итого, мы за 100 дней увеличили начальный депозит в 20 раз, а за 400 дней в 40 раз. К сожалению, большей скорости увеличения депозита с таким максимальным объёмом и начальным депозитом нам не добиться.
Если начальный депозит мал и его не хватает на максимальный объём ставки, то скорость роста может быть значительно больше, вплоть до геометрической прогрессии. Но надо ещё найти брокера, который работает с малыми депозитами, и посмотреть его торговые условия.
Чтобы обойти ограничение по максимальному объёму, можно попытаться играть сразу на нескольких валютных парах. Если валютные пары независимые, то мы получим усреднение, и скорость роста получится меньше чем у одной валютной пары. Если курсы валютных пар коррелируют, как например EURUSD и EURCHF, то ограничение, может быть, и удастся обойти. Но корреляция курсов наблюдается далеко не всегда.
Таким образом, мы пока можем создать лотерею для умножения достаточно большого начального капитала на 10. Задачи про электронный кошелёк и машину за 100 рублей мы решить не можем. По крайней мере, для существующих в тестере МТ5 торговых условий.
Выбор тейкпрофита и стоплосса.
Тейкпрофиты и стоплоссы на курсе монетки только увеличивают частоту сделок. Чем ближе тейкпрофиты и стоплоссы к цене открытия, тем чаще они срабатывают и тем больше частота сделок. На вероятность выигрыша лотереи напрямую тейкпрофиты и стоплоссы никак не влияют. Поскольку сделок мы хотим совершить как можно меньше, то тейкпрофиты и стоплоссы не выставляем.
В реальности стоплосс всё-таки существует. Это стоп аут. Обычно он срабатывает на уровне 50 процентов и работу принудительно завершают. Поскольку после стоп аута на депозите ещё остаются деньги, то, это значит, что мы ещё не все шансы использовали и могли бы продолжать торговлю. Поэтому в советнике необходимо предупредить ситуацию стоп аута. Депозит должен быть исчерпан полностью до минимальной ставки, а в идеале до нуля.
Есть смысл выставить и тейкпрофит. Идея вот какая. Реальный курс всё-таки не курс монетки. Иногда на нём случаются аномально большие скачки, например, на новостях.

Наш алгоритм такие скачки может просто проспать. Если скачок случится не в сторону нашей последней сделки, и мы его проспим, то и хорошо. Хотя, тут может сработать стоп аут. А если скачок случится в нашу сторону, то упускать его жалко. Чтобы его заметить выставляем тейкпрофит.
Выставить тейкпрофит можно несколькими путями: прямой, второй и третий пути.
Прямой путь – отслеживать текущую цену и сравнивать её с историей цены. Это очень и очень не простой путь даже на алгоритмическом уровне.
Второй путь - отслеживать текущую прибыль и сравнивать её с прибылями предыдущих сделок. Как только прибыль заметно больше чем средняя прибыль предыдущих трейдов – фиксировать прибыль. Этот путь проще, но в начале работы советника истории сделок просто нет. Кроме того, сделок мы хотим совершать как можно меньше, а значит, история будет короткой.
Второй путь (другой вариант) - отслеживать текущую прибыль и сравнивать её с расчётной ожидаемой прибылью. Как только прибыль больше чем ожидаемая расчётная прибыль – фиксировать прибыль. Рассчитать ожидаемую прибыль можно исходя из истории цены, но это так же сложно, как и на прямом пути.
Третий путь – отслеживать соотношение баланса и эквити и сравнивать его с константами. Константы определить заранее при оптимизации советника. Константы, конечно, будут зависеть от условий торговли - кредитного плеча, максимального объёма сделки и т.д. И советник получится для каких-то конкретных торговых условий. Но торговые условия у всех брокеров примерно одинаковы. Возьмём типичные. И главное - этот путь максимально простой:
Если Эквити больше баланса в 2 (или 3) раза – фиксируем прибыль.
Если Эквити больше баланса на 10 (или 30) тысяч долларов – фиксируем прибыль.
Конкретные цифры 2, 3, 10, 30 … определяем при оптимизации.
Время ожидания T.
Если мы будем входить и выходить из рынка очень часто, например каждую минуту, то курс за минуту изменится мало, и прибыли мы получим мало, а фиксированный спрэд нам всё равно придётся заплатить. Суммарный спрэд перекроет всю полученную прибыль, даже если мы будем довольно удачно угадывать.
С другой стороны, если совершать сделки очень редко, например, раз в год или раз в месяц, то спрэд будет пренебрежимо мал по сравнению с прибылью за сделку. Но торговать придётся очень долго. Кроме того, держать позицию открытой долго не выгодно из-за свопов.
Поэтому существует какая-то оптимальная частота сделок. Она зависит от волатильности курса и торговых условий, например, плавающего спрэда. И посчитать оптимальную частоту сделок точно заранее не возможно.
Однако её можно оценить. Не вдаваясь в объяснения математики и изыскания, приведу график

На графике по оси абсцисс отложено время T – время одного трейда нашего тривиального алгоритма. По оси ординат отложено - сколько долларов прибыли мы бы получили с одного доллара капитала, торгуя одни сутки каждые T минут без кредитного плеча и капитализации прибыли на паре EURUSD. Говоря математически, здесь показаны границы распределения вероятности средств нашей тривиальной стратегии при различных временах T. Синяя кривая – при абсолютном угадывании курса, красная – при абсолютном не угадывании, жёлтая и голубая при «достаточно удачном/не удачном угадывании».
Так, входя и выходя на рынок каждую минуту (М1), мы бы за сутки с одного доллара капитала могли максимально выиграть 0.5 доллара, максимально проиграть 1.3 доллара. Наиболее вероятно мы бы проиграли 0.3 доллара.
За сутки мы бы совершили 1440 трейдов. За один трейд отдали 0.0002 доллара спрэда. Суммарный спрэд за все трейды за сутки составит 0.288 доллара. Средний размер минутного бара EURUSD 0.00056 доллара. Выигрыш при абсолютном угадывании 0.00056*1440= 0.8064 доллара. Вычитаем спрэд из выигрыша: 0.8064-0.288=0.51 доллара – получаем прибыль с одного доллара за сутки. Точку (М1, 0.51) ставим на график.
Нас интересует «достаточно удачное» угадывание – жёлтая кривая. Нарисуем её покрупнее

Мы видим что, торговать чаще, чем раз в 30 минут не выгодно – спрэд съедает прибыль.
Оптимальное время трейда Т для нашей торговли лежит в пределах от часа до недели.
Остановимся пока на этом. Позже в готовом советнике мы уточним оптимальное время с помощью оптимизатора.
Если у кого-то есть торговые идеи, предсказывающие курс лучше чем 50 на 50, то тривиальный алгоритм можно будет улучшить. Оптимальное время и оптимальная ставка при этом уменьшатся.
Выбрав время T, мы фактически выбрали таймфрейм графика на котором будем работать.
Строго говоря, при уже заданном времени Т, таймфрейм можно выбирать любой – работать советник будет одинаково, только рисовать на неподходящем таймфрейме будет неудобно.
Выбор валютной пары.
Поскольку курсы всех валютных пар мы считаем курсами монетки, то из всех курсов нам надо выбрать тот, у которого средний относительный размер бара больше. Тогда за меньшее число трейдов мы достигнем результата (разоримся или выиграем лотерею).
Для этого нам надо перебрать все доступные курсы валютных пар и посчитать для каждого средний относительный размер бара. Чтобы не делать этого вручную, напишем индикатор максимальной доходности курса Razvertka Close.

Индикатор максимальной доходности курса Razvertka Close на EURUSD, D1. Усреднение по 10 барам. Индикатор колеблется в пределах 2-3 раз.
После написания статьи случайно обнаружил, что индикатор волатильности (Kaufman Volatility) по книге Перри Кауфмана \Smarter Trading\ из набора МТ5 совпадает с точностью почти до константы с индикатором максимальной доходности.
Что поделаешь, когда не хватает кругозора, приходится изобретать велосипеды. Да и как разобраться в нескольких сотнях индикаторов и экспертов из стандартного набора? Никакого общего учебника то нет.
Оказывается, средний относительный размер бара колеблется в пределах 2-3 раз для одной валютной пары. В пределах этих же колебаний средний относительный размер бара одинаков для всех валют. По сути, индикатор показывает активность торгов.
При входе в рынок из всех валютных пар нам надо выбирать ту, активность торгов на которой выше, т.е. индикатор на которой максимален. Кроме того, торговать лучше днём, когда активность выше, а ночь пережидать. Торговля только днём увеличит шансы на выигрыш лотереи, но растянет почти в два раза время работы советника. Что лучше – большие шансы на выигрыш или сжатые сроки – решать пользователю.
Как уже обсуждалось выше, торговать можно хоть каждую минуту, но шансы на выигрыш при этом становятся мизерными. С другой стороны, торговать года для максимальной вероятности выигрыша мы тоже не можем. Соотношение «время торговли - вероятность выигрыша» должно было быть прописано ещё при постановке задачи, но кто же тогда знал, что всё так не просто?
Это типичный пример того, как сложно составить техническое задание на написание советника.
Пока, чтобы не усложнять советника, остановимся на непрерывной одновалютной торговле на привычной паре EURUSD.
Попутно отметим два интересных свойства индикатора.
1. На часовом таймфрейме индикатор показывает суточные колебания активности торгов
2. Максимумы индикатора соответствуют окончанию/началу трендов или флета.

Суточные колебания активности торгов показывает индикатор максимальной доходности.
Пара EURCHF, H1. Усреднение по 10 барам.

Индикатор максимальной доходности показывает максимумы, соответствующие началу/ окончанию тренда/флета. USDCAD, M5. усреднение по 10 барам.
Идея про запас: Если индикатор (активность на рынке) начинает возрастать выше своего среднего значения, то закрываем прибыльные позиции и оставляем убыточные – погода на рынке меняется. Если индикатор падает ниже своего среднего, то оставляем прибыльные позиции и закрываем убыточные - в ближайшее время погода не изменится.
Воплощение хорошо проработанного алгоритма в языке MQL5 - квалифицированная техническая работа. Код советника с комментариями прикреплён.
Оптимизация советника.
Советник оптимизируем под конкретные торговые условия: начальный депозит 5000 USD, плечо 1:100, время работы 1 год, выигрыш лотереи 100 000 USD.
Предлагаемая в терминале MT5 оптимизация советников нам не подходит. Действительно, нам при оптимизации надо получить максимальную вероятность выигрыша лотереи. Для этого нам надо запустить советника на 100 разных кусках истории и посчитать соотношение выигрышей/проигрышей. Запускать советника на одном куске истории бессмысленно: он нам выдаст проигрыш или выигрыш, состояние баланса будет заведомо 0 или 100 000.
Запускать вручную советника на 1000 кусках истории как-то лень. Поэтому пойдём другим путём. В советнике используется генератор случайных чисел для определения направления входа в рынок, то есть для создания случайной последовательности покупок и продаж. Давайте запускать советника с 1000 различными последовательностями покупок-продаж на 1 куске истории. Это, конечно, не то же самое что 1000 разных кусков истории, но очень похоже.
Для оптимизации какого-то параметра, например, времени Т, мы для каждого значения Т проигрываем 1000 различных последовательностей покупок-продаж и определяем вероятность выигрыша. Для этого выбираем медленную оптимизацию по двум параметрам: времени Т и номеру счастливого билетика, т.е. номеру случайной последовательности.
Результаты оптимизатора экспортируем в эксель и рисуем график

Определение оптимального времени T. График похож на теоретическую оценку – при малых значениях Т вероятность выигрыша практически нулевая. Форма графика зависит от куска и длины истории, но график всегда спадает к большим временам порядка 500000 секунд. Выбираем T=350 000 секунд.
Для определения оптимальных значений тейкпрофита мы наблюдаем за графиком баланса и эквити. Оптимизировать константы тейкпрофита по максимальному балансу опять-таки бессмысленно: большие выбросы случаются достаточно редко, может быть один раз за всё время работы советника, а то и реже. Если мы запустим оптимизацию по максимальному балансу, то произойдёт просто подгонка под данный кусок истории.
Проверка советника.
Для определения качества работы советника, запускаем его с 10000 разными последовательностями покупок-продаж. Таблицу результатов оптимизации утаскиваем в эксель и там считаем или рисуем соотношение выигрышей-проигрышей.
По результатам измерений советник выигрывает лотерею (набирает более 100000 USD) с вероятностью 0.045 при теоретическом пределе 0.05. Советник проигрывает лотерею (набирает меньше 150 USD) с вероятностью 0.88. Оставшаяся вероятность 0.075 приходится на значения баланса между 150 и 100 000 USD. Советник набирает средств больше начального депозита 5000 USD с вероятностью 0.1.

Время розыгрыша лотереи. Синяя кривая – количество трейдов в общем случае, красная кривая – количество трейдов в случае выигрыша. Как правило, лотерея заканчивается в течении 20 трейдов (2 месяца, 1 трейд = 350 000 секунд), но может длиться до полугода и более (60-70 трейдов). Выигрыши наиболее вероятны на 3-5 месяце лотереи (30-50 трейдов, красная кривая).
Выводы.
Написан лотерейный советник, который оптимизирован для конкретных торговых условий.
Преимущества и недостатки лотерейного советника очевидны:
Преимущества.
· В лотерею можно играть одному. Не надо продавать миллионы билетиков.
· Соотношение цены билета (начального депозита) и выигрыша можно выбирать.
Недостатки
· Очень большие сроки проведения лотереи – несколько месяцев. Медленный рост ограничен торговыми условиями.
· Возможное соотношение цены билета к выигрышу мало – порядка 1:10
· Необходим большой начальный депозит.