Copy trading EA
- Experten
- Dimitar Shuytsov
- Version: 1.2
- Aktualisiert: 9 April 2026
- Aktivierungen: 5
# DS_Copy_EA - Benutzerbeschreibung
DS_Copy_EA ist ein MetaTrader 5 Expert Advisor, der Trades zwischen MT5-Terminals kopiert, die auf demselben Rechner laufen. Eine EA-Instanz fungiert als **Provider** (Signalquelle) und eine andere als **Empfänger** (Kopierer). Der Modus wird in den EA-Einstellungen ausgewählt.
**Wie es funktioniert:**
1. Der **Provider** publiziert seine offenen Positionen intern alle 500ms
2. Der **Empfänger** liest alle 1 Sekunde, erkennt neue/geänderte/geschlossene Positionen und spiegelt sie auf seinem eigenen Konto
3. Interne Kommunikation - kein Netzwerk, keine Latenz, keine externen Dienste
**Hauptfunktionen:**
- Kopieren von bis zu 3 Anbietern gleichzeitig auf einen Empfänger
- Prozentsatz der Kopien pro Anbieter (z.B. Kopie von 10% der Losgröße des Anbieters)
- Pro-Provider-Symbol-Mapping mit Wildcards (z.B. EURUSD beim Provider = EURUSDx beim Empfänger)
- Harter Stop: automatisches Schließen aller Positionen, wenn der Tageswert unter einen bestimmten Schwellenwert fällt
- Margenschutz, Spread-Filter, Wiederholungslogik
- On-Chart-Dashboard mit Live-Status
- Überlebt EA-Neustarts (baut die Positionsverfolgung anhand der magischen Zahlen neu auf)
### Schritt 1: Einrichten des Providers
1. Öffnen Sie das MT5-Terminal, auf dem die Signalquelle gehandelt wird
2. Ziehen Sie `DS_Copy_EA` auf einen beliebigen Chart
3. Im Einstellungsdialog:
- **EA Modus** = `Provider (Signalquelle)`
- **Provider ID** = ein beliebiger eindeutiger Name, z.B. `MeinSignal`
- Belassen Sie die anderen Einstellungen auf den Standardwerten
4. Klicken Sie auf OK
5. Auf dem Dashboard sollte "Publishing: N positions" angezeigt werden, wobei N Ihren offenen Trades entspricht
### Schritt 2: Einrichten des Empfängers
1. Öffnen Sie das MT5-Terminal, in das Sie die Trades kopieren möchten
2. Ziehen Sie `DS_Copy_EA` auf einen beliebigen Chart
3. Im Einstellungsdialog:
- **EA Modus** = `Empfänger (Kopierer)`
- **Provider 1 ID** = genau derselbe Name, den Sie für den Provider verwendet haben, z.B. `MeinSignal`
- **Provider 1 Kopie %** = wie viel von der Menge des Providers kopiert werden soll (z. B. 50 = die Hälfte)
- **Provider 1 symbol map** = wie die Symbole zu übersetzen sind (siehe Symbol Mapping unten)
4. Klicken Sie auf OK
5. Vorhandene Anbieterpositionen sollten innerhalb weniger Sekunden kopiert werden
### Schritt 3: Überprüfen
- **Provider-Dashboard**: zeigt "Veröffentlichung: N Positionen" und "Positionen auf dem Konto: N"
- **Empfänger-Dashboard**: zeigt Anbieter als "LIVE", Anzahl der kopierten Positionen, Equity/Drawdown
- **Registerkarte Experten** (Strg+E): zeigt Protokollmeldungen für jede Kopier-/Schließungsaktion an
> **Wichtig**: Beide Terminals müssen auf demselben Rechner laufen. Die Provider-ID muss zwischen Provider und Receiver exakt übereinstimmen (Leerzeichen und ungültige Zeichen werden automatisch entfernt).
---
## Einstellungen Referenz
### EA-Modus
| Parameter | Standard | Beschreibung |
|-----------|---------|-------------|
| EA-Modus | Empfänger (Kopierer) | Provider- oder Empfängermodus auswählen |
### Provider-Einstellungen (nur Provider-Modus)
| Parameter | Standard | Beschreibung |
|-----------|---------|-------------|
| Provider-ID | PROVIDER_1 | Eindeutiger Name für diesen Provider. Muss auf der Empfängerseite übereinstimmen. |
| Datei-Schreibintervall (ms) | 500 | Wie oft die gemeinsame Datei aktualisiert werden soll. Niedriger = schneller, aber mehr Festplatten-E/A. |
| Nur diese Symbole veröffentlichen | *(leer)* | Filter: nur Positionen in diesen Symbolen veröffentlichen. Semikolon-getrennt. Leer = alle veröffentlichen. |
| Nur Positionen mit bestimmter magischer Zahl veröffentlichen | false | Filter: nur Positionen mit einer bestimmten magischen Zahl veröffentlichen. |
| Magische Zahl, nach der gefiltert werden soll | 0 | Die zu filternde magische Zahl. Wird nur verwendet, wenn die obige Option wahr ist. |
### Empfänger: Anbieter 1/2/3
Jeder Provider-Slot hat diese Einstellungen:
| Parameter | Standard | Beschreibung |
|-----------|---------|-------------|
| Provider-ID | PROVIDER_1 / *(leer)* / *(leer)* | Die Provider-ID, die abonniert werden soll. Leer = Slot deaktiviert. |
| % des Loses kopieren | 100.0 | Prozentualer Anteil der Losgröße des Providers, der kopiert werden soll. 100 = gleiche Größe, 50 = halbe Größe, 200 = doppelte Größe. |
| Max positions | 20 | Maximale Positionen, die von diesem Anbieter kopiert werden sollen. |
| Symbolzuordnung | `*=*` | Symbolzuordnungsregeln für diesen Anbieter. Siehe Symbolzuordnung unten. |
### Risikomanagement (nur Empfänger)
| Parameter | Standard | Beschreibung |
|-----------|---------|-------------|
| Hard Stop Equity % | 50.0 | Schließt ALLE Positionen, wenn der Aktienkurs um diesen Prozentsatz vom Tagesstartwert fällt. 0 = deaktiviert. |
| Min Margin Level % | 150.0 | Keine neuen Positionen eröffnen, wenn das Margin Level unter diesen Wert fällt. 0 = deaktiviert. |
| Max spread (pips) | 0 | Kopieren überspringen, wenn der Spread diesen Wert überschreitet. 0 = deaktiviert (kein Spread-Filter). |
| Max. Slippage (Punkte) | 300 | Maximal zulässige Slippage beim Öffnen/Schließen von Positionen. |
| Max. Gesamtpositionen | 100 | Harte Obergrenze für die Gesamtzahl der kopierten Positionen bei allen Anbietern. |
### Timing
| Parameter | Standard | Beschreibung |
|-----------|---------|-------------|
| Abfrageintervall (ms) | 1000 | Wie oft der Empfänger Provider-Dateien überprüft. Niedriger = schnellere Reaktion, mehr CPU. |
| Heartbeat-Timeout (sec) | 30 | Wenn die Providerdatei in so vielen Sekunden nicht aktualisiert wurde, wird sie als nicht verbunden betrachtet. |
| Handelszeiten beginnen | *(leer)* | Nur während dieser Stunden kopieren. Format: HH:MM. Leer = 24 Stunden. |
| Ende der Handelszeiten | *(leer)* | Ende der Handelszeiten. Unterstützt Nachtbereiche (z. B. Beginn=22:00, Ende=06:00). |
### Verhalten (nur Empfänger)
| Parameter | Standard | Beschreibung |
|-----------|---------|-------------|
| On provider disconnect | Keep positions open | Was tun, wenn der Heartbeat eines Providers veraltet ist. Optionen: Behalten / Sofort schließen / Nach Verzögerung schließen. |
| Verzögerung beim Schließen der Verbindung (Sek.) | 300 | Wie lange wird gewartet, bevor Positionen eines unterbrochenen Anbieters geschlossen werden (wenn Schließen nach Verzögerung ausgewählt ist). |
| Stop-Loss kopieren | wahr | Spiegeln des Stop-Loss des Anbieters auf kopierte Positionen. |
| Kopiere Take Profit | wahr | Spiegelt den Take Profit des Anbieters auf kopierte Positionen. |
| Max retry attempts | 10 | Wie oft ein fehlgeschlagener Auftrag wiederholt werden soll, bevor er aufgegeben wird. |
| Verzögerung zwischen Wiederholungsversuchen (ms) | 3000 | Wartezeit zwischen Wiederholungsversuchen. |
| Close confirm seconds | 3 | Eine Position muss so viele Sekunden lang nicht in der Anbieterdatei vorhanden sein, bevor sie geschlossen wird. Schützt vor Dateischreibläufen. |
| Close confirm reads | 3 | Eine Position muss so viele aufeinanderfolgende Lesevorgänge in der Datei überstehen, bevor sie geschlossen wird. |
| Close all on EA removal | false | Wenn true, werden alle kopierten Positionen geschlossen, wenn der EA aus dem Chart entfernt wird. |
### Identifikation (nur Empfänger)
| Parameter | Standard | Beschreibung |
|-----------|---------|-------------|
| Basis magische Zahl | 900000 | Basis für magische Zahlenkodierung. Jeder Provider erhält einen Offset: Anbieter 1 = 901000, Anbieter 2 = 902000, Anbieter 3 = 903000. |
### Anzeige & Protokollierung
| Parameter | Standard | Beschreibung |
|-----------|---------|-------------|
| Dashboard anzeigen | wahr | Zeigt das Statuspanel im Diagramm an. |
| Aktiviere Dateiprotokollierung | wahr | Schreibe Protokolldateien in den Ordner "Common Files". |
| Loglevel | 1 | 0 = Aus, 1 = Info (normal), 2 = Debug (ausführlich - zur Fehlerbehebung). |
---
## Symbol Mapping Guide
Jeder Anbieter hat seine eigenen Regeln für die Symbolzuordnung. Das Format ist `SOURCE=DESTINATION` Paare durch Semikolon getrennt.
### Grundlegende Syntax
```
EURUSD=EURUSDx;GBPUSD=GBPUSDx;XAUUSD=XAUUSDx
```
Damit wird der `EURUSD` des Anbieters auf den `EURUSDx` des Empfängers abgebildet, usw. Nicht aufgeführte Symbole werden unverändert weitergegeben.
### Platzhalter-Syntax
Verwenden Sie `*` als Platzhalter, um Regeln zu erstellen, die auf mehrere Symbole passen:
| Regel | Bedeutung | Beispiel |
|------|---------|---------|
| `*=*` | Pass-through (keine Änderung) | EURUSD -> EURUSD |
| `*=*x` | Anhängen von "x" an alle Symbole | EURUSD -> EURUSDx |
| `*=*.p` | Anhängen von ".p" an alle Symbole | EURUSD -> EURUSD.p |
| `*.s=*` | Suffix ".s" entfernen | EURUSD.s -> EURUSD |
| `*.raw=*.p` | Ersetze ".raw" durch ".p" | EURUSD.raw -> EURUSD.p |
### Exakte und Wildcard-Regeln mischen
Exakte Übereinstimmungen haben immer Vorrang vor Wildcards, unabhängig von der Reihenfolge:
```
*=*x;BTCUSD=BTCUSD
```
| Anbieter-Symbol | Übereinstimmende Regel | Empfänger-Symbol |
|----------------|--------------|-----------------|
| EURUSD | `*=*x` (Platzhalter) | EURUSDx |
| GBPUSD | `*=*x` (Platzhalter) | GBPUSDx |
| XAUUSD | `*=*x` (Platzhalter) | XAUUSDx |
| BTCUSD | `BTCUSD=BTCUSD` (genau) | BTCUSD |
Ein weiteres Beispiel - der Anbieter verwendet das Suffix `.s`, aber Gold hat einen anderen Namen:
```
XAUUSD.s=GOLD;*.s=*
```
| Anbieter-Symbol | Übereinstimmende Regel | Empfänger-Symbol |
|----------------|--------------|-----------------|
| EURUSD.s | `*.s=*` (Platzhalter) | EURUSD |
| XAUUSD.s | `XAUUSD.s=GOLD` (genau) | GOLD |
| GBPUSD.s | `*.s=*` (Platzhalter) | GBPUSD |
### Standard
Die Standardzuordnung ist `*=*`, was bedeutet, dass alle Symbole unverändert weitergegeben werden. Dies funktioniert, wenn beide Konten denselben Broker mit denselben Symbolnamen verwenden.
---
## Sicherheitsfunktionen
### Hard Stop (Täglicher Aktienschutz)
Überwacht den Kontostand im Vergleich zum Startwert des Tages. Wenn der Drawdown den konfigurierten Schwellenwert überschreitet, werden ALLE kopierten Positionen sofort geschlossen und bis zum nächsten Handelstag keine neuen Positionen eröffnet.
- Schwellenwert**: konfigurierbar (Standardwert 50%)
- **Resets**: automatisch zu Beginn eines jeden neuen Handelstages
- **Dashboard**: zeigt "Hard Stop: ARMED" (grün) oder "HARD STOP: TRIGGERED" (rot)
- Warnung**: MT5-Alarm-Popup bei Auslösung
Beispiel: Der Tag beginnt mit einem Eigenkapital von $10.000, Hard Stop bei 50%. Wenn das Eigenkapital auf $5.000 fällt, werden alle Positionen geschlossen.
### Margenschutz
Vor jedem Handel prüft der EA:
1. Ist genügend freie Marge für diese Position vorhanden?
2. Würde das geplante Margin-Niveau über der Mindestschwelle bleiben (Standard 150%)?
Wenn eine der beiden Prüfungen fehlschlägt, wird die Position übersprungen (keine erneute Prüfung der Marge).
### Schließungsbestätigung
Wenn eine Position aus der Anbieterdatei verschwindet, wird der Empfänger NICHT sofort geschlossen. Stattdessen:
1. Markiert die Position als "fehlend" und startet einen Timer
2. Sie muss für 3 aufeinanderfolgende Dateilesevorgänge UND 3 Sekunden fehlen (konfigurierbar)
3. Wenn die Position während der Bestätigung wieder auftaucht, werden die Zähler zurückgesetzt - die Position bleibt offen
4. Wenn der Heartbeat des Anbieters veraltet ist, werden Schließungsprüfungen ganz übersprungen (unzuverlässige Daten)
Dies verhindert falsche Schließungen bei schnellem Handel oder File-Write-Races.
### Wiederholungslogik
Wenn eine Order fehlschlägt (Requote, Timeout, Server besetzt), wiederholt der EA bis zu 10 Mal mit einer Verzögerung von 3 Sekunden zwischen den Versuchen. Nicht wiederholbare Fehler (kein Geld, ungültiges Volumen, Handel deaktiviert) werden sofort gestoppt.
### Schutz vor Überschwemmungen
- Mindestens 500ms zwischen den Orderversendungen (Ratenbegrenzung)
- 5-Sekunden-Abkühlung zwischen Volumenänderungen an der gleichen Position
- Kopiert niemals eine Position neu, die bereits verfolgt wird
- Poll-Intervall verhindert übermäßiges Lesen von Dateien (Standard 1 Sekunde)
### Volume Resync
Wenn der Kopierprozentsatz geändert wird, während Positionen offen sind, schließt der EA die betroffenen Positionen und öffnet sie im nächsten Zyklus wieder mit dem korrekten Volumen. Dies verhindert die Endlosschleife "Volumen hinzufügen", die im Hedging-Modus auftreten würde.
### Provider Heartbeat
Der Receiver verfolgt, wann jede Provider-Datei zuletzt aktualisiert wurde. Wenn die Datei eines Providers innerhalb von 30 Sekunden (konfigurierbar) nicht aktualisiert wurde, wird er als nicht verbunden markiert. Auf dem Dashboard wird "DEAD" in rot angezeigt. Der Empfänger schließt keine Positionen aufgrund veralteter Dateidaten.
---
## Dashboard
### Dashboard im Provider-Modus
```
--- DS COPY EA [PROVIDER] ---
Anbieter-ID: MySignal
Konto: 12345678 BrokerServer
Positionen auf dem Konto: 4
Veröffentlichung: 4 Positionen
Filtern: Keine (alle Positionen)
Datei: CopyTrade_Provider_MeinSignal.csv
Letzte Aktualisierung: 14:30:45
```
- **Positionen auf dem Konto**: Summe der Positionen, die durch `PositionsTotal()` ermittelt wurden - Diagnose
- **Publishing**: wie viele davon haben die Filter passiert und wurden in die Datei geschrieben
- **Filter**: zeigt aktive symbolische/magische Filter an (oder "Keine")
- **Datei**: der Name der CSV-Datei, die geschrieben wird
### Dashboard im Empfängermodus
```
--- DS COPY EA [RECEIVER] ---
Eigenkapital: 10250.00 Saldo: 10000.00
Margin-Level: 450.2%
Drawdown: 2.5% / 50% TagStart: 10512.00
Harter Stop: ARMED
Kopierte Positionen: 5
PROVIDER_1: LIVE Kopiert: 50% Pos: 3
Heartbeat: vor 2s
ANBIETER_2: LIVE-Kopie: 100% Pos: 2
Herzschlag: vor 1s
Last: (letzte Fehlermeldung, falls vorhanden)
```
-
## Fehlersuche
### Provider zeigt "Publishing: 0 positions" an, aber ich habe Trades offen
1. Prüfen Sie **Positionen auf dem Konto** auf dem Dashboard - wenn dieser Wert ebenfalls 0 ist, kann der EA Ihre Positionen nicht sehen
2. Prüfen Sie, ob der Symbolfilter oder der magische Filter versehentlich aktiv ist (siehe Zeile **Filters**)
3. Vergewissern Sie sich, dass "Algo Trading zulassen" in den MT5-Einstellungen aktiviert ist.
4. Setzen Sie den Log-Level auf 2 (Debug) und prüfen Sie die Registerkarte "Experten" für eine detaillierte Positionsaufzählung.
### Der Receiver zeigt "Cannot read provider file" an.
1. **Provider ID mismatch**: die ID muss zwischen Provider und Receiver EXAKT übereinstimmen (auf Leerzeichen prüfen)
2. **Unterschiedlicher Ordner für Gemeinsame Dateien**: Überprüfen Sie das Protokoll "Pfad für Gemeinsame Dateien" beider Terminals beim Start - sie müssen identisch sein.
3. **Provider läuft nicht**: stellen Sie sicher, dass der Provider EA angeschlossen und aktiv ist
### Empfänger liest Datei, zeigt aber 0 Positionen / veralteter Heartbeat
```
WARNUNG: Provider 'XYZ' heartbeat veraltet (45s) Positionen=0
```
1. Der Provider wurde möglicherweise neu gestartet oder seine ID wurde geändert
2. Eine alte Datei aus einer früheren Sitzung ist noch vorhanden - löschen Sie `CopyTrade_Provider_*.csv` aus dem Ordner Common Files und starten Sie beide EAs neu
3. Der Provider läuft mit einer anderen ID als der Receiver erwartet
### Positionen werden nicht kopiert
Setzen Sie den Log Level auf dem Receiver auf 2 (Debug) und überprüfen Sie:
1. `Symbol map: EURUSD -> ???` - überprüfen Sie, ob der zugeordnete Symbolname korrekt ist
2. `Symbol nicht handelbar: XYZ` - das gemappte Symbol existiert nicht im Broker des Empfängers
3. "Unzureichende Marge" - die Marge reicht nicht aus, um die Position zu eröffnen
4. `Max total positions reached` - Positionslimit erreicht
5. Maximale Positionen für ProviderX erreicht" - Pro-Provider-Limit erreicht
### Positionen wurden unerwartet geschlossen
Prüfen Sie im Protokoll, was die Schließung ausgelöst hat:
- `Close confirmed: ... absent for Xs` - Provider hat die Position geschlossen (oder File-Read-Problem)
- Hard Stop geschlossen: - Equity Drawdown hat den Hard Stop ausgelöst
- Volumensynchronisierung geschlossen: - Kopierprozentsatz wurde geändert, Position geschlossen für Wiedereröffnung
- Positionen für nicht verbundenen Anbieter schließen" - Zeitüberschreitung beim Heartbeat, wenn die Aktion zum Trennen der Verbindung auf "Schließen" gesetzt ist
