Разработка игры по маржинальной торговле

Давай поиграем в игру и проведем имитационную торговлю на криптовалютном рынке. В этой игре вы будете играть роль рынка, а я буду трейдером. Мы будем использовать сделки с биткоином в качестве примера, но вместо реальных цен вы просто придумаете числа, чтобы проиллюстрировать различные сценарии. Важно учесть «волатильность» цен биткоина, вы можете взять любой период, если есть такая статистика.

  1. Стартовая цена биткоина будет находиться в диапазоне от 23 000 до 28 000 долларов. Цена в ходе игры может достигнуть любого значения, как повышаясь, так и снижаясь.
  2. Начальный депозит составляет 50 000 долларов.
  3. Если депозит в процессе сделок превышает 50 000 долларов, мы будем учитывать только исходные 50 000 долларов, а все остатки будут перенесены в «банк». Если депозит становится меньше 50 000 долларов, то учитывается оставшаяся сумма. Мы будем рассчитывать риск от фиксированного депозита в размере 50 000 долларов или от меньшей суммы, если депозит уменьшится. Прибыль свыше 50 000 долларов будет рассчитываться отдельно.
  4. Вы можете выбрать долгую (лонг) или короткую (шорт) позицию.
  5. Вы можете установить уровень тейк-профита и стоп-лосса. При достижении одного из этих уровней сделка автоматически закрывается, без проскальзывания.
  6. Вы также можете установить трейлинг-стоп. В этом случае, если цена достигает уровня трейлинг-стопа, сделка закрывается. Если же цена продолжает движение в нужном направлении, трейлинг-стоп не влияет на сделку.
  7. если я пишу 1 это тейк профит 2 стоп лосс 3 трейлинг-стоп
  8. Комиссия биржи составляет 0,01% от каждой сделки. 1.
  9. Необходимо отслеживать изменения цен на каждом этапе.
  10. Раунд представляет собой полное открытие и закрытие позиции в плюс или минус. Пока сделка не закрыта, все это считается одним раундом

, но может иметь дополнительные этапы, например, раунд 1, этап 2. или ликвидация, нужна формула расчета ликвидации

  1. Рассчитывайте прибыль и убыток на каждом шаге игры (при каждом изменении цены) для удобства игры. Также отмечайте соотношение прибыли и убытка.
  2. Риск, который вы готовы принять при каждой сделке, составляет 5% от вашего начального депозита. Если ваш депозит составляет 50 000 долларов или более, риск равен 50 000 долларам. Если депозит меньше 50 000 долларов, риск равен всей сумме депозита.
  3. Вы можете использовать плечо в 5 раз, что означает, что ваше торговое сальдо будет равно 5 разам вашего депозита.
  4. При определении стоп-лосса вы должны установить уровень, на котором вы готовы закрыть позицию, чтобы не превысить свой риск в 5%.
  5. При определении стоп-профита вы должны установить уровень, на котором вы готовы закрыть позицию, чтобы зафиксировать прибыль.
  6. По окончании каждого раунда я буду сообщать вам новую цену биткоина, и вы принимаете решение о входе, выходе или изменении уровней стоп-лосса и стоп-профита.
  7. Для удобства игры, также указывайте номер раунда и при объявлении прибыли или убытка приводите среднее значение за всю игру, а также общее количество прибыльных и убыточных сделок. Укажите, насколько изменилась цена от начального значения (цены при входе в сделку). Например, если цена была 27 000, а стала 27 500, разница составляет 500 долларов.
  8. После 20 раундов мы проведем анализ вашей торговли и выявим возможные слабые места и уроки.

Evennia

Ваша игра кажется интересной и детальной. Однако она включает в себя множество сложных элементов, которые необходимо учесть при разработке. Я приведу некоторые шаги, которые могут помочь вам начать разработку этой игры в Evennia. Пожалуйста, помните, что это предварительные рекомендации, и вам потребуется углубленное понимание Python и Evennia, чтобы полностью реализовать эту игру.

  1. Создание объектов сделок: Ваша игра включает в себя сделки с биткоином. Вам нужно создать специальный тип объекта для этих сделок. Этот объект будет содержать различные атрибуты, такие как начальная цена, текущая цена, депозит, уровни стоп-лосса и тейк-профита, трейлинг-стоп, и так далее.
  2. Создание команд для открытия и закрытия сделок: Вам нужно создать команды для открытия и закрытия сделок. Эти команды должны быть доступны игроку и должны обновлять соответствующие атрибуты объекта сделки.
  3. Учёт изменения цен: Вам нужно создать механизм для отслеживания изменений цен биткоина. Это может быть реализовано с помощью повторяющихся скриптов или «тикеров» в Evennia, которые могут автоматически обновлять цену каждый определенный интервал времени.
  4. Расчет прибыли, убытка и риска: Вам нужно создать функции для расчета прибыли, убытка и риска на основе текущих и предыдущих цен, а также уровней стоп-лосса и тейк-профита.
  5. Управление сценарием: Вам нужно создать систему для управления сценарием игры, включая начало и конец каждого раунда, а также общую оценку результатов после 20 раундов.
  6. Сообщения об изменениях: Вы должны создать механизм для отображения сообщений об изменениях в сделках и ценах. Это может включать в себя обновления цен, уровней стоп-лосса и тейк-профита, а также результаты каждого раунда.
  7. Расчет комиссии: Комиссия биржи также должна учитываться при расчете прибыли и убытка.

Это лишь общий план, и вам потребуется значительное количество работы для полной реализации этой игры. Я советую вам начать с создания базовых элементов игры и постепенно добавлять больше функций по мере того, как вы становитесь более уверенными в своих навыках разработки с Evennia.

нет говорить о проблемах говорить о возможностях

Trader

Ваши требования относительно сложны и многообъемны. В связи с этим представлю вам основные функции, которые должны быть реализованы в игре, соответствующие правилам, которые вы представили. Ваш код может быть доработан поэтапно, чтобы включить каждую функцию.

  1. Расширение класса Trader, чтобы он мог управлять депозитом, банком, позициями и отслеживать тейк-профит, стоп-лосс и трейлинг-стоп. Он также должен уметь открывать и закрывать позиции.
  2. Добавление в класс Trader функции, которая будет обрабатывать команды пользователя для установки уровней тейк-профита и стоп-лосса, а также выбора длинной или короткой позиции.
  3. Расширение класса Trader, чтобы он мог автоматически закрывать сделки при достижении уровней тейк-профита, стоп-лосса или трейлинг-стопа.
  4. Расширение класса Trader, чтобы он мог отслеживать общую прибыль и убыток, а также соотношение прибыли и убытка.
  5. Расширение класса Trader, чтобы он мог управлять использованием плеча в 5 раз и устанавливать уровни стоп-лосса соответствующим образом.
  6. Расширение класса TraderGame, чтобы он мог отслеживать номер раунда и этапа, а также отображать информацию о текущем статусе игры.
  7. Расширение класса TraderGame, чтобы он мог отслеживать и выводить изменение цены от начального значения.
  8. После 20 раундов добавить функцию, которая будет анализировать торговлю и выявлять возможные слабые места и уроки.

Пожалуйста, учтите, что реализация всех этих функций может потребовать значительного времени и усилий. Если вы хотите продолжить, давайте начнем с расширения класса Trader для управления депозитом и банком и отслеживания тейк-профита, стоп-лосса и трейлинг-стопа.

  1. self.deposit — текущий депозит трейдера.
  2. self.bank — банк трейдера, который хранит все средства сверх начального депозита.
  3. self.position — словарь, который отслеживает текущую позицию трейдера, включая тип позиции (лонг или шорт), цену входа, объем и уровни тейк-профита, стоп-лосса и трейлинг-стопа.
  4. self.leverage — плечо трейдера, которое позволяет ему управлять суммой в 5 раз большей, чем его депозит.
  5. self.open_position() — функция для открытия позиции.
  6. self.close_position() — функция для закрытия позиции.
  7. self.update_position() — функция для обновления позиции в соответствии с текущей ценой.

Автоматическая стратегия торговли самим ботом

Для автоматизации процесса выбора действий мы можем ввести простую стратегию в классе Trader. Вместо того чтобы ожидать ввода от пользователя, мы будем принимать решения автоматически, основываясь на некоторых критериях.

Вот простой пример такой стратегии:

  1. Если текущая цена ниже начальной на 5%, открываем длинную позицию (long).
  2. Если текущая цена выше начальной на 5%, открываем короткую позицию (short).
  3. Уровень тейк-профита устанавливаем на 10% от текущей цены.
  4. Уровень стоп-лосса устанавливаем на 5% от текущей цены.
  5. Уровень трейлинг-стопа устанавливаем на 2% от текущей цены.

Конечно, это очень упрощённая стратегия, и на практике вам возможно потребуется использовать более сложные и надёжные методы для выбора действий.

Вставьте следующий код в метод play вашего класса TraderGame:

if not self.trader.position:
    if self.market.current_price < self.initial_price * 0.95:
        self.trader.open_position('long', self.market.current_price, LEVERAGE)
    elif self.market.current_price > self.initial_price * 1.05:
        self.trader.open_position('short', self.market.current_price, LEVERAGE)
else:
    self.stage += 1
    if self.stage == 2:
        self.trader.set_take_profit(self.market.current_price * 1.1)
    elif self.stage == 3:
        self.trader.set_stop_loss(self.market.current_price * 0.95)
    elif self.stage == 4:
        self.trader.set_trailing_stop(self.market.current_price * 0.02)
    elif self.stage > 5:  # assuming 5 stages per round
        self.round += 1
        self.stage = 1
        self.initial_price = self.market.current_price

Также убедитесь, что у вас в классе Trader есть соответствующие методы set_take_profit, set_stop_loss и set_trailing_stop, которые устанавливают соответствующие значения в словаре self.position.

Пожалуйста, учтите, что этот код – это всего лишь пример, и вы, вероятно, захотите использовать более сложные стратегии и методы управления рисками в реальной торговле.

Проценты

Проценты в кросс-маржинальной торговле начисляются каждый час.

Вы можете в любое время погасить займ и оплатить проценты за часы заимствования. Увеличение на один час будет учитываться как час.

Коммисия за удержание позиции по формуле

Процент = сумма займа × суточная процентная ставка/24 × часы

  • Дневная проц. ставка 0.01858347%
  • Годовая проц. ставка 8.230000% Пример: Андрей занимает 10 000 USDT в 8:05 UTC и погашает в 10:00 UTC. Суточная процентная ставка: 0,02% Часовая процентная ставка: 0,02%/24 Андрею необходимо оплатить проценты в 0,167 USDT по следующей формуле: процент = 10 000 × 0,02%/24 × 2

Комиссия за ликвидацию При маржинальной торговле комиссия за ликвидацию будет взиматься и вноситься в маржинальный страховой фонд. В случае банкротства вашей учетной записи, т. е. при ликвидации, когда у вас недостаточно маржинальных активов на спот аккаунте для погашения долга, платформа будет использовать маржинальный страховой фонд для погашения непогашенных остатков. Формула Комиссия за ликвидацию = Ликвидированные активы × Ставка комиссии за ликвидацию Возьмем приведенный выше пример: сработала ликвидация, и ликвидационная стоимость составляет 93,8069873440 USDT. Ниже показано, как рассчитать комиссию за ликвидацию. Ликвидационный актив = 93,8069873440 / (1+0,02) = 91,96763465 USDT Комиссия за ликвидацию = 91,96763465 x 0,02 = 1,8393526930 USDT

