First Commit
This commit is contained in:
89
live_bot.py
Normal file
89
live_bot.py
Normal 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()
|
||||
Reference in New Issue
Block a user