Комментарии 30
Судя по комментам в коде, его писал chatGPT =)
# if current candlestick closed
if datetime.now().minute % 5 == 0:
# get latest price for the symbol
latest_price = client.futures_symbol_ticker(symbol=symbol)['price']
latest_price = float(latest_price)
prices.append(latest_price)
Вот это условие будет в течение 60 секунд добавлять цены в массив и запрашивать клиентский API, и еще, нужно проверять не текущее время суток, а время изменения цены, иначе, предположим, если рынок "замрет" на час, массив будет наполнен протухшими ценами
Да, Вы абсолютно правы, сейчас исправлю. Пытался упростить код, но допустил глупую ошибку :)
UPD: исправлено, спасибо за Ваше замечание!
лучше запрашивать готовые чарты, очень много мелочей нужно учитывать, например, бар может открыться с опозданием на несколько минут, или на несколько минут раньше закрыться, или вообще может быть пропуск бара.
более правильный подход - запросить снапшот баров, подписаться на асинхронные обновления и дополнять снапшот, тогда у вас будет всегда актуальный набор данных
Судя по стилю речи этот комментарий писал chatGPT =)
У вас очень много бесполезного дублирования кода.
'%Y-%m-%d %H:%M'
Прекрасно выносится в константы. Это удобно, расположено в одном месте.
prices[-2] < bollinger_band_high_values[-2] and prices[-1] > bollinger_band_high_values[-1]
Вот эти чудовища с индексами. Получите их один раз из своих контейнеров перед условиями. Аналогично со вторыми с конца.
Четыре функции вверху, которых на самом деле одна с разными параметрами. Ну или две. Исследуйте partial из functools или просто тупо через равно уберите дублирование кода :)
Я не очень вникал в предметную область, но недостаточно ли собирать за одну итерацию цикла текущее время? :)
Так же, ваш код не готов к ошибкам. Что будет если binance приляжет на секунду или запрос от вашего client будет неудачным? Наверняка будет выброшено исключение, которые остановит эту программу. И ее придется запустить заново ручками.
В тексте указано, что для простоты функции дублированы, поскольку открыть шорт и закрыть лонг для рынка фьючерсов -- это одно и то же (на этот счет даже написан комментарий, возможно, в первой части статьи). В то же время обработка всех исключений и ошибок сделает код более объемным и трудным для понимания. Задача сделать код оптимальным по количеству символов также не стояла :) Зато, надеюсь, некоторые дублирования помогут читателю лучше понять суть алгоритма
А зачем, если бинанс не для россии?
В целом, биржи используют очень похожие API, поэтому перепрофилировать код для работы с другой биржей не должно быть очень сложно :)
И главный вопрос - оно того стоит?)
Смотря, в чем измерять)
Автоматизированная рулетка.
Я не очень сообразителен, поэтому мне в своё время понадобилось что-то около недели знакомства с предметом, чтобы понять, что весь этот "технический анализ" - это попытка увидеть будущее, основываясь на графиках прошлого. Причем ладно бы был известен список факторов, влияющих на результат, и их можно было бы как-то мониторить, но там результат зависит от буквально всего. Лично я бы предпочёл иметь в друзьях не самого крутого "технического аналитика", а любимого сыночку верхних работников ЦБ. В первом случае ты пытаешься угадать будущее, во втором - ты его знаешь.
Вы во многом правы) Технический анализ -- это действительно "предсказание" будущего на основе некоторых статистик из прошлого (в нашем случае -- скользящего среднего и отклонения). Весь технический анализ держится примерно на том, что рынок ведет себя "согласно некоторому паттерну", который и может описываться правилами технического анализа. И иногда это правда, поскольку, если углубиться в теорию случайных процессов, первое что Вы увидите -- это (скорее всего), что цена актива (P_t) не стационарный процесс, а значит не имеет свойства "отката" (mean-reverting property). Однако локально (на этом и держится тех анализ), возможно, это и имеет место быть...
Но, на моем опыте, техническому анализу очень мешают всплески волатильности (и резкие движения (скачки) цены), которые ведут к значительным потерям. По поводу предсказания всплесков волатильности можете посмотреть мой репозиторий с моделью)
https://github.com/AlexanderShulzhenko/Short-term-Volatility-Prediction
Репориторий с любой прекрасной моделью не говорит ни о чем. Значение имеет только одно - насколько он лучше рынка по прибыли.
Технический анализ — это как производство вакцин по гороскопам клеток (китайского хомячка), на которых их производят. Давайте так. Либо строим МТС на основании понятных эффектов, стоящих на неэффективностях цен, либо строим некоторый ML-пайплайн, с определённой достоверностью извлекающий эти незффективности. Оба подхода рабочие, и продолжат ими оставаться. Ни пересечение MA, ни чистый Боллинджер, не являются продуктивными идеями, приносящими прибыль на практически любом известном инструменте. Это глупый фольклор. Разве что в бытность FTX это могло бы работать, когда там воротили они такие потоки, что грех было бы не торговать против них. С другой стороны, Z-преобразование (ассоциировано с полосами Болинджера, хотя конечно Z-преобразование — это ко временам Гаусса, когда оно так ещё не называлось), безусловно, является рабочей лошадкой многих МТС-сборок (не люблю я их называть роботами, это наименование бесперспективно испорчено рынком псвевдо mt-роботов).
Не могу не согласиться полностью, назвав это до кучи гаданием на кофейной гуще. Не в смысле примененной теории, а в смысле конечного результата.
Уверен, что большинство проф.трейдеров имеют все эти анализы нв 10 порядков круче, глубже и ширше, но где-то читал про исследование о том, что половина проф.трейдеров имеют итоговый процент роста их фондов меньше среднего по рынку (брать случайные акции или по индексу) - что и должно быть - если кто-то выигрывает, то только за счёт того, что кто-то проигрывает.
Так вся биржевая торговля - игра с нулевой суммой. Особенно - бинарные опционы, их в части европейских государств признали просто азартной игрой. Все пытаются именно что выиграть у остальных. При этом тратя кучу ресурсов на, фактически, перераспределенние ресурсов. Меня в том числе и это оттолкнуло от всей биржевой торговли, потому что никакой пользы обществу ты не приносишь этой деятельностью. Да и себе тоже, по большому счёту. Стал богаче (конкретно ты - ой, вряд ли), отобрав у другого такого же лудомана. Просто жажда наживы и всё. Поэтому вокруг этой темы куча инфоцыган, у которых в ЦА, судя по картинкам и текстам в ТГ, аудитория подросткового и чуть выше возраста, так как истории успешного успеха у каждого второго на фото - "с пачками деняк в салоне бэхи". Для лудоманов постарше предлагают Баффета, сдабривая это книжками тех единиц, которые пришли к успеху. Те сотни и тысячи, чьи деньги успешным единицам перетекли в результате "торговли", увы, книг не написали.
Чисто технически вся эта "торговля" - задача интересная, к тому же азарт наживы подогревает интерес. Но лично я, узнав про суть всей движухи, по этическим причинам заниматься этой гадостью не буду. Для меня деньги "пахнут". Потому я неконкурентоспособный и сознательно выбрал проигрыш в эволюционной борьбе.
А почему бы не использовать talib для вычисления тех же полос боллинджера? Одна строчка и готово
А как этот API решает вопросы контроля? В коде есть магические команды, типа: client.futures_create_order
Но, это же деньги. Значит контроль должен быть. И по своему опыту, говоря о любых скриптах такого рода, первое о чем надо говорить - это не стратегии, а том как это все заставить работать постоянно, с восстановлением состояния после падений, контролем исполнения команд и т.д. И это будет большая часть кода. Но постоянно вижу скрипты где этот вопрос вообще не разбирается, а есть только алгоритмы принятия решений. Хотя они по большей части бессмысленны.
Александр, вопрос про moving average crossover. Я сейчас хочу реализовать эту стратегию у себя для учебных целей. У вас описаны в ней только условия входа в лонг и шорт. А условий выхода нет. Не могли бы добавить или дать референс где описаны все 4 кейса?
Здравствуйте! Стратегия в классическом виде неплохо описана тут: https://www.researchgate.net/publication/370888513_Simple_Moving_Average_SMA_Crossover_Strategy_with_Buy_Sell_Indicator
Если вкратце, то есть две версии стратегии: "trend following" и "reversed". Они абсолютно зеркальны. Если мы говорим о "trend following" стратегии, то обычно:
1) открывают шорт, когда короткая скользящая средняя пересекает длинную сверху вниз;
2) закрывают шорт и открывают лонг когда короткая скользящая средняя пересекает длинную снизу вверх;
3) закрывают лонг, соответсвенно, когда открывается шорт (когда короткая скользящая средняя пересекает длинную сверху вниз).
То есть момент закрытия одной позиции совпадает с открытием противоположной.
(Reversed стратегия меняет местами шорт и лонг.)
Торговый бот на Python с нуля (с использованием Binance API), часть 2