домашняя сеть-игра.drawio.png
  1. game.py: Этот запускает игровой цикл, следит за нажатиями клавиш, действиями игроков и обращается к разным модулям для разных функций объединяет все в одну игру
    • Баги # """ 0. Выводим приветствие - Берем из txt\\rules.txt - Возможность перейти в настройки, запускаем dev_settings_json.py 1. обращаемся к market.py - рассчитываем цену 1 хода (генерация случайного числа, запись в game\\json\\game.json переменная "entry_rate": 25176, ) - сохраняем значение в рамках работы текущего скрипта в переменную 2. обращаемся к trading_math.py - 1. Расчет комиссии за открытие позиции 3. обращаемся к trader.py - рассчитываем ход целиком (с учетом направления и прочего) 4. обращаемся к dev_game_ui.py - выводим шаблон 1 (данные собираем из файлов и переменных) 5. ждем в основном скрипте game.py какие клавиши будут нажаты """ нужно добавить выделение строк для блока Добро пожаловать в игру! например --------------------------------------------------------- Добро пожаловать в игру! --------------------------------------------------------- и такое же выделение для блока Введите 's' чтобы начать игру, 'r' чтобы прочитать правила, '00' для запуска симуляции, '0' для входа в настройки, или 'q' для выхода: например --------------------------------------------------------- Введите 's' чтобы начать игру, 'r' чтобы прочитать правила, '00' для запуска симуляции, '0' для входа в настройки, или 'q' для выхода: --------------------------------------------------------- 1. Нужно прописать
  2. trader.py: Этот файл содержит основной класс Trader, который моделирует действия трейдера на рынке. Класс имеет методы для открытия и закрытия позиций, установки прибыли и убытка, а также расчета комиссий и прибыли или убытка.
    • Баги Должен создовать свой файл с сделкой **Это основная логика работы** Механика открытия сделки Направления сделки (лонг/шорт) Механика стоп лосс (ограничение убытка) Механика трейдинг стоп (плавающий стоп, закрывается если доходит до него, если не доходит он не используется) Рассчет есть ли бюджет для шага Общий расчёт сделки нужно добавить в мой скрипт логику проверки стоп-лосс, тейк-профит, трейлинг-стоп 1. стоп-лосс для лонг сделки не может быть = текущей цене и выше ее, должен быть ниже текущей цены, для шорт сделки наоборот 2. тейк-профит для лонг сделки не может быть = текущей цене и ниже ее, должен быть выше текущей цены, для шорт сделки наоборот 3. трейлинг-стоп это по сути стоп который я ставлю например для лонга, я вошел в сделку лонг с ценой 100, поставил стоп лосс 80, тейк профит не ставил, сделал ход, цена стала 150, я ставлю трейлинг стоп на 120, теперь если на следующий ход цена будет выше 120 то он не срабатывает, например цена 170 и трейлинг стоп просто остается (сделка не закрывается) однако если я сделал ход и цена с 150 снизилась например на 110, то сделка закроется по цене установленного трейлинг стопа на 120 и расчет сделки будет по 120, а не 110, при этом стоп лосс остается 80 как и был. Для шорт сделки логика такая же только учитывается что это шорт 1. я открываю сделку лонг или шорт, не важно потом я нажимаю 4. Установить стоп-лосс и задаю его по правилам ранее, при этом цена не обновляется ход не делается я нажимаю 5. Установить тейк-профит и задаю его по правилам ранее, при этом цена не обновляется ход не делается Нажимаю 6. Установить трейлинг-стоп и задаю его по правилам ранее, при этом цена не обновляется ход не делается после этого как я все установил я нажимаю или 3. Закрыть позицию или 7. Сделать новый ход, в любом случае цена обновляется и если я просто сделал новый ход проверяются условия стоп-лосс тейк-профит трейлинг-стоп если они наступают сделка закрывается. Если я просто закрываю сделку это тоже генерирует и показывает новую цену и закрывает сделку **что касается** 7. Сделать новый ход 1. Открыть лонг 2. Открыть шорт 3. Закрыть позицию работает корректно, единственное новый ход не делается пока нет открытой позиции, но пусть так остается пока Эти пункты тоже работают корректно: 0. Новая игра 00. Вывести текущие значения Не работает правильно: 4. Установить стоп-лосс 5. Установить тейк-профит 6. Установить трейлинг-стоп Правильная логика 1. я открываю сделку лонг или шорт, не важно потом я нажимаю (если хочу) 4. Установить стоп-лосс и задаю его по правилам ранее, при этом цена не обновляется ход не делается я нажимаю (если хочу) 5. Установить тейк-профит и задаю его по правилам ранее, при этом цена не обновляется ход не делается Нажимаю (если хочу) 6. Установить трейлинг-стоп и задаю его по правилам ранее, при этом цена не обновляется ход не делается после этого как я все установил я нажимаю или 3. Закрыть позицию или 7. Сделать новый ход, в любом случае цена обновляется и если я просто сделал новый ход проверяются условия стоп-лосс тейк-профит трейлинг-стоп если они наступают сделка закрывается. Если я просто закрываю сделку это тоже генерирует и показывает новую цену и закрывает сделку. Если я не установил пункты 4,5,6 я могу сразу делать новый ход, эти пункты я могу установить на любом ходе и они проверяются при следующем Очень хорошо, внесем соответствующие изменения в логику работы пункта "6. Установить трейлинг-стоп" в программе. Пользователь выбирает пункт "6. Установить трейлинг-стоп" и вводит значение трейлинг-стопа. Введенное значение становится новым уровнем трейлинг-стопа. При каждом новом ходе цена проверяется на движение в сторону прибыли: Для лонг-сделки (покупка актива) - если цена превышает уровень стоп-лосса, то уровень стоп-лосса автоматически обновляется до нового уровня трейлинг-стопа. Это защищает вашу прибыль от потенциальных убытков. Для шорт-сделки (продажа актива) - если цена опускается ниже уровня стоп-лосса, то уровень стоп-лосса автоматически обновляется до нового уровня трейлинг-стопа. Это также защищает вашу прибыль от потенциальных убытков. При каждом обновлении уровня стоп-лосса с помощью трейлинг-стопа, новое значение записывается в файл trader.json для сохранения состояния. Таким образом, трейлинг-стоп позволяет автоматически обновлять уровень стоп-лосса в соответствии с изменением цены на рынке, чтобы защитить вашу прибыль от потенциальных убытков. Я надеюсь, что эта обновленная логика соответствует вашим требованиям. Если у вас возникнут дополнительные вопросы или требуется дополнительная помощь, пожалуйста, сообщите мне. нужно совсем немного доработать трейлинг-стоп, вот список недоработок 1. когда мы делаем ход Уровень стоп-лосса обновлен: нужно писать только если он был изменен, если изменений нет мы ничего не пишем. 2. желательно писать если Уровень стоп-лосса обновлен: предыдущее значение стоп-лосса которое было и разницу между новым с изменением и прошлым в скобках 3. в строчке Уровень стоп-лосса обновлен: если мы ее выводим в конце строки надо добавить конструкцию | Текущий уровень трейлинг-стоп: (значение trailing_stop) 4. сейчас если я задаю уровень trailing_stop который приводит к тому что stop_loss будет отрицательным просто ничего не происходит, тоесть trailing_stop устанавливается, а уровень stop_loss не меняется дальше никогда. Нужно добавить проверку что если уровень trailing_stop приводит к отрицательным значениям stop_loss выводиться ошибка и указывается не ниже/выше какого значения он может быть задан 1. Убрать вообще проверку по отрицательным значенимям трейлинг-стоп ( в любых режимах) Введите номер команды: 6 Введите уровень: 200 Недопустимый уровень трейлинг-стопа. Расчетное значение: -100.0 2. Для шорта - стоп лосс не корректно работает - трейлинг-стопа 3. в percent режиме trailing_stop не корректно задается, stop_loss должен быть = текущая цена - (текущая цена / 100 * trailing_stop) **1. Если режим установлен number.** 1.1 При установке трейлинг-стопа, 1.1.1. Для лонга - мы меняем текущее значение stop_loss по формуле текущая цена - трейлинг стоп. Пример мы установили трейлинг стоп 10, текущая цена 100, значит stop_loss будет 100-10 = 90 1.1.2 Для шорта - мы меняем текущее значение stop_loss по формуле текущая цена + трейлинг стоп. Пример мы установили трейлинг стоп 10, текущая цена 100, значит stop_loss будет 100+10 = 110 2. Если режим установлен percent. 2.1 При установке трейлинг-стопа, 2.1.1. Для лонга - мы меняем текущее значение stop_loss по формуле текущая цена - (текущая цена * (трейлинг стоп/100)). Пример мы установили трейлинг стоп 10, текущая цена 100, значит stop_loss будет 100 - (100 * (10 / 100) = 90 2.1.2 Для шорта - мы меняем текущее значение stop_loss по формуле текущая цена + (текущая цена * (трейлинг стоп/100)). Пример мы установили трейлинг стоп 10, текущая цена 100, значит stop_loss будет 100 + (100 * (10 / 100) = 110 3. Убрать вообще проверку по отрицательным значенимям трейлинг-стоп ( в любых режимах)
  3. market.py: Этот файл представляет собой простую модель рынка. В этом классе генерируется случайная цена в пределах заданного диапазона, которая может меняться с течением времени.
    • Баги Обратите внимание, что для генерации случайных чисел, которые действительно выглядят случайными, важно правильно инициализировать генератор случайных чисел. По умолчанию, модуль random инициализирует генератор случайных чисел на основе системного времени сейчас при запуске этого кода первое значение всегда береться из начальной цены, а первый ход мы должны брать случайное значение между начальное и конечной ценой, а не начальную цену. Дальше расчет идет через максимальную волатильность. Чтобы первое значение было случайным значением между начальной и конечной ценой, нужно внести некоторые изменения в код. остальное надо перепроверить + добавить сколько раз цена за цикл достигла минимума и максимума сохранять json/game.json в «entry_rate»: 28000.0, Код для запуска маркета из другого скрипта! import market market.initialize_market() market.next_round() market.run_simulation() <aside> 💡 По результатам работы скрипта он постоянно делает само контроль (в режиме симуляции) можем просто сохранять эти значения в переменные game.json или свой отдельный файл Вообще как идея все ходы генерировать сразу на старте игры в том количестве сколько раундов и сразу хранить цену каждого хода, это позволит проверять расхождения и возможные ошибки Ручное обращение к этому скрипту тоже важно для людей, для контроля чистоты работы логики математики скрипта (режим Начать симуляцию — график) Процент повторов цены: 0.00% Максимальная разница цены: 1210 Минимальная разница цены: -1185 Вычисленная MAX_VOLATILITY: 0.375 </aside>
  4. trading_math.py: Этот файл содержит функции для расчета комиссий, процентов за удержание позиции и прибыли или убытка по итогам торговли.
    • Баги { # меняются скриптом "deposit": 11111.0, депозит тут задаем руками, но вообще береться из основного скрипта, *работает* ! ****1** "opening_commission": 100.0 формула расчет 1, *работает* **2** **"нет" формула расчет 2, *работает* **3** "interest": 8.333333333333334 3 формула расчет 3, *работает* **4** **"нет" формула расчет 4, *работает* **5** "final_deposit": 20000.0, ввод расчет 5, *работает* **6** "current_move": 92.59166666666667, формула расчет 6, *работает* # не меняются скриптом ** "entry_rate": 28000.0, текущий курс береться из игры, тут ручной ввод *работает* "num_moves": 0, береться из игры, тут ручной ввод # Количество ходов *работает нужно прописать логику в основном скрипте которая будет считать тотал комисию после завершения хода и записывать (переносить коммисию на предыдущий ход)* "total_commission": 0, расчет комисии за этот ход previous_move + current_move (только если 1 ход с этой позицией) + interest * количество ходов (починить 2) "previous_move": 0.0, берем предыдущий ход, игра перед расчетом хода обновляет это значение (починить 3) } Тонкие моменты по расчёту коммисии за ход Учитывать что файл этот пишем не только мы а все, сейчас он стирает все лишнее, добавить в него комментарии https://www.bybit.com/ru-RU/help-center/s/article/Bybit-Margin-Trading-Fees-Explained — основная логика взята отсюда https://www.bybit.com/en-US/help-center/s/article/Funding-fee-calculation — коммисия за открытие сделки https://www.bybit.com/en-US/help-center/s/article/What-is-Position-Margin -коммисии на маржиналке https://learn.bybit.com/ru/bybit-guide/bybit-trading-fees/ подробно на русском <aside> 💡 У нас нет сейчас расчета позиции как такого, мы берем всегда 100% депозита, это не корректно, надо брать курс и сколько хотим купить биткоинов </aside> """ # Расчет текущего курса в зависимости от новостей влияние новости на текущий курс # Расчет # Расч """ # TIME_PER_MOVE_HOURS - Продолжительность каждого хода в часах # LEVERAGE - начальное плечо # TRADE_FEE - коммисия биржи от каждой сделки (за открытие позиции) # DAILY_INTEREST_RATE - Дневная процентная ставка (5%) # LIQUIDATION_FEE - Комиссия за ликвидацию (2%)
  5. settings.py: Этот файл содержит настройки для моделирования торговли и вывода информации. Здесь вы можете задать начальный депозит, максимальную волатильность, комиссию за сделку и другие параметры.
  6. analysis.py: Этот файл содержит функцию для анализа результатов торговли, расчета общей прибыли и вывода информации о производительности трейдера.
  7. rules.txt: Этот файл содержит текстовые описания

Отладка

  1. dev_game_ui.py: Этот файл содержит вывод всех шаблонов игры (игровых ситуаций) Если вы хотите вызвать определенный шаблон напрямую при запуске вашего скрипта, вы можете это сделать, используя соответствующий метод класса TraderGame. Допустим, вы хотите сразу вызвать template_5. Это можно сделать следующим образом: from dev_game_ui import TraderGame def my_script(): # Создание экземпляра класса game = TraderGame() # Вызов функции из класса game.template_5() if __name__ == "__main__": my_script() Если целиком, то from dev_game_ui import TraderGame def my_script(): # Создание экземпляра класса game = TraderGame() # Вызов функции из класса game.play_game() if __name__ == "__main__": my_script()
напоминаю логика очень простая 
1. если пользователь выбирает в 7. Установить режим ввода (number/percent) -  1 мы меняем input_mode на режим number, если выбирает 2 то меняем input_mode на percent. Пользователь просто нажимает 1 или 2 и ввод, мы записываем input_mode number или percent. Если пользователь ввел 3 или вообще не число (что угодно, пишем ошибка - повторите ввод)
2. От режима input_mode зависит как работает ввод в пунктах:
  Установить стоп-лосс
  Установить тейк-профит
  Установить трейлинг-стоп
если режим number, пользователь просто набирает значение и мы его записываем в "stop_loss": ,   "take_profit":, "trailing_stop":  (при этом выполняются все нужные, текущие проверки ввода значений)
3. если режим percent, мы ожидаем в пунктах 4,5,6 ввода пользователем процента по логике, 5 это 5%, 20 - 20% и тд. Когда он ввел % мы от цены текущего хода высчитваем этот процент и на это число меняем значения (учитываем типо значения и направление сделки). По сути вместо ожидания ввода от пользователя конкретного значения этих пунктов мы спрашиваем % и сами считаем значение которые нужно записать, правила расчета и обработки ошибок как в пункте 2 выше.
  1. dev_settings_json.py: Этот файл содержит управление настройками игры и сохранением их в settings.json
Я предполагаю, что ваш скрипт dev_settings_json.py имеет функцию change_settings(), которую можно вызывать. Если нет, замените dev_settings_json.change_settings() на правильный вызов функции. Все выводы теперь форматированы с помощью colorama для лучшего визуального восприятия.
  • transaction.py записывает транзакции в журнал сделок и выводит их при необходисти
  • файл журнал сделок хранит сделки (пользователь | тип | время | ход | номер сделки пользователя | курс | тип сделки | баланс | комиссии | средний профит в % | профит в деньгах | другая аналитика

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

0 Enter

1 тейк профит

2 стоп лосс в %

3 трейлинг-стоп

4 закрыть позицию

5 продолжить

6 завершить игру

Смысл отладки в том что мы с тобой пишем модуль которые формулирует и выводит сообщения игроку в зависимости от состояния некоторых значений, меняется шаблон сообщения который получает пользователь

В каждом шаблоне есть одинаковые блоки, условно —

тема сообщения

само сообщение

действия пользователя

Образец вывода с current_price

--------------------------------------------------
Шаблон 1: 0 РАУНД
--------------------------------------------------
current_price...
--------------------------------------------------
Можете пропустить ход нажав Enter или открыть сделку Long или Short.

1. Тейк-профит
2. Стоп-лосс в %
3. Открыть (открывает сделку)
4. Редактировать (можно снова задать параметры сделки и ее тип)
5. Отмена (отменяется создание сделки)
6. Перейти на шаблон 5

ВВЕДИТЕ НОМЕР ДЕЙСТВИЯ:

НЕВЕРНОЕ ДЕЙСТВИЕ.

Образец вывода без current_price

--------------------------------------------------
Шаблон 5: ПОЗИЦИЯ ОТКРЫТА
--------------------------------------------------
Состояние позиции:
Цена открытия позиции | Разница:
Тип сделки
Комиссия за открытие сделки:
Комиссия за удержание позиции:
Общая комиссия за ход:
Прибыль или убытки:
Ваш депозит: | Разница от начального:
Всего уплачено комиссий: | Чистый остаток:
0. Закрыть позицию
5. Продолжить играть

ВВЕДИТЕ НОМЕР ДЕЙСТВИЯ:

НЕВЕРНОЕ ДЕЙСТВИЕ.
  1. Шаблон + Называется “0 раунд” мы должны вывести сообщение игроку current_price с учетом всех указанных ранее форматирований и замечаний и вывести текст о том что он может пропустить ход нажав enter или открыть сделку long или short. Для удобства отладки current_price сделай пока например 1000 больше ничего в этом шаблоне не надо. Если он 0открыть сделку мы должны его спросить кроме самой сделки long или short, что бы он задал 1 тейк профит (если хочет) и 2 стоп лосс в % (если хочет) В конце показываем ему меню Открыть (открывает сделку) / редактировать (можно снова задать параметры сделки и ее тип) / отмена (отменяется создание сделки) если открыто показываем шаблон 5
  2. Шаблон 2.1 + Называется “1 раунд в игре — когда есть открытая первая позиция” мы выводим сообщение которое содержит current_price, кроме того номер раунда увеличивается на 1, выводим все что генерирует блок if self.trader.position и дополнительно показываем выбор для пользователя что он может задать 3 трейлинг-стоп 4 закрыть позицию 5 продолжить играть
  3. Шаблон 2.2 + Называется “раунд без позиции, но был ход” мы выводим сообщение которое содержит current_price, номер раунда не увеличивается, выводим все что генерирует блок if self.trader.position и дополнительно показываем выбор для пользователя что он может задать 0открыть сделку 5продолжить играть
  4. Шаблон + Называется “2 раунд и далее” мы выводим сообщение которое содержит current_price, кроме того номер раунда увеличивается на 1, выводим все что генерирует блок if self.trader.position и дополнительно показываем выбор для пользователя что он может задать 3 трейлинг-стоп 4 закрыть позицию 5 продолжить играть когда мы в этом шабоне закрыть позицию делаем мы попадаем на шаблон 3
  5. Шаблон + Называется “позиция открыта” Цена открытия позиции | Разница: Тип сделки Комиссия за открытие сделки: Комиссия за удержание позиции: **Общая комиссия за ход:

Прибыль или убытки:** Ваш депозит: | Разница от начального: Всего уплачено комиссий: | Чистый остаток:

  1. Шаблон + Называется “позиция закрыта” Прибыль или убытки: Ваш депозит: | Разница от начального: Всего уплачено комиссий: | Чистый остаток:
  2. Шаблон + Называется “ликвидация” Прибыль или убытки: Ваш депозит: | Разница от начального: Всего уплачено комиссий: | Чистый остаток:
  3. Шаблон + Называется “новость” Текст новости 0 открыть сделку (если нет сделок) 3 трейлинг-стоп (если есть открытая) 4 закрыть позицию (если есть открытая) 5 продолжить играть
  4. Шаблон + Называется “итоги игры” Прибыль или убытки: Ваш депозит: | Разница от начального: Всего уплачено комиссий: | Чистый остаток:

Нужно сделать переключение между этими шаблонами по вводу пользователем цифры в чат номера шаблона

Done! Congratulations on your new bot. You will find it at t.me/trader_game_bot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this.

Use this token to access the HTTP API:
5975535176:AAFlf3obzc7uVJ4yzujV0HTojSaltd6p8Go
Keep your token secure and store it safely, it can be used by anyone to control your bot.

For a description of the Bot API, see this page: <https://core.telegram.org/bots/api>
def template_5(self):
        self.print_section(self.format_theme + "Шаблон 5: ПОЗИЦИЯ ОТКРЫТА")
        print(self.format_message + "Состояние позиции: position_opened")
        print(self.format_action + "Цена открытия позиции entry_price | Разница: (entry_price - entry_rate" ) 
        print(self.format_action + "Тип сделки: direction")

Добавить
        print(self.format_action + "Стоп-лосс: stop_loss")
        print(self.format_action + "Тейк-профит: take_profit")
        print(self.format_action + "Трейлинг-стоп: trailing_stop")

        print(self.format_action + "Трейлинг-стоп: trailing_stop")

	        print(self.format_action + "Комиссия за открытие сделки: opening_commission")
	        print(self.format_action + "Комиссия за удержание позиции:" interest)
	        print(self.format_action + "Общая комиссия за ход: current_move") #game\\trading_math.py не записывает это значение, потому что цена ликвидации береться в процессе игры

        print(self.format_message + "Прибыль или убытки:")
        print(self.format_action + "Ваш депозит: deposit | Разница от начального: START_DEPOSIT - deposit")
        print(self.format_action + "Всего уплачено комиссий: total_commission | Чистый остаток: deposit - total_commission")
        print("\\n" + self.format_action + "0. Закрыть позицию")
        print(self.format_action + "5. Продолжить играть")

**json\\trading_math.json**
{
    "entry_rate": 27135,
    "deposit": 12334.0,
    "total_commission": 2521,
    "previous_move": 416.67,
    "final_deposit": 52000.0,
    "num_moves": 0,
    "interest": 416.67,
    "opening_commission": 12.33,
    "current_move": 4179.03
}

**json\\trader.json**
{
    "~~position_opened~~": true,
    ~~"direction": "long",~~
    ~~"entry_price": 100.0,~~
    ~~"stop_loss": null,~~
    ~~"take_profit": null,~~
    ~~"trailing_stop": null,~~
    "trades_opened": 1,
    "trades_closed": {
        "stop_loss": 0,
        "take_profit": 0,
        "trailing_stop": 0,
        "manual_close": 0
    },
    "input_mode": "percent"
}

json\\settings.json
{
    "START_PRICE": "21200",
    "END_PRICE": "27500",
    "MAX_VOLATILITY": 1250,
    "START_DEPOSIT": 50000.0,
    "LEVERAGE": "1.0",
    "PROFIT_FACTOR": 3.0,
    "RISK": 5.0,
    "TIME_PER_MOVE_HOURS": 1.0,
    "TRADE_FEE": 0.1,
    "DAILY_INTEREST_RATE": "0.02",
    "ANNUAL_INTEREST_RATE": 8.23,
    "LIQUIDATION_FEE": 2.0,
    "NUM_ROUNDS": 20,
    "NEWS_INFLUENCE": 0
}

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

def template_5(self):
        self.print_section(self.format_theme + "Шаблон 5: ПОЗИЦИЯ ОТКРЫТА")
        self.print_current_price()
        entry_price = self.trader_data.get("entry_price", "")
        current_price = self.trader_data.get("entry_rate", "")
        difference = float(entry_price) - float(current_price) if current_price else 0.0
        final_deposit = self.trader_data.get("final_deposit")
        total_commission = self.trader_data.get("total_commission")
        num_moves = self.trader_data.get("num_moves", "")
        
        print(self.format_message + f"Состояние позиции: {Fore.BLUE}{str(self.trader_data.get('position_opened', ''))}")
        print(self.format_message + f"Номер раунда {Fore.YELLOW}{num_moves}")
        print("\\n" + self.format_action + f"Цена открытия позиции: {Fore.BLUE}{str(entry_price)} | {Fore.GREEN}Разница: {Fore.BLUE}{difference}")        
        print(self.format_action + f"Тип сделки: {Fore.CYAN}{str(self.trader_data.get('direction', ''))}")
        print("\\n" + self.format_action + f"Стоп-лосс: {Fore.BLUE}{str(self.trader_data.get('stop_loss', ''))}")
        print(self.format_action + f"Тейк-профит: {Fore.BLUE}{str(self.trader_data.get('take_profit', ''))}")
        print(self.format_action + f"Трейлинг-стоп: {Fore.BLUE}{str(self.trader_data.get('trailing_stop', ''))}")
        print("\\n" + self.format_action + f"Комиссия за открытие сделки: {Fore.BLUE}{str(self.trader_data.get('opening_commission', ''))}")
        print(self.format_action + f"Комиссия за удержание позиции: {Fore.BLUE}{str(self.trader_data.get('interest', ''))}")
        print(self.format_action + f"Общая комиссия за ход: {Fore.YELLOW}{str(self.trader_data.get('current_move', ''))}")
        print("\\n" + self.format_message + "Прибыль или убытки:")
        
        deposit_difference = float(self.trader_data.get('START_DEPOSIT', 0.0)) - float(final_deposit) if final_deposit else 0.0
        commission_difference = float(final_deposit) - float(total_commission) if final_deposit and total_commission else 0.0
        
        print(self.format_action + f"Ваш депозит: {Fore.BLUE}{str(final_deposit) if final_deposit else ''}{Fore.GREEN} | Разница от начального: {Fore.BLUE}{str(deposit_difference)}")
        print(self.format_action + f"Всего уплачено комиссий: {Fore.YELLOW}{str(total_commission) if total_commission else ''}{Fore.GREEN} | Чистый остаток: {Fore.RED}{str(commission_difference)}")
        print("\\n" + self.format_action + "0. Закрыть позицию")
        print(self.format_action + "5. Продолжить играть")

class Market:
    def __init__(self, price_range, volatility):
        self.start_price = int(price_range[0])
        self.end_price = int(price_range[1])
        self.max_volatility = volatility
        self.current_price = random.randint(self.start_price, self.end_price)

    def change_price(self):
        price_change = random.uniform(-self.max_volatility, self.max_volatility)
        self.current_price += price_change

import os
import json
import random

from colorama import Fore, Style

from market import Market  # market.py
from trader import Trader  # trader.py
from analysis import analyze_trading  # analysis.py
from settings import configure_settings  # settings.py
from dev_game_ui import TraderGame  # dev_game_ui.py
# from trading_math import calculate_profit_loss, calculate_commission  # trading_math.py

Отдельно блок по сделкам

При наличии открытой позиции

Цена открытия позиции | Разница: Тип сделки Комиссия за открытие сделки: Комиссия за удержание позиции: Общая комиссия за ход:

Если позиции нет открытой, но была

Прибыль или убытки: Ваш депозит: | Разница от начального: Всего уплачено комиссий: | Чистый остаток:

Идеи

Номер раунда 1 номер этапа 1

Каждая новая сделка это один раунд, пока открыта сделка каждый ход это новый этап в том же раунде

Например номер раунда 0 пока мы не открыли ни одной сделки, пропускаем ход, пропускаем ход, открываем сделку (номер раунда станет 1), далее просто продолжить играть или трейлинг-стоп если сделка не закрылась будет раунд 1, этап 1, этап 2, этап 3 и тд. В рамках этапов каждый шаг, даже если не было раунда это новый этап не важно делали мы действия или нет.

Если мы закроем сделку раунды перестанут меняться пока мы не откроем новую сделку, тогда раунд будет +1

Всего сделок = количеству раундов

Количество сделок (раундов) задается в параметрах игры, по умолчанию 20

Новые идеи по ходу

Добавить новости по крипте (с разным влиянием на курс)

Режим игра или трейдинг, когда трейдинг подключаем к API и берем значения оттуда

Для трейдинга надо добавить оповещения при изменении цены (курса) для возможности установки 3 трейлинг-стоп

При старте игры добавить выбор языка, сохранять пользователя и его настройки

Добавить возможность делиться своим результатом

Добавить возможность скачивать журнал трейдера и свою аналитику

Обнулять игру

Обучение трейдингу и риск менеджменту

Как сделать с помощью CHATGPT

Вам необходимо ясно определить каждую задачу и представить её как конкретный вопрос. Например, «Как реализовать функцию расчета комиссий в trading_math.py?» или «Как создать класс Trader в trader.py?». Это поможет получить нужную информацию шаг за шагом.