Скачать MetaTrader 5

Прибыльные алгоритмы на трейлинг стопах

4 июля 2012, 14:34
Гребенев Вячеслав
45
10 072

Введение

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

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

Исследование алгоритмов начнем с привычной пары EURUSD и выходом по трейлинг стопу.

1. Алгоритм со случайным входом и выходом по трейлинг стопу

  1. Входим в рынок в случайном направлении;
  2. Выставляем трейлинг стоп размером TS;
  3. Ждем срабатывания трейлинг стопа;
  4. Возвращаемся к пункту 1 или прекращаем торговлю.

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

Чтобы не гадать, как будет работать алгоритм, напишем советника и испытаем его. О том, как выставить трейлинг стоп в программе уже много писалось. Опускаться с уровня алгоритма на уровень программы в этой статье мы не будем, иначе просто не доберемся до конца. Поскольку советника пишем для исследовательских целей, то возьмем максимальный депозит 100 000 USD и минимальную ставку 0.1. Так мы увидим более долгую историю, прежде чем нарвемся на стоп аут.

Сразу договоримся измерять трейлинг стоп TS и все другие стопы в этой статье в процентах от среднего размера пяти последних свеч (high-low) на текущем графике. Текущий график будет с таймфреймом D1. Свечей можно брать не пять, но и другое количество, принципиально это на рассуждения не повлияет. Важно, что при таком выборе шкалы измерения мы не зависим от текущей волатильности, а также от выбора валюты и валютной пары.

Для пробного запуска выберем TS=100 процентам на таймфрейме D1. При таком TS время одного трейда будет примерно сутки. Как уже обсуждалось выше, брать время трейда и TS меньше нельзя из-за быстрого слива по спрэду. Брать больше – сильно затянет время работы алгоритма.


Баланс алгоритма со случайным входом и выходом по трейлинг стопу, TS=100

Рис. 1. Баланс алгоритма со случайным входом и выходом по трейлинг стопу, TS=100

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

Но три вопроса оставляют чувство глубокого неудовлетворения после таких статей:

  1. Не является ли показанная прибыль подгонкой параметров под историю?
  2. Почему выбрана пара EURUSD? Что будет на других парах?
  3. Почему выбран именно этот кусок истории? Кроме того, у алгоритма случайный вход, и, может быть, показанная прибыль просто случайность.

Будем отвечать на эти вопросы последовательно.

У алгоритма со случайным входом и выходом по трейлинг стопу всего один параметр TS, и он был выбран исходя из совершенно общих соображений - слива по спрэду и времени трейда. Тем не менее, оптимизацию алгоритма все-таки провести следует.

Для оптимизации возьмем почти всю доступную нам историю с 1990 по 2012 гг. Поскольку у алгоритма случайный вход, то для каждого значения параметра TS будем брать 100 различных случайных последовательностей входов. Таким образом, мы избавимся от фактора случайности алгоритма и избежим подгонки под историю.

Рис. 2. Оптимизация размера трейлинг стопа TS на EURUSD, D1 (оптимальное значение TS=500)

Рис. 2. Оптимизация размера трейлинг стопа TS на EURUSD, D1 (оптимальное значение TS=500)

Оптимизация проводилась в режиме тестера "только цены открытия", поэтому расчеты неточные, особенно для малых TS, но общий характер передают правильно.

Как видно на рис. 2, оптимизация не дает четкого максимума. При маленьких трейлинг стопах TS, равных 50 и 100, идет слив. Далее при TS от 150 до 850 алгоритм показывает в среднем прибыль. При TS от 900 до 1500 алгоритм опять сливает.

Значения TS больше 1500 рассматривать не стоит. При TS=1500 алгоритм совершает примерно 25 трейдов за 22 года, что уже находится на грани разумного. Поскольку четкого максимума мы не нашли, то возьмем середину прибыльного диапазона от 150 до 850, то есть берем TS=500 (130 трейдов за 22 года).

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


Рис 3. Усредненный по 100 случайным входам баланс алгоритма со случайным входом и выходом по трейлинг стопу TS=500 на курсе EURUSD

Рис 3. Усредненный по 100 случайным входам баланс алгоритма со случайным входом и выходом по трейлинг стопу TS=500 на курсе EURUSD

Рис 4. Усредненный по 100 случайным входам баланс алгоритма со случайным входом и выходом по трейлинг стопу TS=500 на курсе GBPUSD

Рис 4. Усредненный по 100 случайным входам баланс алгоритма со случайным входом и выходом по трейлинг стопу TS=500 на курсе GBPUSD

Рис 5. Усредненный по 100 случайным входам баланс алгоритма со случайным входом и выходом по трейлинг стопу TS=500 на курсе USDJPY

Рис 5. Усредненный по 100 случайным входам баланс алгоритма со случайным входом и выходом по трейлинг стопу TS=500 на курсе USDJPY

Усредненные по 100 случайным входам балансы алгоритма со случайным входом и выходом по трейлинг стопу TS=500 на курсах EURUSD, GBPUSD и USDJPY, приведены на рис. 3-5. По осям ординат - усредненные балансы, по оси абсцисс - время. Рассмотрим усредненные балансы курсов подробнее.

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

Второе. Количество вертикальных подъемов на разных курсах разное. Так, на GBPUSD подъемов гораздо меньше, чем на USDJPY. Кроме того, подъемы расположены на времени совсем не хаотично. Сильный подъем 2009 года появляется одновременно на трех валютных парах EURUSD, GBPUSD и USDJPY. Посмотрев графики курсов, можно прийти к выводу, что подъем 2009 года является следствием кризиса декабря 2008 года. Таким образом, подъемы отмечают кризисы. С этого момента все заметные подъемы я буду называть кризисами.

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

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

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

Поведение алгоритма во время кризиса таково: алгоритм, если угадал направление тренда, ждет пика кризиса, подтягивает к пику курса трейлинг стоп, который и срабатывает при после прохождении пика. Если алгоритм не угадал направление тренда, то срабатывает трейлинг стоп в начале тренда, и алгоритм с вероятностью 50 на 50 переворачивает позицию. Таким образом, алгоритм удачно отрабатывает около трех четвертей всех реальных кризисов. На чем, собственно, и зарабатывает.

Как мы видим, для заработков алгоритму нужен кризисный трендовый курс. Из показанных выше курсов это курс EURUSD. А вот курс GBPUSD является антитрендовым и антикризисным. Почему такая разница в характерах курсов? Все, что я знаю из фундаментального анализа, это то, что между Европой и Америкой постоянно случаются торговые войны, а Англия и Америка сильно дружат. Цену этой дружбе мы и видим на графиках усредненных балансов алгоритма.

Характер курса может также определяться финансовыми регуляторами. Кризис 2008 года гасили финансовыми вливаниями, что отразилось скачками на усредненных балансах почти всех валютных пар. О кризисе 2008 мы хорошо знаем из тогдашних новостей. После этого США провели два количественных смягчения. Где, когда, куда и как вбрасывались деньги, нам в новостях почему-то как всегда не сообщили.

Усредненный баланс курса EURUSD показывает кризисы в 2010 и середине 2010 годов. Уж не те ли это смягчения? Регуляторы стараются проводить интервенции тихо, не информируя рынок. На курсе невооруженным глазом заметить кризис бывает сложно - пики или провалы на курсе далеко не всегда обозначают кризисы. Усредненный баланс курса служит проявителем – индикатором кризисов. Какие из кризисов, показанных на балансах, ложные, а какие истинные – отдельная сложная тема.

Отметим отдельно стабильность характеров курсов. Так баланс GBPUSD стабильно падает в течение 22 лет, а баланс EURUSD достаточно стабильно растет. USDJPY стабильностью не отличается. Стабильность характера курса очень важна, так как это единственная гарантия прибыльности алгоритма в будущем. Никакой другой гарантии прибыльности алгоритма в техническом анализе быть не может.

