First Commit

This commit is contained in:
hwinkel
2026-01-23 15:39:50 +01:00
parent 9b1a3ec147
commit da68106666
10 changed files with 533 additions and 0 deletions

89
live_bot.py Normal file
View File

@@ -0,0 +1,89 @@
import os
import time
import pandas as pd
import pandas_ta as ta
from dotenv import load_dotenv
from datetime import datetime, timedelta, timezone
from colorama import Fore, Style, init
from alpaca.trading.client import TradingClient
from alpaca.trading.requests import MarketOrderRequest, StopLossRequest, TakeProfitRequest
from alpaca.trading.enums import OrderSide, TimeInForce, OrderClass
from alpaca.data.historical import StockHistoricalDataClient
from alpaca.data.requests import StockBarsRequest
from alpaca.data.timeframe import TimeFrame
init(autoreset=True)
load_dotenv()
# --- PARAMETER ---
SYMBOL = "AAPL"
QTY_PER_TRADE = 10 # Anzahl der Aktien
RSI_LOWER = 30
RSI_UPPER = 70
STOP_LOSS_PCT = 0.05 # 5% Stop Loss
TAKE_PROFIT_PCT = 0.10 # 10% Take Profit (Optionales Ziel)
# Clients
trading_client = TradingClient(os.getenv('ALPACA_API_KEY'), os.getenv('ALPACA_SECRET_KEY'), paper=True)
data_client = StockHistoricalDataClient(os.getenv('ALPACA_API_KEY'), os.getenv('ALPACA_SECRET_KEY'))
def get_rsi():
try:
start_time = datetime.now(timezone.utc) - timedelta(days=50)
bars = data_client.get_stock_bars(StockBarsRequest(symbol_or_symbols=[SYMBOL], timeframe=TimeFrame.Hour, start=start_time))
df = bars.df.xs(SYMBOL)
rsi = ta.rsi(df['close'], length=14)
return rsi.iloc[-1], df['close'].iloc[-1]
except:
return None, None
def execute_trade(side, price):
"""Sendet eine automatisierte Order mit Stop-Loss an Alpaca"""
if side == "BUY":
# Berechnung der Stop-Loss und Take-Profit Preise
sl_price = price * (1 - STOP_LOSS_PCT)
tp_price = price * (1 + TAKE_PROFIT_PCT)
# Erstellung einer "Bracket Order" (Kauf + SL + TP gleichzeitig)
order_request = MarketOrderRequest(
symbol=SYMBOL,
qty=QTY_PER_TRADE,
side=OrderSide.BUY,
time_in_force=TimeInForce.GTC,
order_class=OrderClass.BRACKET, # Verbindet Kauf mit SL/TP
stop_loss=StopLossRequest(stop_price=round(sl_price, 2)),
take_profit=TakeProfitRequest(limit_price=round(tp_price, 2))
)
trading_client.submit_order(order_request)
print(f"{Fore.GREEN}>>> AUTOMATISCHER KAUF: {QTY_PER_TRADE} {SYMBOL} @ {price}$")
print(f"{Fore.YELLOW}>>> STOP-LOSS GESETZT BEI: {sl_price:.2f}$")
def main_loop():
print(f"{Fore.CYAN}=== BOT STARTET IM AUTOMATIK-MODUS (PAPER) ===")
while True:
rsi, price = get_rsi()
# Check ob bereits eine Position offen ist
try:
position = trading_client.get_open_position(SYMBOL)
has_position = True
except:
has_position = False
if rsi:
print(f"[{datetime.now().strftime('%H:%M:%S')}] {SYMBOL} Preis: {price}$ | RSI: {rsi:.2f}")
# KAUFEN: RSI zu niedrig & wir haben noch nichts gekauft
if rsi < RSI_LOWER and not has_position:
execute_trade("BUY", price)
# VERKAUFEN: RSI zu hoch & wir haben eine Position
elif rsi > RSI_UPPER and has_position:
trading_client.close_position(SYMBOL)
print(f"{Fore.RED}>>> AUTOMATISCHER VERKAUF (RSI TARGET ERREICHT)")
time.sleep(60)
if __name__ == "__main__":
main_loop()