Опция покупки карт
Было бы неплохо иметь опцию, в которой можно указать предельное соотношение цена \ доход. Иначе часто покупает абсолютно не выгодные карты за бешеную цену, когда через пять минут откроется другая, очень выгодная.
if settings.AUTO_UPGRADE is True:
for _ in range(settings.UPGRADES_COUNT):
available_upgrades = [
data for data in upgrades
if data['isAvailable'] is True
and data['isExpired'] is False
and data.get('cooldownSeconds', 0) == 0
and data.get('maxLevel', data['level']) >= data['level']
]
queue = []
for upgrade in available_upgrades:
upgrade_id = upgrade['id']
level = upgrade['level']
price = upgrade['price']
profit = upgrade['profitPerHourDelta']
# Calculate price/profit ratio
price_profit_ratio = price / max(profit, 1)
# Check if ratio meets the threshold
if price_profit_ratio <= settings.PRICE_PROFIT_THRESHOLD:
significance = profit / max(price, 1)
free_money = balance - settings.BALANCE_TO_SAVE
max_price_limit = earn_on_hour * 5
if ((free_money * 0.7) >= price
and profit > 0
and level <= settings.MAX_LEVEL
and price <= settings.MAX_PRICE
and price < max_price_limit):
heapq.heappush(queue, (-significance, upgrade_id, upgrade))
if not queue:
continue
top_card = heapq.nsmallest(1, queue)[0]
upgrade = top_card[2]
upgrade_id = upgrade['id']
level = upgrade['level']
price = upgrade['price']
profit = upgrade['profitPerHourDelta']
logger.info(f"{self.session_name} | Sleep <lw>5s</lw> before upgrade <le>{upgrade_id}</le>")
await asyncio.sleep(delay=5)
status, upgrades = await buy_upgrade(http_client=http_client, upgrade_id=upgrade_id)
if status is True:
earn_on_hour += profit
balance -= price
logger.success(f"{self.session_name} | "
f"Successfully upgraded <le>{upgrade_id}</le> with price <lr>{price:,}</lr> to <m>{level}</m> lvl | "
f"Earn every hour: <ly>{earn_on_hour:,}</ly> (<lg>+{profit:,}</lg>) | "
f"Money left: <le>{balance:,}</le>")
await asyncio.sleep(delay=1)
continue
Замени price_profit_ratio = price / max(profit, 1) на price_profit_ratio = price / (max(profit, 1) * max(profit, 1)) и будет тебе счастье.
Например, доходность от карты с ценой 1 монету на 10 монет в час такая же, как и у карты с ценой 10 монет на 100 монет в час, а именно = 0.1, но если посчитать ещё цену и за такой профит, то получается, что покупать за 100 монет такой же профит 0.1 не выгодно, чем купить такой же профит всего за 10 монет, поэтому считается эффективная стоимость покупки такого профита. Как в физике есть скорость м/с, а есть ускорение м/с^2. Так и тут, мы считаем стоимость ускорения, а не стоимость скорости.
Далее, из условия
if ((free_money * 0.7) >= price
and profit > 0
and level <= settings.MAX_LEVEL
and price <= settings.MAX_PRICE
and price < max_price_limit):
heapq.heappush(queue, (-significance, upgrade_id, upgrade))
убери сравнение free_money * 0.7 с прайсом. Пусть в очередь добавляются все, даже те, на которые сейчас не хватает денег. Но добавь условие if free_money >= price: перед отправкой запроса на покупку, чтобы оно не спамило на сервер даже если денег не хватает:
if free_money >= price:
status, upgrades = await buy_upgrade(http_client=http_client, upgrade_id=upgrade_id)
Таким образом бот будет ждать самую выгодную из всех карт с минимальной ценой за самый высокий профит, но если окончится время кулдауна, и он окажется выгоднее ожидаемой карты, то будет сначала куплена карта с кулдауном, а потом опять продолжится ожидание покупки самой выгодной на текущий момент.
Данный алгоритм можно усовершенствовать, если из условия:
if data['isAvailable'] is True
and data['isExpired'] is False
and data.get('cooldownSeconds', 0) == 0
and data.get('maxLevel', data['level']) >= data['level']
удалить строку and data.get('cooldownSeconds', 0) == 0, то если карта с кулдауном будет выгоднее всех, то бот будет ожидать её до посинения, если она является на текущий момент самой выгодной из всех даже если текущих денег хватает и на другие карты.
а кто-нибудь может залить готовый tapper.py со всеми улучшайзерами? думаю, многие будут благодарны
Замени
price_profit_ratio = price / max(profit, 1)наprice_profit_ratio = price / (max(profit, 1) * max(profit, 1))и будет тебе счастье.Например, доходность от карты с ценой 1 монету на 10 монет в час такая же, как и у карты с ценой 10 монет на 100 монет в час, а именно = 0.1, но если посчитать ещё цену и за такой профит, то получается, что покупать за 100 монет такой же профит 0.1 не выгодно, чем купить такой же профит всего за 10 монет, поэтому считается эффективная стоимость покупки такого профита. Как в физике есть скорость м/с, а есть ускорение м/с^2. Так и тут, мы считаем стоимость ускорения, а не стоимость скорости.
Далее, из условия
if ((free_money * 0.7) >= price and profit > 0 and level <= settings.MAX_LEVEL and price <= settings.MAX_PRICE and price < max_price_limit): heapq.heappush(queue, (-significance, upgrade_id, upgrade))убери сравнение free_money * 0.7 с прайсом. Пусть в очередь добавляются все, даже те, на которые сейчас не хватает денег. Но добавь условие
if free_money >= price:перед отправкой запроса на покупку, чтобы оно не спамило на сервер даже если денег не хватает:if free_money >= price: status, upgrades = await buy_upgrade(http_client=http_client, upgrade_id=upgrade_id)Таким образом бот будет ждать самую выгодную из всех карт с минимальной ценой за самый высокий профит, но если окончится время кулдауна, и он окажется выгоднее ожидаемой карты, то будет сначала куплена карта с кулдауном, а потом опять продолжится ожидание покупки самой выгодной на текущий момент.
помоги плиз, немного не понял как тут заменить
Подмени тот файл этим. Он будет ждать до последнего карточку с кулдауном, если она выгоднее даже той, у которой кулдаун прошёл. Но если выгода у той, которая уже не на кулдауне будет выше, а это обычно именно так, то будет куплена дешёвая без кулдауна. Внимание, тут убраны пороги на максимальную сумму покупки и на максимальный уровень. То есть сливать будет всё до последней копейки по порядку выгодности. tapper.zip
Подмени тот файл этим. Он будет ждать до последнего карточку с кулдауном, если она выгоднее даже той, у которой кулдаун прошёл. Но если выгода у той, которая уже не на кулдауне будет выше, а это обычно именно так, то будет куплена дешёвая без кулдауна. Внимание, тут убраны пороги на максимальную сумму покупки и на максимальный уровень. То есть сливать будет всё до последней копейки по порядку выгодности. tapper.zip
спасибо! те, кто будут качать - не забудьте добавить токены двух последних игр
А я ручками качаю по такой таблице:
есть же сайт удобный https://tapahelper.com/games/hamster_kombat
спасибо! те, кто будут качать - не забудьте добавить токены двух последних игр
Как получить токены, кстати?
в tapper.py найдите app_tokens и добавьте в список эти 2 новых
"dc128d28-c45b-411c-98ff-ac7726fbaea4": "8d1cc2ad-e097-4b86-90ef-7a27e19fb833", "61308365-9d16-4040-8bb0-2f4a4c69074c": "61308365-9d16-4040-8bb0-2f4a4c69074c"
Все ответы отличные, но все же, Основной посыл заключался как раз в том, чтобы сделать опцию для пользователя с выбором соотношения цена профит и прокачкой только выгодных карт, даже если есть кулдаун. Без вырезки других ограничений. Как это реализовать?
Прикладываю оригинальный файл таппера с добавлением токенов двух новых игр (что выше выложили)
Подмени тот файл этим. Он будет ждать до последнего карточку с кулдауном, если она выгоднее даже той, у которой кулдаун прошёл. Но если выгода у той, которая уже не на кулдауне будет выше, а это обычно именно так, то будет куплена дешёвая без кулдауна. Внимание, тут убраны пороги на максимальную сумму покупки и на максимальный уровень. То есть сливать будет всё до последней копейки по порядку выгодности. tapper.zip
Не помешало бы вернуть сюда пороги и добавить сеттингс в файл .env.
Еще один тонкий нюанс очереди. Не пойму - обновляется ли очередь покупки карт после покупки каждой карты? По сути - надо обновлять очередь.
Еще один тонкий нюанс очереди. Не пойму - обновляется ли очередь покупки карт после покупки каждой карты? По сути - надо обновлять очередь.
Она обновляется на каждом круге.
Добавили карту, которая по показателям показывает самую высокую выгоду, она самая дешёвая и у неё кулдаун на 12 часов. Имейте в виду, если меняете логику таппера, завязанную на ожидание кулдаунов.