Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
ksantoprotein
5 лет назад

Генераторы списков для арбитражного скрипта

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

Начнем с простого. Пусть у меня есть список ассетов, которые мне интересно отслеживать (ибо все нет смысла). Как и него сгенерировать просто пары биржевые с разделителем "_"?

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


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 (то есть будут сочетаться два токена)

image.png

а конструкция [скрещиваем переменные 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)]

image.png

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


list_angles_rudex = [(list(i)+[i[0]]) for i in combinations(list_assets, 3)]

image.png

Так как комбинация выдает кортеж, то его надо превратить в список 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)]]

image.png

Сначала через 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)]}

image.png

Вот и всё. Всё уместилось в одну строчку. При желании можно на нее глянуть и освежить в памяти что и как там делается, при желании можно вывести ее в отдельную функцию


def generate_angels(list_assets):
    return(то что последнее)

Так понимаю, что у многих уже голова пошла кругом, но это всего лишь одна строчка в коде ))) и на самом деле в ней нет ничего такого сложного, хотя магия генераторов может так и остаться для начинающих кодеров магией.

3
454.558 GOLOS
На Golos с July 2017
Комментарии (16)
Сортировать по:
Сначала старые