Итак, мы разобрались, как и на каких курсах зарабатывает алгоритм. Пора разобраться с прибылью. Выше мы использовали ставку 0.1 для исследовательских целей. Это не оптимальная ставка для извлечения прибыли. Рассчитаем оптимальную ставку. Прибыль растет пропорционально размеру ставки. Также пропорционально размеру ставки растет и риск нарваться на стоп аут. Для баланса EURUSD максимальная просадка на 200 USD была в 1991 году.

Если бы ставка была не 0.1, а 25, то просадка достигла бы уровня 50 000 USD или 50 процентов. То есть, при ставке 25 мы бы гарантировано нарвались на стоп аут. Таким образом, оптимальная ставка лежит между 0.1 и 25. Кто хочет, может посчитать оптимальную ставку точнее, я же просто возьму середину между 0.1 и 25, и грубо получу 10. Итак, оптимальная ставка 10.

При ставке 0.1 алгоритм заработал 1400 USD (см. баланс EURUSD). При ставке 10 алгоритм заработал бы 140 000 USD. Начальный капитал был 100 000 USD. Соответственно, за 22 года мы получили бы 140 процентов прибыли, или примерно 6 процентов годовых. С житейской точки зрения вроде бы и не много, но это уже больше чем ставка по валютным вкладам во многих банках.


Вариации алгоритма

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

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

Одна из самых простых идей – это алгоритм с обратным входом. Как мы видели выше, при неудачном входе в тренд и срабатывании трейлинг стопа алгоритм угадывал направление тренда с вероятностью 50/50. Давайте не будем заниматься угадыванием, а сразу войдем в направлении, противоположном предыдущему трейду.

2. Алгоритм с обратным входом и выходом по трейлинг стопу

  1. Входим в рынок в направлении, противоположном предыдущему трейду. Первый раз входим, например, в направлении buy.
  2. Выставляем трейлинг стоп TS
  3. Ждем срабатывания трейлинг стопа
  4. Возвращаемся к пункту 1 или прекращаем работу.

Создание советника по алгоритму – рутинная работа. Заморачиваться с оптимизацией TS не будем и возьмем старый оптимум 500. (Если оптимизацию все-таки провести, то все равно получится TS=500). Как и раньше начальный капитал 100 000 USD, ставка 0.1, D1.

Баланс алгоритма с обратным входом (первый вход - buy)

Рис. 6. Баланс алгоритма с обратным входом (первый вход - buy)


Баланс алгоритма с обратным входом (первый вход - sell)

Рис. 6. Баланс алгоритма с обратным входом (первый вход - sell)

На рис. 5-6 приведены балансы алгоритма с обратным входом. Как мы видим, направление первого входа имеет значение только до первого кризиса. После первого кризиса балансы становятся параллельными.

Как и раньше, алгоритм является псевдосливатором, и зарабатывает на кризисах, особенно на кризисе 2008 года. Просадки алгоритмов со случайным и обратным входом примерно одинаковы, а вот прибыль у обратного входа уже 9 000 USD, а не 1400 USD как раньше. А значит, и прибыльность будет уже не 6 процентов, а 6*9000/1400=38 процентов годовых. 38 % годовых с житейской точки зрения - совсем неплохо.

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

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

Напоследок не могу не воспользоваться стабильным сливным характером курса GBPUSD с картинки выше. Самое примитивное, что можно сделать, это заключать сделки в направлении, обратном сделкам алгоритма со случайным входом и выходом по трейлинг стопу. Но это не здорово. Гораздо лучше использовать трейлинг тейк или трейлинг профит, не знаю, как лучше назвать.

Трейлинг тейк – штука, очень похожая на трейлинг стоп, только вместо уровня стоп лосса, алгоритм все время пододвигает уровень тейк профита. Если текущая цена ушла от уровня тейк профита больше чем на величину TP, то пододвигаем тейк профит к цене. Уровень стоп лосса остается не выставленным, то есть остается на уровне стоп аута.

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

3. Алгоритм с обратным входом и выходом по трейлинг тейку

  1. Входим в направлении, противоположном предыдущему трейду;
  2. Выставляем трейлинг тейк TP;
  3. Ждем срабатывания трейлинг тейка;
  4. Возвращаемся к пункту 1.

Работаем на GBPUSD, D1, начальный капитал 100 000 USD, ставка исследовательская 0.1, TP=500.

Баланс алгоритма с обратным входом и выходом по трейлинг тейку. GBPUSD, D1

Рис. 7. Баланс алгоритма с обратным входом и выходом по трейлинг тейку. GBPUSD, D1


Алгоритм работает на антикризисных антитрендовых курсах.

Механизм работы алгоритма следующий: Антитрендовый курс стремится сломать любой тренд и свернуться в горизонтальный канал. Если в горизонтальном канале срабатывает тейк профит, то это значит, что мы уже около стенки канала и надо входить в направлении, обратном предыдущему трейду. Что мы и делаем.

Как мы видим на картинке, просадки у этого алгоритма чуть меньше чем у предыдущих, а прибыль 7000 USD за 19 лет при минимальной исследовательской ставке 0.1. Прибыльность при оптимальной ставке можно грубо оценить в 30 процентов годовых.

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

Заключение

В статье рассмотрено три алгоритма со случайными и обратными входами в трейд и выходами по трейлинг стопам. Показаны характеры курсов EURUSD, USDJPY и GBPUSD с точки зрения алгоритма со случайным входом и выходом по трейлинг стопу.

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


Прикрепленные файлы |
trailingstop.mq5 (10.41 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (45)
Valerii Mazurenko
Valerii Mazurenko | 19 июл 2012 в 00:15
Virty:
Вы хотите сравнить систему с выходом по тралу и ту же систему но с выходом по SL и TP. А потом сделать вывод-сравнение о трале и SL, TP. Так не получится. Симбиоз системы и трала или системы и  SL, TP гораздо сильнее индивидуальных свойств трала и SL, TP. Нельзя оторвать выход из трейда от входа и рассматривать его отдельно. Можно сравнивать только цельные алгоритмы. Куски алгоритмов сравнивать нельзя.

Если сравнивать "трал" и "нетрал", то ничего не получится; а вот "нетрал" и "трал" - очень даже легко, ибо очевидно, что при "трале" сделки закроются не позже, чем при "нетрале" (ну а там время сделок "нетрала" в файлик записать, а "трал" пусть по этому файлику ориентируется на открытие)

 

Valerii Mazurenko
Valerii Mazurenko | 19 июл 2012 в 01:07

notused:

 тралы... увеличивают дисперсию результата сделок.

Тут видимо погарячился, ибо дисперсия:

D[x] = M[x^2] - (M[x])^2

Матожидание при тралах уменьшается (доказано практикой, но вообще говоря, нужно ещё подумать) - пусть будет y:

M[y^2] <= M[x^2]

 и

(M[y])^2 <= (M[x])^2

Т. е., правые члены равенства не увеличились, но вот уменьшилась ли от этого дисперсия? Видимо,  может как увеличиться, так и уменьшиться.

В фундаментальном уравнении  Винса:

Оценочное TWR = ((A ^ 2 - D) ^ (N / 2))

чем выше TWR, тем быстрее рост. N - кол-во сделок. Но, теоретически, сделки лишь вопрос времени, поэтому прибыльность системы зависит только от этого выражения:

A ^ 2 - D
 (А - среднее, D - дисперсия).

Исходя из уравнения - идеальная задача трейдера - увеличить среднее (А) и уменьшить дисперсию. Но вместе с тем, можно и уменьшить среднее, если от этого дисперсия уменьшится сильнее, нежели квадрат среднего.

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

A(трал)^2 - D(трал) > A(нетрал)^2 - D(нетрал)

Подставив формулу дисперсии, можно развернуть ("трал" - y, A - М, "нетрал" - х - вернёмся к начальным обозначениям):

M[y]^2 - M[y^2] + M[y]^2 > M[x]^2 - M[x^2] + M[x]^2
2M[y]^2 - M[y^2] > 2M[x]^2 - M[x^2]

Видимо, в некоторых случаях, это неравенство вполне может выполняться.

Поэтому, предварительно, забираю свои слова обратно (о том, что трал не может быть выгоден). Но практически доказать этого пока не могу (свободного времени не хватает). 

P. S. Винс считал не в пунктах, но суть его формулы от этого не меняется.

P. P. S. Мог где-то и ошибиться 

P3.S. Уравнения Винса включают и тот факт, что матожидание может и увеличиться (теоретически) при трале.

Maxim Zaguzov
Maxim Zaguzov | 4 окт 2012 в 13:25
notused:

Тут видимо погарячился, ибо дисперсия:

Матожидание при тралах уменьшается (доказано практикой, но вообще говоря, нужно ещё подумать) - пусть будет y:

 и

Т. е., правые члены равенства не увеличились, но вот уменьшилась ли от этого дисперсия? Видимо,  может как увеличиться, так и уменьшиться.

В фундаментальном уравнении  Винса:

чем выше TWR, тем быстрее рост. N - кол-во сделок. Но, теоретически, сделки лишь вопрос времени, поэтому прибыльность системы зависит только от этого выражения:

 (А - среднее, D - дисперсия).

Исходя из уравнения - идеальная задача трейдера - увеличить среднее (А) и уменьшить дисперсию. Но вместе с тем, можно и уменьшить среднее, если от этого дисперсия уменьшится сильнее, нежели квадрат среднего.

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

Подставив формулу дисперсии, можно развернуть ("трал" - y, A - М, "нетрал" - х - вернёмся к начальным обозначениям):

Видимо, в некоторых случаях, это неравенство вполне может выполняться.

Поэтому, предварительно, забираю свои слова обратно (о том, что трал не может быть выгоден).

Очень интересные рассуждения и вполне логичные...


notused:

Но практически доказать этого пока не могу (свободного времени не хватает).

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


Sergey Molotkov
Sergey Molotkov | 10 май 2013 в 19:34
Администрация, обновите пожалуйста ссылки на советники в конце статьи, при попытке скачать выдается сообщение об ошибке сервера.
MetaQuotes Software Corp.
MetaQuotes Software Corp. | 14 май 2013 в 09:47
Обновили, спасибо за сообщение.
Знакомство с методом эмпирической модовой декомпозиции Знакомство с методом эмпирической модовой декомпозиции

Статья призвана познакомить читателя с методом эмпирической модовой декомпозиции. Данный метод является частью преобразования Гильберта-Хуанга и предназначен для анализа нелинейных нестационарных процессов. К статье приложен вариант программной реализации этого метода и кратко рассматриваются его особенности. Приведены простейшие примеры использования рассматриваемого метода.

Применение метода собственных координат к анализу структуры неэкстенсивных статистических распределений Применение метода собственных координат к анализу структуры неэкстенсивных статистических распределений

Центральной проблемой прикладной статистики является проблема принятия статистических гипотез. Долгое время считалось, что эта задача не может быть решена. Ситуация изменилась с появлением метода собственных координат. Это очень красивый и мощный инструмент структурного исследования сигнала, позволяющий увидеть больше, чем доступно методами современной прикладной статистики. В статье рассмотрены вопросы практического использования данного метода и приведены программы на языке MQL5. Рассмотрена задача идентификации функций на примере распределения, полученного Хилхорстом и Шером.

Почему MQL5 Market - лучшее место для продажи торговых стратегий и технических индикаторов? Почему MQL5 Market - лучшее место для продажи торговых стратегий и технических индикаторов?

Маркет MQL5.community предоставляет экспертописателям выход на уже сформированный рынок из тысяч потенциальных клиентов. Это лучшее место для продажи торговых роботов и технических индикаторов!

Самые активные участники MQL5.community награждены смартфонами iPhone! Самые активные участники MQL5.community награждены смартфонами iPhone!

Решив наградить наиболее выдающихся участников MQL5.com, мы выбрали ключевые критерии для определения их вклада в развитие сообщества. В результате по количеству опубликованных на сайте статей победили investeo (11 статей) и victorg (10 статей), а по количеству опубликованных в Code Base программ – Godzilla (340 программ), Integer (61 программа) и abolk (21 программа). Наградой победителям стали сенсорные смартфоны пятого поколения iPhone 4S.