Потихоньку изучаю питоновскую либу на битшариках и решил написать скрипт, который бы чутка следил за арбитражными треугольниками интересных мне ассетов (да те же голос и гбг). Когда открываешь пару на рудексе, то она разделяется символом нижнего подчеркивания. Собственно эту идею оставляем, пишем функцию, которая возвращает инфу по паре... но теперь беда... а как собственно сгенерировать все эти пары входящие в треугольник арбитража, ад еще в правильном направлении.
Начнем с простого. Пусть у меня есть список ассетов, которые мне интересно отслеживать (ибо все нет смысла). Как и него сгенерировать просто пары биржевые с разделителем "_"?
Чем хорош питон, как ЯП - на нем можно кодить как нуб и как профи и код все равно будет работать. К примеру можно написать самому такую функцию... можно просто в точке кода всякими циклами и проверками вставить, а можно воспользоваться уже готовым решением, ибо типовые ситуации кто-то до тебя уже сделал.
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 теперь стал Делегатом! Ваш голос важен для всего сообщества!!!

Поддержите нас: