send_telegram_post.py•10.8 kB
#!/usr/bin/env python3
"""
Скрипт для отправки торгового сигнала в Telegram группу
"""
import asyncio
import sys
from pathlib import Path
# Добавляем путь к mcp_server
sys.path.insert(0, str(Path(__file__).parent))
from mcp_server.telegram_bot import TelegramBot, send_trading_signal
# Токен бота
BOT_TOKEN = "8003689195:AAGxQsopKvlLS34H2TZ0S1a0K7s4yV4iOBY"
# Сообщение для отправки (красиво оформленное)
TRADING_SIGNAL_MESSAGE = """<b>⚡ ДЕТАЛЬНЫЙ ПЛАН СДЕЛОК</b>
<b>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</b>
<b>📊 СДЕЛКА #1: ZEN/USDT</b>
<b>Entry:</b> $15.89
<b>Stop-Loss:</b> $13.58
<b>Take-Profit:</b> $20.52
<b>Risk/Reward:</b> 1:2.0
<b>Position Size:</b> Рассчитать на основе вашего депозита:
• <b>Риск на сделку:</b> 1-2% от депозита (рекомендуется 1%)
• <b>Расчёт:</b> (Ваш риск в $) / (Entry - SL = $2.31) = количество ZEN
• <b>Пример:</b> При риске 1% и депозите $X → риск = $X × 0.01 → Position size = риск / $2.31
<b>⏰ Safe Time Window:</b> 12-18 часов
<b>⏱️ Максимум:</b> 24 часа
<b>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</b>
<b>📊 СДЕЛКА #2: XPL/USDT</b>
<b>Entry:</b> $0.240
<b>Stop-Loss:</b> $0.210
<b>Take-Profit:</b> $0.300
<b>Risk/Reward:</b> 1:2.0
<b>Position Size:</b> Рассчитать на основе вашего депозита:
• <b>Риск на сделку:</b> 1-2% от депозита (рекомендуется 1%)
• <b>Расчёт:</b> (Ваш риск в $) / (Entry - SL = $0.030) = количество XPL
• <b>Пример:</b> При риске 1% и депозите $X → риск = $X × 0.01 → Position size = риск / $0.030
<b>⏰ Safe Time Window:</b> 8-12 часов
<b>⏱️ Максимум:</b> 18 часов
<b>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</b>
<b>📊 СДЕЛКА #3: MINA/USDT</b>
<b>Entry:</b> $0.143
<b>Stop-Loss:</b> $0.120
<b>Take-Profit:</b> $0.190
<b>Risk/Reward:</b> 1:2.04
<b>Position Size:</b> Рассчитать на основе вашего депозита:
• <b>Риск на сделку:</b> 1-2% от депозита (рекомендуется 1%)
• <b>Расчёт:</b> (Ваш риск в $) / (Entry - SL = $0.023) = количество MINA
• <b>Пример:</b> При риске 1% и депозите $X → риск = $X × 0.01 → Position size = риск / $0.023
<b>⏰ Safe Time Window:</b> 8-12 часов
<b>⏱️ Максимум:</b> 16 часов
<b>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</b>
<b>💰 ОБЩИЙ РИСК ПОРТФЕЛЯ</b>
Если открыть все 3 позиции одновременно:
• <b>Общий риск:</b> 3-6% от депозита (при риске 1-2% на сделку)
• <b>Рекомендация:</b> Не превышать 5% общего риска портфеля
• <b>Максимум позиций:</b> 2-3 одновременно (в зависимости от размера депозита)
<b>Формула для расчёта:</b>
<code>Общий риск = (Риск на сделку %) × (Количество позиций)
Пример: 1% × 3 = 3% общего риска</code>
<b>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</b>
<b>🎯 CONFIDENCE В АНАЛИЗЕ: 8.0/10</b>
Все 3 актива:
✅ Outperforming BTC на 10-27%
✅ Multi-TF alignment bullish
✅ R:R ≥ 1:2
✅ Probability ≥ 95%
✅ Хорошая ликвидность
<b>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</b>
<b>🤔 ОТКРЫВАТЬ?</b>
<b>Моя рекомендация:</b> ДА, но с осторожностью
<b>Почему:</b>
1️⃣ BTC в медвежьем тренде — основной риск
2️⃣ Все 3 актива outperforming BTC — показывает силу
3️⃣ Confluence ≥ 7.0/10 для всех
4️⃣ R:R ≥ 1:2 для всех
5️⃣ Probability ≥ 95% для всех
<b>Стратегия входа:</b>
🎯 Начать с <b>ZEN/USDT</b> (лучший confluence 8.0/10)
🎯 Затем <b>XPL/USDT</b> (отличная ликвидность)
🎯 <b>MINA/USDT</b> — только если первые 2 работают
<b>⚠️ Важно:</b>
• Мониторить BTC каждые 30-60 минут
• Exit при первых признаках слабости BTC
• Не превышать safe time window
• Использовать риск 1-2% на сделку (не более 5% общего риска портфеля)
<b>━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━</b>"""
# Chat ID канала по умолчанию (DIAMOND HEADZH)
DEFAULT_CHANNEL_ID = "-1003382613825"
async def get_chat_id_interactive():
"""Интерактивно получить chat_id группы или канала"""
bot = TelegramBot(BOT_TOKEN)
print("🔍 Получение обновлений от бота...")
print("📝 Пожалуйста, отправьте любое сообщение в группу/канал, где находится бот...")
print("⏳ Ожидание 10 секунд...\n")
try:
result = await bot.get_updates(timeout=10)
updates = result.get("result", [])
if not updates:
print(f"❌ Нет обновлений. Используется канал по умолчанию: {DEFAULT_CHANNEL_ID}")
return DEFAULT_CHANNEL_ID
print("📋 Найденные чаты/группы/каналы:\n")
chat_ids = {}
for update in updates:
# Проверяем channel_post для каналов
if "channel_post" in update:
chat = update["channel_post"].get("chat", {})
chat_id = chat.get("id")
chat_type = chat.get("type")
chat_title = chat.get("title", "Unknown")
if chat_id and chat_type == "channel":
chat_ids[chat_id] = {
"title": chat_title,
"type": chat_type
}
# Проверяем message для групп и личных чатов
if "message" in update:
chat = update["message"].get("chat", {})
chat_id = chat.get("id")
chat_type = chat.get("type")
chat_title = chat.get("title") or chat.get("first_name", "Unknown")
if chat_id and chat_type in ["group", "supergroup", "channel"]:
chat_ids[chat_id] = {
"title": chat_title,
"type": chat_type
}
if not chat_ids:
print(f"❌ Чаты не найдены. Используется канал по умолчанию: {DEFAULT_CHANNEL_ID}")
return DEFAULT_CHANNEL_ID
print("✅ Найденные чаты:\n")
for idx, (chat_id, info) in enumerate(chat_ids.items(), 1):
print(f" {idx}. {info['title']} ({info['type']})")
print(f" CHAT_ID: {chat_id}\n")
if len(chat_ids) == 1:
selected_id = list(chat_ids.keys())[0]
print(f"✅ Используется единственный найденный чат: {chat_ids[selected_id]['title']}")
return selected_id
else:
print("Выберите номер чата (или введите chat_id вручную):")
choice = input("> ").strip()
try:
idx = int(choice) - 1
if 0 <= idx < len(chat_ids):
selected_id = list(chat_ids.keys())[idx]
return selected_id
except ValueError:
pass
# Попробовать как chat_id
if choice in chat_ids:
return choice
print(f"❌ Неверный выбор. Используется канал по умолчанию: {DEFAULT_CHANNEL_ID}")
return DEFAULT_CHANNEL_ID
except Exception as e:
print(f"❌ Ошибка: {e}")
print(f"Используется канал по умолчанию: {DEFAULT_CHANNEL_ID}")
return DEFAULT_CHANNEL_ID
finally:
await bot.close()
async def send_message(chat_id: str):
"""Отправить сообщение в группу/канал"""
print(f"\n📤 Отправка сообщения в чат (CHAT_ID: {chat_id})...\n")
success = await send_trading_signal(BOT_TOKEN, chat_id, TRADING_SIGNAL_MESSAGE)
if success:
print("✅ Сообщение успешно отправлено!")
else:
print("❌ Не удалось отправить сообщение")
sys.exit(1)
async def main():
"""Главная функция"""
if len(sys.argv) > 1:
# CHAT_ID передан как аргумент
chat_id = sys.argv[1]
await send_message(chat_id)
else:
# Используем канал по умолчанию или интерактивный режим
print("=" * 60)
print("🤖 Telegram Bot - Отправка торгового сигнала")
print("=" * 60)
print()
# Пробуем использовать канал по умолчанию
print(f"💡 Используется канал по умолчанию: {DEFAULT_CHANNEL_ID}")
print(" (Для интерактивного выбора запустите: python send_telegram_post.py interactive)\n")
await send_message(DEFAULT_CHANNEL_ID)
if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
print("\n\n⚠️ Прервано пользователем")
sys.exit(0)
except Exception as e:
print(f"\n❌ Критическая ошибка: {e}")
import traceback
traceback.print_exc()
sys.exit(1)