Всем привет.
Почти дописал своего первого робота и хотелось бы услышать мнение людей, кто занимается этим давно.
Сам алгоритм довольно простой (не простой мне написать пока сложно, т.к. программирование начал изучать всего пару месяцев назад).
Робот под ТСлаб. Оттестирован на 2х инструментах. Ри и Си.
Тестировал на истории 3 года.
Оптимизируемых параметров 5 (3 из них для трейла).
Размер проскальзывания установил 70п для тестирования Ри (достаточно ли?)
var comisHnd = new AbsolutCommission() {Commission = 35};
Планирую торговать 12 контрактов. Депо 1 млн. Риск на сделку 2% от депо.
Стоп для Ри 1750 пунктов.
Максимальная просадка на 3 летнем периоде составила 27%.
Интересно услышать мнения и предостережения людей по поводу подводных камней с которыми могу столкнуться.
Из того что смущает меня самого:
1. Скрипт не открывается на первом утреннем часе, но может быть в позиции в это время. Побаиваюсь, что могу пролететь со стопом.
2. Пока не понял, как часто нужно обновлять оптимизируемые параметры и на какой истории это делать.
3. Как понять, что скрипт перестал работать (после какой просадки нужно его останавливать).
4. На какие параметры нужно обращать внимание при тестировании будущих скриптов, кроме макс просадки и доходности?
2. Хоть каждый день. Всё зависит от того, каков физический (финансово-экономический) смысл этих параметров и аналогично каков смысл процедуры оптимизации (не математическо-вычислительный, а опять же физическо-финансовый).
3. Достоверно (с вероятностью 1) никак. Это, скорее, вопрос психологический.
4. Средняя сделка, профит-фактор и фактор-восстановления. Однако, намного важнее и полезнее смотреть не на формально голые числа каких-либо показателей, а индивидуально просмотреть каждую сделку на истории, чтобы четко понимать, где и за счет чего ваша система зарабатывает и теряет.
P.S. Единственное, что может вам помочь — это уверенность в двух моментах:
1. Ваша система основана на закономерности, присущей Ри и Си.
2. Ваша система не запоминает удачные входы-выходы на предыстории, а эксплуатирует найденную в п.1 закономерность.
3. Результаты системы на истории не являются ошибкой вычислений (заглядывание в будущее) или сделками, которые невозможно исполнить в реальных торгах.
Собственно, для проверки того, что система не сломалась, вам необходим тест, который вы, условно говоря, проводите с каждым новым тактом (баром), чтобы убедиться в том, что закономерность на рынке осталась и нужно продолжать торговать, не взирая, скажем, на текущую просадку в 35 или 40%.
Он должен либо быть очень коротким, либо привязываться к волатильности. Как вариант, можно цеплять за хай/лоу нескольких предвходных баров или экстремумов (таким образом тоже учитывается текущая волатильность).
Это от системы зависит. Если трендовая, то стоп должен быть к*волатильность (к — параметр в бОльшей степени зависит от психотипа трейдера). А если контртренд, то стоп — это факт наличия тренда, т. е. сравнительно далекий.
Ни то, ни другое и не третье, но это и не столь важно при наличии коэффициента k
Когда просадка превысит тестовую на истории — в вашем случае за три года.
Запустить и через год остановить с убытком 30-40-50% вероятность более 50% (не математически, а чисто логически) — это ж ведь не ваша цель?
PS: меня нельзя считать алготрейдером со стажем, так что…
Можете считать, что это мнение ПРОСТО трейдера )
-запустить робота который сделали и не разу не вмешаться в его торговлю
-столкнутся с множеством различной степени косяков технической стороны и решить их с приемлемым для вас уровнем остаточного техн. риска
-думать
-писать параллельно с этим других роботов, много роботов, по сути большая часть вашего времени должна быть занята исследованиями
-чтобы понять какие метрики оттестированной стратегии важны, то тестируйте на истории до 15 или 14 года, а потом смотрите чтобы было в эти года, что изменилось, какие чувствительные метрики в ваших стратегиях (одна из ключевых это вола, выше уже подсказали)
-учить апи тслаба, сишарп, теор.вер., эконометрику
дальше сами поймете что вам делать
проскальзывание 70 пунктов выглядит даже излишним, хотя это зависит. в РИ в принципе более менее ликвидно.
какие параметры смотреть — вам решать. выглядит всё неплохо, хорошее мат ожидание, высокий фактор восстановления. можно ещё сортино посчитать.
вообще же всё зависит что за стратегия. у каждой стратегии своя фитнес функция, по-моему.
PS: а картинками мы и сами богаты...
1. Запустите ЛЮБОГО робота на реале, одним лотом. Feel that. )))
2. Роботы, которые сидят по полгода в +- 0 не достойны реальных счетов. Проверено лично и на очень большом депозите. Соответственно, совет:
3. Опираясь на логику, построенную в роботе, найдите объяснение рывкам по прибыли и убыткам. Именно рывкам, резким приростам или убыткам. Все остальное шум. Если не сможете выявить закономерность, в мусорку. Если сможете — вуаля, это будет толковый робот. )
Сложность такой оценки заключается в том, что рывки могут быть связаны с какими-то факторами, не заложенными в базовую логику. Но с таким подходом к самой роботизации изменится подход к оценке качества и логике самих роботов.
… не прочувствовать ту жопу, что начинается внутри у робота при частичном исполнении заявок… ^^'
а вообще у меня когда вот такое было
function isLastContractDay()
{
CyrDateNum = DateNum();
result = ( CyrDateNum == 1080307)
|| (CyrDateNum == 1080607)
|| (CyrDateNum == 1080912)
|| (CyrDateNum == 1081209)
|| (CyrDateNum == 1090306)
|| (CyrDateNum == 1090609)
|| (CyrDateNum == 1090909)
|| (CyrDateNum == 1091209)
|| (CyrDateNum == 1100309)
|| (CyrDateNum == 1100609)
|| (CyrDateNum == 1100909)
|| (CyrDateNum == 1101209)
|| (CyrDateNum == 1110309)
|| (CyrDateNum == 1110609)
|| (CyrDateNum == 1110909)
|| (CyrDateNum == 1111209)
|| (CyrDateNum == 1120307)
|| (CyrDateNum == 1120609)
|| (CyrDateNum == 1120907)
|| (CyrDateNum == 1121207)
|| (CyrDateNum == 1130307)
|| (CyrDateNum == 1130607)
|| (CyrDateNum == 1130909)
|| (CyrDateNum == 1131209)
|| (CyrDateNum == 1140305)
;
return result;
}
1. Скрипт не открывается на первом утреннем часе, но может быть в позиции в это время. Побаиваюсь, что могу пролететь со стопом.
Пролетишь и обязательно!!!.. Поставь в условия робота, что если это первая свечка дня, то закрываемся не по стопу, а по цене закрытия свечи, так ближе к реальности будет.
2. Пока не понял, как часто нужно обновлять оптимизируемые параметры и на какой истории это делать.
Вот, вроде простой вопрос, а мне говорит о том, что такого робота рано включать в торги. Вопрос, говорит о том, что стратегия не проходила тест на подгонку параметров. В разных торговый программах это по разному называется, но суть такого теста в следующем: Берем 2 периода, первый — это период, на котором будем рассчитывать параметры (например 3 года), второй период — это период, в котором будем торговать по рассчитанным параметрам (например 3 месяца). И прогоняем с начала времен + большой период. для РТС будет выклядеть так:
InSample: 2005.01 -2008.12 OutSample 2008.01.01 — 2008.03.31
InSample: 2005.03 -2008.03 OutSample 2008.03.01 — 2008.06.30
И.т.д
Причем нас будет интересовать, только те цифры, что появятся в OutSample. Меняя эти периоды — сам поймешь, через какое время надо пересчитывать параметры.
3. Как понять, что скрипт перестал работать (после какой просадки нужно его останавливать).
На тестах есть параметр — максимальная просадка. Как только в реале макс просадка стала больше тестовой — останавливай.
Ну и 27% это много. Просто подумай, что как раз вот эти 27% есть сама реальная цифра во всей тестовой стратегии. Т.к. раньше или позже, но любой робот словит эту максимальную просадку, и это единственное, что ты знаешь на 100%.
4. На какие параметры нужно обращать внимание при тестировании будущих скриптов, кроме макс просадки и доходности?
Это кому как нравится, для меня любимый параметр CAR/MD, т.е. среднегодовая доходность деленная на макс просадку
В этом будут сбои, т.к. переоптимизация системы несет убытки, имхо. Надо пробовать работать без оптимизируемых параметров.
1 контракт на 100к вы по крайней мере сразу не сольете...
а со временем еще чё-нить придумаете.
Нужно торговать портфель алгоритмов, которые в идеале не скоррелированны. Какие это алгоритмы?
Трендовые.
Контртрендовые.
Инвесторские.
Консервативные.
Диверсификация ключ к успешной долгосрочной торговле.
github.com/sherman/onTSLab ( публичная часть).
Все reusable части я выношу в библиотеки.
1. Не используй TSLab для реальной торговли — он глючный очень. Используй для бек-тестов. Для реальной торговли я пишу код сам с нуля практически, в котором все понимаю до запятых.
2. Не торгуй сразу большим объемом. Первый месяц (как минимум) торгуй 1 лотом.
3. Не пользуйся трейлинг стопом — у него нет физического смысла, тебя будут снимать с тренда через большие шипы в твою сторону. Цена двинулась в твою сторону резко, потом резко откатилась и ты закрываешься. Научись подтягивать стоп по уровням.
4. Сначала торгуй 1 роботом на 1 инструменте 1 лотом. Сфокусируйся на 1 алгоритме, доведи его исполнение до совершенства. Когда выйдешь в плюс, начинай раскручивать маховик.
Пиши больше о своей торговле, дам больше советов. Но пока вот эти.
А стоп по по уровням это как? Чем от трейлинга отличается?
' Если есть активная позиция, и есть стоп, сверяем стоп с теоретическим стопом и если они не равны, удаляем стоп. Потом он выставится в следующей функции.
' При этом должно пройти достаточно много времени с последнего сдвига стопа и предыдущий стоп не должен быть нулевой
IF (TOTAL_NET <> 0) AND (STOP_ORDER_COUNT <> 0) AND (OPEN_ORDERS == 0) AND (NEW_STOP_ALLOWED == 1)
IF (TOTAL_NET > 0)
STOP_LOSS_ACTIVATION_PRICE = PREV_LOW_PRICE — ABS_STOP_LOSS
' Если в длинной позиции новый стоп выше предыдущего и позиция прибыльная, удаляем стоп
IF (STOP_LOSS_ACTIVATION_PRICE > STOP_LOSS) AND (PREV_CLOSE_PRICE > LAST_TRADE_PRICE)
KILL_ALL_STOP(1) ' Удаляем все активные стоп-заявки
MSG = ROBOT_NAME & ": Стоп перемещен. " & GET_VALUE(TRANS_RESULT, «DESCRIPTION»)
MESSAGE (MSG, 1) ' 1 — информация, 2 — внимание, 3 — ошибка
END IF
END IF
IF (TOTAL_NET < 0)
STOP_LOSS_ACTIVATION_PRICE = PREV_HIGH_PRICE + ABS_STOP_LOSS
' Если в короткой позиции новый стоп ниже предыдущего и позиция прибыльная, удаляем стоп
IF (STOP_LOSS_ACTIVATION_PRICE < STOP_LOSS) AND (PREV_CLOSE_PRICE < LAST_TRADE_PRICE)
KILL_ALL_STOP(1) ' Удаляем все активные стоп-заявки
MSG = ROBOT_NAME & ": Стоп перемещен. " & GET_VALUE(TRANS_RESULT, «DESCRIPTION»)
MESSAGE (MSG, 1) ' 1 — информация, 2 — внимание, 3 — ошибка
END IF
END IF
END IF
Но, советую запустить робота малым лотом, чтоб прочувствовать реальную торговлю. Чтобы потом было минимум сюрпризов, когда напишете стратегию получше, которой можно доверить суммы побольше. Про лям пока забудьте))
Кстати вчера наткнулся на стратегию «черепах» в инете. Буду пробовать кодить ее.
Ктонибудь ее уже делал? Какие результаты она дает?