Потихоньку изучаю питоновскую либу на битшариках и решил написать скрипт, который бы чутка следил за арбитражными треугольниками интересных мне ассетов (да те же голос и гбг). Когда открываешь пару на рудексе, то она разделяется символом нижнего подчеркивания. Собственно эту идею оставляем, пишем функцию, которая возвращает инфу по паре... но теперь беда... а как собственно сгенерировать все эти пары входящие в треугольник арбитража, ад еще в правильном направлении.
Начнем с простого. Пусть у меня есть список ассетов, которые мне интересно отслеживать (ибо все нет смысла). Как и него сгенерировать просто пары биржевые с разделителем "_"?
Чем хорош питон, как ЯП - на нем можно кодить как нуб и как профи и код все равно будет работать. К примеру можно написать самому такую функцию... можно просто в точке кода всякими циклами и проверками вставить, а можно воспользоваться уже готовым решением, ибо типовые ситуации кто-то до тебя уже сделал.
from itertools import combinations
list_assets = ['RUDEX.GOLOS', 'RUDEX.GBG', 'RUDEX.BTC', 'RUBLE', 'BTS']
list_tickers_rudex = ['_'.join(i) for i in combinations(list_assets, 2)]
Собственно функция combinations берет список list_assets и генерирует кортеж из неповторяющихся пар уровня 2 (то есть будут сочетаться два токена)
а конструкция [скрещиваем переменные for i in combinations()] и есть питоновский генератор списков.
Отлично, теперь можно в список скрипта добавлять или удалять интересные ассеты и смотреть что там к чему. Но теперь задача сгенерировать треугольник арбитража. Он выглядит примерно так.
RUDEX.GOLOS => RUDEX.BTC => RUDEX.GBG => RUDEX.GOLOS
Продали голоса, купили битки, продали битки купили гбг, продали гбг купили голоса. И чтобы работала та самая функция по извлечению информации по биржевым парам надо сгенерировать такой список
['RUDEX.GOLOS_RUDEX.BTC', 'RUDEX.BTC_RUDEX.GBG', 'RUDEX.GBG_RUDEX.GOLOS']
Как уже выше говорил, можно написать отдельную функцию (ибо это уже специфическая потребность), а потом ее вызывать, но если это синглтон и решение явно не будет мной масштабироваться в других скриптах, то можно все это исполнить через одну строчку (и забыть) магией питоновских генераторов.
Начнем с простого... для начала сгенерируем те самые треугольники
list_angles_rudex = [i for i in combinations(list_assets, 3)]
Но, чтобы сгенерировать полный цикл треугольника, мне теперь надо в конец списка добавить первый ассет... ну вот надо так.
list_angles_rudex = [(list(i)+[i[0]]) for i in combinations(list_assets, 3)]
Так как комбинация выдает кортеж, то его надо превратить в список list() и просто добавить к нему значение первого i[0].
Далее более... можно сгенерировать пары... теперь у нас задействуются два генератора списков
list_angles_rudex = [ ['_'.join([n[k], n[k+1]]) for k in range(3)] for n in [(list(i)+[i[0]]) for i in combinations(list_assets, 3)]]
Сначала через for n in [] мы обращаемся к сгенерированным спискам ассетов в треугольнике (с добавленным в конце ассетом который в начале). Далее делаем попарный срез первого со вторым... второго с третьим... и тертьего с четвертым. Тут конечно мудрено, сначала просто генерируем порядковые номера... первый второй третий (а точнее 0, 1, 2) через for k in range(3), а потом начинаем скрещивать n[k] + '_' + n[k+1]. Так + + + скажем так в питоне не есть гуд, то грамотно использовать функцию join().
И в завершении, чтобы хоть как-то идентифицировать потом визуально в скрипте а где какой арбитраж я решил превратить это все в словарь, где имя полученного треугольника как раз есть сочетание ассетов в нем '_'.join(n[:-1])
list_angles_rudex = { '_'.join(n[:-1]): ['_'.join([n[k], n[k+1]]) for k in range(3)] for n in [(list(i)+[i[0]]) for i in combinations(list_assets, 3)]}
Вот и всё. Всё уместилось в одну строчку. При желании можно на нее глянуть и освежить в памяти что и как там делается, при желании можно вывести ее в отдельную функцию
def generate_angels(list_assets):
return(то что последнее)
Так понимаю, что у многих уже голова пошла кругом, но это всего лишь одна строчка в коде ))) и на самом деле в ней нет ничего такого сложного, хотя магия генераторов может так и остаться для начинающих кодеров магией.
Только вот вряд ли получится успевать быстрее чем существующие арбитражные боты в битшарах. Они крайне быстро реализуют triangular arbitrage.
@vvk на самом деле даже и не смотрю в сторону арбитража внутри рудекса, хотя иногда боты наливают в ордера но хе по какому своему алгоритму.
если уж думать надо логикой внутри рудекса, то разве не надо поступить иначе, сначала сгенерировать все возможные текущие биржевые пары, а потом просто парсить блоки и как только кто-то выставляет ордер, который попадает в коридор арбитража, собственно скупать и крутить. но явно не сидеть и не опрашивать через дельта тайм тикеты по определенным парам. при этом это же фишка как раз децентрализованных бирж, ибо на централку надо вопрошать по их апи что у них там внутри творится.
Существующие боты как раз парсят блоки.
@vvk о том и речь. осталось только догадаться как синхронизировать при запуске бота одновременный парсинг со стартового блока и сбор информации о текущих ордерах.
может как-то постепенно по циклу добавлять пару на отслеживание
@ksantoprotein, поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:
Награда за общую выплату получил
Вы можете нажать на бейдж, чтобы увидеть свою страницу на Доске Почета.
Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом
стоп
@ksantoprotein, поздравляю! Вы добились некоторого прогресса на Голосе и были награждены следующими новыми бейджами:
Награда за Количество полученных комментариев
Вы можете нажать на бейдж, чтобы увидеть свою страницу на Доске Почета.
Если вы больше не хотите получать уведомления, ответьте на этот комментарий словом
стоп
Ваш пост получил апвот от сервиса @upromo за сожженные 26 GBG. Благодарность @ksantoprotein.
Сжигайте GBG
И получайте апы от UPromo. Просто нажмите на кнопку "Продвинуть" под постом на golos.id и введите желаемую сумму (Минимум 20 GBG)!
Посты получают 100% апвот, но они распределяются между раундами по 36 минут в зависимости от количества сожженных GBG: чем больше, тем быстрее будет ап.
Кроме того, у вас есть возможность попасть в топ промо при использовании указанной выше кнопки или отправки к null memo формата @author/permlink. Также вы будете принимать участие в рейтинге сжигающих по сумме за месяц и количеству сжиганий (учитываются переводы от 10 GBG).
Делегат @denis-skripnik создал этот сервис. Просьба проголосовать за него, чтобы поддержать дальнейшую деятельность, на golos.id или golos.io.
👍 by @rentmyvote service
@ksantoprotein, Поздравляю!
Ваш пост был упомянут в моем хит-параде в следующей категории:
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
shafarevich, spinner, andrvik, ili, cats, nikalaich, varja, t3ran13, cryptobandera, propoker, dr-boo, maryatekun, max-max, nefer, photofreediver, polyakov, dmitrijv, ramzansamatov, sergiy, turkish-r, prifix, acidgarry, borisss, lologom, tatyanamishenko, tnam0rken, boltyn, dayver, gildar, kvg, candy777, zelivsky, renat242, qm7, ladynazgool, voltash, delectat, lelya, carpe-diem, dignityinside, status7, mirgais, mjataura, arsar, oceanotechnic, makssib, jahspear, bitclabnetwork, dim447, charisma, kanenakat, olgablinova, now, seagull15, evgeniybb, dany2323, kinoshka, galinakim, lokkie
Поэтому я тоже проголосовал за него!
dobryj.kit теперь стал Делегатом! Ваш голос важен для всего сообщества!!!
Поддержите нас: