Files
Place-Order-Trading-Bot/TradingBot_Position_Control.py
T

368 lines
14 KiB
Python

"""
Position Control für TradingBot V1.4
Verhindert mehrfache gleichzeitige Trades
"""
import MetaTrader5 as mt
import pandas as pd
from datetime import datetime
def check_existing_positions(symbol="XAUUSD", strategy_name="TradingBot_V1.4_Complete"):
"""
Überprüft ob bereits Positionen für das Symbol und die Strategie existieren
Returns:
- has_position: bool - True wenn bereits Position existiert
- position_info: dict - Info über bestehende Position(en)
"""
try:
# Alle Positionen für das Symbol abrufen
positions = mt.positions_get(symbol=symbol)
if positions is None:
return False, {"count": 0, "details": []}
# Filter nach Strategie-Namen im Kommentar
strategy_positions = []
for pos in positions:
if strategy_name in pos.comment:
strategy_positions.append({
"ticket": pos.ticket,
"type": "BUY" if pos.type == 0 else "SELL",
"volume": pos.volume,
"price_open": pos.price_open,
"profit": pos.profit,
"comment": pos.comment,
"time_open": pd.to_datetime(pos.time, unit='s')
})
has_position = len(strategy_positions) > 0
position_info = {
"count": len(strategy_positions),
"details": strategy_positions
}
return has_position, position_info
except Exception as e:
print(f"Error checking positions: {e}")
return False, {"count": 0, "details": []}
def get_position_summary(symbol="XAUUSD", strategy_name="TradingBot_V1.4_Complete"):
"""
Gibt eine übersichtliche Zusammenfassung der aktuellen Positionen
"""
has_position, position_info = check_existing_positions(symbol, strategy_name)
print(f"\n📊 POSITION SUMMARY für {symbol}")
print("=" * 50)
if not has_position:
print("✅ Keine aktiven Positionen - bereit für neuen Trade")
return False
print(f"⚠️ {position_info['count']} aktive Position(en) gefunden:")
for i, pos in enumerate(position_info['details'], 1):
profit_emoji = "🟢" if pos['profit'] >= 0 else "🔴"
print(f"\n Position {i}:")
print(f" Ticket: {pos['ticket']}")
print(f" Typ: {pos['type']}")
print(f" Volumen: {pos['volume']}")
print(f" Eröffnungspreis: {pos['price_open']}")
print(f" Profit: {profit_emoji} {pos['profit']:.2f}")
print(f" Eröffnungszeit: {pos['time_open']}")
print(f" Kommentar: {pos['comment']}")
print(f"\n🛑 TRADING BLOCKIERT - Maximal 1 Position erlaubt")
return True
def close_existing_positions(symbol="XAUUSD", strategy_name="TradingBot_V1.4_Complete", force_close=False):
"""
Schließt bestehende Positionen (optional)
Args:
force_close: bool - Wenn True, schließt alle Positionen sofort
"""
has_position, position_info = check_existing_positions(symbol, strategy_name)
if not has_position:
print("✅ Keine Positionen zum Schließen")
return True
if not force_close:
print(f"⚠️ {position_info['count']} Position(en) gefunden. Verwende force_close=True zum Schließen.")
return False
print(f"🔄 Schließe {position_info['count']} Position(en)...")
success_count = 0
for pos in position_info['details']:
try:
# Position schließen
close_request = {
"action": mt.TRADE_ACTION_DEAL,
"symbol": symbol,
"volume": pos['volume'],
"type": mt.ORDER_TYPE_SELL if pos['type'] == "BUY" else mt.ORDER_TYPE_BUY,
"position": pos['ticket'],
"price": mt.symbol_info_tick(symbol).bid if pos['type'] == "BUY" else mt.symbol_info_tick(symbol).ask,
"deviation": 20,
"magic": 234000,
"comment": f"Close {strategy_name}",
"type_time": mt.ORDER_TIME_GTC,
"type_filling": mt.ORDER_FILLING_IOC,
}
result = mt.order_send(close_request)
if result.retcode == mt.TRADE_RETCODE_DONE:
print(f"✅ Position {pos['ticket']} erfolgreich geschlossen")
success_count += 1
else:
print(f"❌ Fehler beim Schließen von Position {pos['ticket']}: {result.comment}")
except Exception as e:
print(f"❌ Exception beim Schließen von Position {pos['ticket']}: {e}")
print(f"📊 {success_count}/{len(position_info['details'])} Positionen erfolgreich geschlossen")
return success_count == len(position_info['details'])
def enhanced_execute_trade_v2_with_position_control(
symbol="XAUUSD",
atr_mult=1.5,
base_confidence=70,
max_risk_per_trade=0.01,
risk_filter=True,
min_atr=0.0010,
use_pullback_entry=True,
max_positions=1, # NEU: Maximale Anzahl Positionen
strategy_name="TradingBot_V1.4_Complete",
debug=True
):
"""
Enhanced Execute Trade mit Position-Kontrolle
"""
# WICHTIG: Zuerst Position-Check
print(f"\n🔍 POSITION CHECK für {symbol}")
has_position, position_info = check_existing_positions(symbol, strategy_name)
if has_position and position_info['count'] >= max_positions:
if debug:
print(f"🛑 TRADE BLOCKIERT: {position_info['count']}/{max_positions} Positionen bereits aktiv")
for pos in position_info['details']:
profit_emoji = "🟢" if pos['profit'] >= 0 else "🔴"
print(f" Position: {pos['type']} {pos['volume']} @ {pos['price_open']} | Profit: {profit_emoji} {pos['profit']:.2f}")
return None
print(f"✅ Position-Check OK: {position_info['count']}/{max_positions} Positionen")
# Hier würde deine bestehende execute_trade_v2 Logik kommen
# Ich importiere sie von deinem bestehenden Code
try:
# Import der bestehenden Funktionen (angepasst an deine Struktur)
from TradingBot_V1_4_Complete import extended_top_down_v2, check_risk_limits, market_order, check_pullback_entry
# Signal-Analyse
signal_info = extended_top_down_v2(symbol)
if signal_info is None:
print("❌ Signal-Analyse fehlgeschlagen")
return None
entry_signal = signal_info["entry_signal"]
confidence = signal_info["confidence"]
adaptive_threshold = signal_info["adaptive_threshold"]
signal_quality = signal_info["signal_quality"]
market_regime = signal_info["market_regime"]
# Get Price/ATR from M5
m5_info = signal_info["trend_info"]["M5"]
price = m5_info["price"]
atr = m5_info["atr"]
# Enhanced Pre-checks
reason = ""
if confidence < adaptive_threshold:
reason = f"Confidence {confidence}% < adaptive threshold {adaptive_threshold}%"
elif entry_signal == 0:
reason = f"No entry signal (Trend: {signal_info['top_down_trend']}, Regime: {market_regime['regime']})"
elif price is None or atr is None:
reason = "Price/ATR not available"
elif risk_filter and atr < min_atr:
reason = f"ATR {atr:.5f} < min_atr {min_atr}"
elif signal_quality == "none":
reason = "Signal quality insufficient"
else:
# Entry Timing Check
if use_pullback_entry:
pullback_ok, pullback_reason = check_pullback_entry(symbol, signal_info)
if not pullback_ok:
reason = f"Entry timing: {pullback_reason}"
if not reason:
# Risk Checks
risk_ok = check_risk_limits(symbol, max_risk_per_trade=max_risk_per_trade)
if not risk_ok:
reason = "Risk limits exceeded"
# Execute Trade if all checks pass
if not reason:
# Enhanced SL/TP calculation based on regime
regime_mult = 1.0
if market_regime['regime'] == 'volatile':
regime_mult = 1.3 # Wider stops in volatile markets
elif market_regime['regime'] == 'ranging':
regime_mult = 0.8 # Tighter stops in ranging markets
adjusted_atr_mult = atr_mult * regime_mult
if entry_signal == 1: # Long
stop_loss = price - adjusted_atr_mult * atr
take_profit = price + adjusted_atr_mult * atr * 2.5
else: # Short
stop_loss = price + adjusted_atr_mult * atr
take_profit = price - adjusted_atr_mult * atr * 2.5
# Dynamic Position Sizing
stop_distance = adjusted_atr_mult * atr
account_info = mt.account_info()
if account_info:
balance = account_info.balance
risk_amount = balance * max_risk_per_trade
if symbol == "XAUUSD":
volume = min(0.1, max(0.01, risk_amount / (stop_distance * 100)))
else:
volume = 0.01
else:
volume = 0.01
# FINAL POSITION CHECK vor Order
final_check, _ = check_existing_positions(symbol, strategy_name)
if final_check:
print(f"🛑 LAST-MINUTE BLOCK: Position wurde zwischen Checks eröffnet!")
return None
# Log Enhanced Trade Info
print(f"\n🚀 ENHANCED TRADE EXECUTION (mit Position Control)")
print(f"Symbol: {symbol}")
print(f"Direction: {'LONG' if entry_signal == 1 else 'SHORT'}")
print(f"Price: {price:.5f}")
print(f"Volume: {volume:.2f}")
print(f"Stop Loss: {stop_loss:.5f}")
print(f"Take Profit: {take_profit:.5f}")
print(f"Confidence: {confidence}% (Threshold: {adaptive_threshold}%)")
print(f"Signal Quality: {signal_quality.upper()}")
print(f"Market Regime: {market_regime['regime'].upper()}")
print(f"Position Limit: {position_info['count']}/{max_positions}")
# Execute the actual trade
try:
order_result = market_order(
symbol=symbol,
volume=volume,
order_type="buy" if entry_signal == 1 else "sell",
stoploss=stop_loss,
take_profit=take_profit,
comment=strategy_name # Wichtig für Position-Tracking
)
if order_result and order_result.retcode == mt.TRADE_RETCODE_DONE:
print(f"✅ Trade erfolgreich eröffnet! Ticket: {order_result.order}")
# Verify position was created
new_check, new_info = check_existing_positions(symbol, strategy_name)
print(f"📊 Neue Position-Anzahl: {new_info['count']}")
return order_result
except Exception as e:
print(f"❌ Trade execution failed: {e}")
return None
else:
if debug:
print(f"\n⏸️ TRADE SKIPPED: {reason}")
print(f"Confidence: {confidence}% | Threshold: {adaptive_threshold}%")
print(f"Signal Quality: {signal_quality} | Regime: {market_regime['regime']}")
print(f"Positions: {position_info['count']}/{max_positions}")
return None
except ImportError:
print("❌ Konnte bestehende Funktionen nicht importieren. Verwende vereinfachte Version.")
return None
except Exception as e:
print(f"❌ Fehler in enhanced_execute_trade_v2_with_position_control: {e}")
return None
def position_management_menu():
"""
Interaktives Menü für Position-Management
"""
symbol = "XAUUSD"
strategy_name = "TradingBot_V1.4_Complete"
while True:
print(f"\n🔧 POSITION MANAGEMENT MENU")
print("=" * 40)
print("1. Position Status anzeigen")
print("2. Alle Positionen schließen")
print("3. Position-Check für neuen Trade")
print("4. Trading mit Position-Control testen")
print("5. Exit")
choice = input("\nWähle Option (1-5): ").strip()
if choice == "1":
get_position_summary(symbol, strategy_name)
elif choice == "2":
confirm = input("❗ Alle Positionen schließen? (yes/no): ").strip().lower()
if confirm in ['yes', 'y', 'ja', 'j']:
close_existing_positions(symbol, strategy_name, force_close=True)
else:
print("❌ Abgebrochen")
elif choice == "3":
has_pos, pos_info = check_existing_positions(symbol, strategy_name)
if has_pos:
print(f"🛑 {pos_info['count']} Position(en) aktiv - KEIN neuer Trade möglich")
else:
print("✅ Keine Positionen - neuer Trade möglich")
elif choice == "4":
print("🧪 Testing Trading mit Position Control...")
result = enhanced_execute_trade_v2_with_position_control(
symbol=symbol,
strategy_name=strategy_name,
debug=True
)
if result:
print(f"✅ Test-Trade ausgeführt: {result}")
else:
print("⏸️ Kein Test-Trade ausgeführt")
elif choice == "5":
print("👋 Exit Position Management")
break
else:
print("❌ Ungültige Option")
if __name__ == "__main__":
# Teste Position Control
symbol = "XAUUSD"
strategy_name = "TradingBot_V1.4_Complete"
print("🔍 TESTING POSITION CONTROL")
print("=" * 40)
# Check current positions
get_position_summary(symbol, strategy_name)
# Start interactive menu
position_management_menu()