Nivelesfibonacci2
- Utilitys
- Version: 2.12
Dieses Skript für MetaTrader 5 ermöglicht es, automatisch Pending-Orders zum Kauf oder Verkauf zu platzieren, wobei zuvor im Chart eingezeichnete horizontale Fibonacci-Niveaus als Referenz dienen.
Das Skript ist für die Verwendung in Verbindung mit FIBONACCI-NIVEAUS 1.1 konzipiert, kann jedoch mit beliebigen horizontalen Linien verwendet werden, die dank des konfigurierten Präfixes derselben Namensstruktur folgen.
Das erste Tool berechnet die den Fibonacci-Niveaus entsprechenden Kurse und zeichnet die Linien in den Chart ein. Dieses zweite Tool nutzt diese Linien als Referenz, um die Pending-Orders automatisch zu platzieren.
Wie funktioniert es?
Der Nutzer konfiguriert:
-
Richtung der Orders: BUY oder SELL.
-
Lotgröße.
-
Optionaler Take-Profit.
-
Optionaler Stop-Loss.
-
Fibonacci-Niveaus, mit denen Sie handeln möchten.
-
Präfix zur Kennzeichnung der Linien.
-
Magic Number.
-
Kommentar zu den Orders.
Das Skript sucht im Chart nach Linien, deren Name mit dem unter „Präfix“ angegebenen Präfix beginnt:
InpPrefix
Standardmäßig:
FiboCustom_
Wenn das erste Skript beispielsweise Folgendes erstellt hat:
FiboCustom_0.0 FiboCustom_23.6 FiboCustom_38.2 FiboCustom_50.0 FiboCustom_61.8 FiboCustom_100.0 FiboCustom_161.8
kann das zweite Skript ausschließlich die Niveaus auswählen, die verwendet werden sollen.
Beispiel:
InpTargetLevels = "0; 23,6; 38,2; 61,8"
Alle anderen Niveaus werden ignoriert.
Automatische Bestimmung der OrderartDie Art der Pending-Order wird automatisch anhand der gewählten Richtung und der Position des Niveaus im Verhältnis zum aktuellen Marktpreis bestimmt.
Kaufaufträge
Bei Auswahl von:
DIR_BUY
verwendet das Skript:
Buy Limit
Wenn der Kurs der Linie unter dem aktuellen Ask-Kurs liegt.
Linienkurs < Ask
Es wird eine Order platziert:
BUY LIMIT
Buy Stop
Wenn der Kurs der Orderlinie über dem aktuellen Ask-Kurs liegt.
Linienkurs > Ask-Kurs
Es wird eine Order platziert:
BUY-STOP
SELL-OrdersWenn ausgewählt:
DIR_SELL
verwendet das Skript:
Sell Limit
Wenn der Kurs der Order über dem aktuellen Geldkurs liegt.
Kurs der Order > Geldkurs
Es wird eine:
SELL LIMIT
Verkaufs-Stop
Wenn der Kurs der Linie unter dem aktuellen Bid-Kurs liegt.
Kurs der Order < Geldkurs
Es wird ein:
SELL STOP
Auf diese Weise muss der Nutzer nicht manuell zwischen Limit und Stop wählen. Das Skript ermittelt automatisch die Art der Order anhand der Position des Fibonacci-Niveaus im Verhältnis zum Markt.
FunktionsbeispielNehmen wir an, der Chart enthält die folgenden Linien:
FiboCustom_0,0 FiboCustom_23,6 FiboCustom_38,2 FiboCustom_50,0 FiboCustom_61,8 FiboCustom_100,0
Und der Benutzer nimmt folgende Einstellungen vor:
Richtung: BUY Lot: 0,01 Niveaus: 0; 23,6; 38,2; 50; 61,8
Das Skript sucht diese Zeilen, ermittelt die entsprechenden Kurse und entscheidet automatisch, ob es sich bei jeder einzelnen um einen Buy-Limit- oder einen Buy-Stop-Auftrag handelt, abhängig vom aktuellen Ask-Kurs.
Daher kann ein und derselbe Satz von Fibonacci-Niveaus je nach aktueller Marktlage unterschiedliche Ordertypen generieren.
Take Profit und Stop LossDas Skript ermöglicht die optionale Eingabe eines Take-Profit- und eines Stop-Loss-Kurses.
Ohne Take-Profit
InpTakeProfit = 0,0
Es wird kein TP festgelegt.
Kein Stop-Loss
InpStopLoss = 0,0
Es wird kein SL festgelegt.
Wenn ein Wert größer als 0,0 eingegeben wird, wird dieser automatisch anhand der Dezimalstellen des Symbols normalisiert:
_Digits
Dadurch lassen sich die Preise an Finanzinstrumente mit unterschiedlicher Anzahl von Dezimalstellen anpassen.
Auswahl der PreisstufenDie Stufen werden wie folgt eingegeben:
InpTargetLevels
, getrennt durch ;.
Beispiel:
0; 23,6; 38,2; 50; 61,8
Es können auch Werte über 100 % oder negative Werte verwendet werden, sofern die entsprechenden Linien im Diagramm vorhanden sind.
Beispiel:
-61,8; 0; 23,6; 38,2; 50; 61,8; 100; 161,8; 261,8; 423,6
Das Skript verarbeitet nur die ausgewählten Niveaus, die es anhand des konfigurierten Präfixes findet.
Identifizierung anhand des PräfixesDer Parameter:
InpPrefix
ermöglicht es, festzulegen, welche Objekte des Diagramms berücksichtigt werden sollen.
Standardwert:
FiboCustom_
Beispiel:
FiboCustom_23,6 FiboCustom_50,0 FiboCustom_61,8
werden erkannt.
Diese Funktion ermöglicht es, die von diesem Tool verwendeten Linien von anderen Objekten im Chart getrennt darzustellen.
Magic NumberDer Parameter:
InpMagicNumber
ermöglicht die Identifizierung der vom Skript erstellten Aufträge.
Standardwert:
123456
Die „Magic Number“ ist besonders nützlich, um diese Orders von anderen ausstehenden Orders zu unterscheiden, die möglicherweise auf demselben Konto vorhanden sind.
Kommentar zu den OrdersDer Parameter:
InpOrderComment
ermöglicht es, einen Kommentar zu den Orders festzulegen.
Standardwert:
Fibo_Pending
Dies erleichtert die Identifizierung innerhalb von MetaTrader 5.
Stornierung von ausstehenden OrdersDer Parameter:
InpAction
ermöglicht die Auswahl zwischen zwei Aktionen.
ACTION_PLACE
Platziert die ausstehenden Orders entsprechend den ausgewählten Ebenen.
ACTION_DELETE
Storniert die ausstehenden Aufträge, die alle folgenden Bedingungen erfüllen:
-
Sie gehören zum aktuellen Wert.
-
Sie haben die unter „InpMagicNumber“ angegebene Magic Number.
Dadurch können die von diesem Skript verwalteten ausstehenden Orders gelöscht werden, ohne dass Orders anderer Symbole oder Magic Numbers davon betroffen sind.
Zusammenhang mit NIVELESFIBONACCI1.1Die beiden Skripte können als zweistufiges System verwendet werden:
NIVELESFIBONACCI1.1 ↓ Berechnet die Fibonacci-Preise ↓ Zeichnet die horizontalen Linien ↓ NIVELESFIBONACCI2.12 ↓ Liest die Linien anhand des Präfixes ↓ Wählt die angegebenen Niveaus aus ↓ Ruft deren Preise ab ↓ Bestimmt automatisch Limit / Stop ↓ Platziert die Pending-Orders
Beispiel:
Erstes Tool
Punkt A → 1,16594 = 100 % Punkt B → 1,16363 = 423,6 %
Das erste Tool berechnet die Preise für:
0 % 23,6 % 38,2 % 50 % 61,8 % 100 % 161,8 % 261,8 % 423,6 %
und zeichnet diese in das Diagramm ein.
Anschließend kann das zweite Werkzeug beispielsweise folgende Werte auswählen:
23,6; 38,2; 50; 61,8
auswählen und die Pending-Orders direkt auf diese Kurse setzen.
Hauptmerkmale-
Massenplatzierung von Pending-Orders auf Fibonacci-Niveaus.
-
Kompatibel mit benutzerdefinierten Fibonacci-Niveaus.
-
Unabhängige Auswahl der Niveaus, mit denen gehandelt werden soll.
-
Unterstützung für Buy-Limit-Orders.
-
Unterstützung für Buy-Stop-Orders.
-
Unterstützung für Sell-Limit-Orders.
-
Unterstützung für Sell-Stop- Orders.
-
Automatische Ermittlung der Orderart anhand des aktuellen Kurses.
-
Auslesen der Zeilen anhand eines konfigurierbaren Präfixes.
-
Kompatibel mit unterschiedlichen Dezimalstellenanzahlen über _Digits.
-
Automatische Normalisierung der Kurse.
-
Optionaler Take-Profit.
-
Optionaler Stop-Loss.
-
Konfigurierbare Magic Number.
-
Konfigurierbare Orderkommentare.
-
Funktion zum Stornieren der über die Magic Number verwalteten ausstehenden Orders.
-
Erfordert keine externen Indikatoren.
-
Keine DLL erforderlich.
Dieses Skript berechnet die Fibonacci-Niveaus nicht selbst.
Es verwendet die Kurswerte der im Chart vorhandenen horizontalen Linien als Einstiegsniveaus für Pending-Orders.
Um es zusammen mit NIVELESFIBONACCI1.1 zu verwenden, müssen beide Skripte dasselbe Präfix verwenden, standardmäßig:
FiboCustom_
Das Skript generiert zudem keine Kauf- oder Verkaufssignale anhand einer technischen Analyse. Die Richtung der Orders (BUY oder SELL) wird vom Benutzer manuell ausgewählt.
Die Platzierung von Orders ist mit finanziellen Risiken verbunden. Die endgültige Ausführung einer Pending-Order hängt zudem von den Marktbedingungen, den Regeln des Brokers, dem Mindestabstand zwischen Orders, dem zulässigen Volumen, den Stop-Levels und weiteren Einschränkungen des Wertpapiers ab.
Version: 2.12
Plattform: MetaTrader 5
Typ: Skript
Autor: SPC
//+------------------------------------------------------------------+
//| FIBONACCI-NIVEAUS 2.12.mq5 |
//| SPC |
//| https://www.mql5.com/es/users/calimero1166 |
//+------------------------------------------------------------------+
#property copyright „SPC“
#property link "https://www.mql5.com/es/users/calimero1166"
#property version "2.12"
#property description "Skript zur massenhaften Platzierung oder selektiven Stornierung von Pending Orders (Limit/Stop) anhand von Fibonacci-Niveaus, die anhand eines Präfixes ermittelt werden."
#property script_show_inputs
#include <Trade\Trade.mqh>
//--- Aufzählung für die Hauptaktion des Skripts
enum ENUM_SCRIPT_ACTION
{
ACTION_PLACE = 0, // Pending Orders platzieren
ACTION_DELETE = 1 // Ausstehende Aufträge stornieren
};
//--- Auflistung der Auftragsrichtungen
enum ENUM_ORDER_DIRECTION
{
DIR_BUY = 0, // Ausstehende Einkäufe
DIR_SELL = 1 // Ausstehende Verkäufe
};
//--- Eingabeparameter
Eingabegruppe „=== Hauptaktion ===“
input ENUM_SCRIPT_ACTION InpAction = ACTION_PLACE; // Auszuführende Aktion
Eingabegruppe „=== Betriebskonfiguration ===“
input ENUM_ORDER_DIRECTION InpDirection = DIR_BUY; // Richtung der Orders
input double InpLotSize = 0,01; // Lotgröße pro Order
input double InpTakeProfit = 0.0; // Manueller Take-Profit-Kurs (0.0 = kein TP)
input double InpStopLoss = 0,0; // Manueller Stop-Loss als Kurswert (0,0 = kein SL)
input group "=== Auswahl von Niveaus und Präfix ==="
input string InpTargetLevels = "0; 23,6; 38,2; 50; 61,8"; // Zu handelnde Fibonacci-Niveaus (durch ; getrennt)
input string InpPrefix = "FiboCustom_"; // Präfix der zu suchenden Linien
Eingabegruppe „=== Erweiterte Einstellungen ===“
Eingabe ulong InpMagicNumber = 123456; // Magic Number zur Identifizierung der Aufträge
input string InpOrderComment = "Fibo_Pending"; // Kommentar zu den Orders
//+------------------------------------------------------------------+
//| Startfunktion des Skripts |
//+------------------------------------------------------------------+
void OnStart()
{
CTrade trade;
trade.SetExpertMagicNumber(InpMagicNumber);
// --- MODUS 1: AUSSTEHENDE AUFTRÄGE STORNIEREN ---
if(InpAction == ACTION_DELETE)
{
int deletedCount = DeletePendingOrders(trade, InpMagicNumber);
PrintFormat("FIBONACCI-NIVELES 2.12 (v2.12): %d ausstehende Orders mit der Magic-Nummer %d wurden in %s gelöscht.", deletedCount, InpMagicNumber, _Symbol);
return;
}
// --- MODUS 2: PENDENTE AUFTRÄGE EINGEBEN ---
// 1. Den zu durchsuchenden Text der Ebenen verarbeiten
double targetLevels[];
ushort u_sep = StringGetCharacter(";", 0);
string rawLevels[];
int totalSplit = StringSplit(InpTargetLevels, u_sep, rawLevels);
if(totalSplit <= 0)
{
Print("Fehler: In InpTargetLevels wurden keine gültigen Stufen angegeben.");
return;
}
ArrayResize(Zielstufen, Gesamtanzahl der Teilungen);
int validLevelsCount = 0;
for(int i = 0; i < totalSplit; i++)
{
string trimmed = rawLevels[i];
StringTrimLeft(trimmed);
StringTrimRight(trimmed);
if (StringLen(trimmed) > 0)
{
double val = StringToDouble(trimmed);
if (val == 0.0 && trimmed != "0" && trimmed != "0.0" && trimmed != "0,0")
{
continue;
}
targetLevels[validLevelsCount] = val;
validLevelsCount++;
}
}
if(validLevelsCount == 0)
{
Print("Fehler: Die angegebenen Fibonacci-Niveaus konnten nicht interpretiert werden.");
return;
}
// 2. Aktuelle Marktpreise abrufen
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
if (ask <= 0 || bid <= 0)
{
Print("Fehler: Die aktuellen Kursnotierungen konnten nicht abgerufen werden.");
return;
}
// 3. Objekte mit dem Präfix im Graphen suchen
int totalObjects = ObjectsTotal(0, -1, -1);
int ordersPlaced = 0;
for (int i = 0; i < totalObjects; i++)
{
string objName = ObjectName(0, i, -1);
// Prüfen, ob das Objekt mit dem Präfix übereinstimmt
if(StringFind(objName, InpPrefix) == 0)
{
// Die numerische Stufe des Objekts extrahieren
string levelStr = StringSubstr(objName, StringLen(InpPrefix));
double objLevel = StringToDouble(levelStr);
// Prüfen, ob die Ebene der Linie in unserer ausgewählten Liste enthalten ist
if(!IsLevelSelected(objLevel, targetLevels, validLevelsCount))
continue;
double linePrice = ObjectGetDouble(0, objName, OBJPROP_PRICE);
linePrice = NormalizeDouble(linePrice, _Digits);
if(linePrice <= 0)
continue;
// TP und SL normalisieren, sofern sie konfiguriert sind
double tp = (InpTakeProfit > 0) ? NormalizeDouble(InpTakeProfit, _Digits) : 0.0;
double sl = (InpStopLoss > 0) ? NormalizeDouble(InpStopLoss, _Digits) : 0.0;
// 4. Ordertyp ermitteln und senden
if(InpDirection == DIR_BUY)
{
if(linePrice < ask)
{
if(trade.BuyLimit(InpLotSize, linePrice, _Symbol, sl, tp, ORDER_TIME_GTC, 0, InpOrderComment))
{
PrintFormat("Buy-Limit-Order auf dem Niveau %.1f%% zum Preis %.*f platziert", objLevel, _Digits, linePrice);
ordersPlaced++;
}
else
{
PrintFormat("Fehler beim Setzen eines Buy-Limit-Auftrags bei %.1f%%: %s", objLevel, trade.ResultComment());
}
}
else if(linePrice > ask)
{
if(trade.BuyStop(InpLotSize, linePrice, _Symbol, sl, tp, ORDER_TIME_GTC, 0, InpOrderComment))
{
PrintFormat("Buy-Stop-Order auf dem Niveau %.1f%% zum Kurs %.*f platziert", objLevel, _Digits, linePrice);
ordersPlaced++;
}
else
{
PrintFormat("Fehler beim Platzieren eines Buy-Stop-Auftrags bei %.1f%%: %s", objLevel, trade.ResultComment());
}
}
}
else // DIR_SELL
{
if(linePrice > bid)
{
if(trade.SellLimit(InpLotSize, linePrice, _Symbol, sl, tp, ORDER_TIME_GTC, 0, InpOrderComment))
{
PrintFormat("Verkaufslimit auf dem Niveau %.1f%% zum Kurs %.*f platziert", objLevel, _Digits, linePrice);
ordersPlaced++;
}
else
{
PrintFormat("Fehler beim Setzen eines Sell-Limit-Auftrags bei %.1f%%: %s", objLevel, trade.ResultComment());
}
}
else if(linePrice < bid)
{
if(trade.SellStop(InpLotSize, linePrice, _Symbol, sl, tp, ORDER_TIME_GTC, 0, InpOrderComment))
{
PrintFormat("Sell-Stop-Order auf dem Niveau %.1f%% zum Kurs %.*f platziert", objLevel, _Digits, linePrice);
ordersPlaced++;
}
else
{
PrintFormat("Fehler beim Setzen eines Sell-Stop-Auftrags bei %.1f%%: %s", objLevel, trade.ResultComment());
}
}
}
}
}
PrintFormat("FIBONACCI-NIVEAUS 2.12 (v2.12): Vorgang abgeschlossen. Gesamtzahl der platzierten Orders: %d", ordersPlaced);
}
//+------------------------------------------------------------------+
//| Hilfsfunktion zur Überprüfung, ob ein Level zur Liste gehört |
//+------------------------------------------------------------------+
bool IsLevelSelected(double level, const double &selectedLevels[], int count)
{
for(int i = 0; i < count; i++)
{
if(MathAbs(level - selectedLevels[i]) < 0,01)
return true;
}
return false;
}
//+------------------------------------------------------------------+
//| Hilfsfunktion zum Löschen der ausstehenden Aufträge von Magic |
//+------------------------------------------------------------------+
int DeletePendingOrders(CTrade &trade, ulong magic)
{
int deleted = 0;
int GesamtBestellungen = BestellungenGesamt();
// Wir durchlaufen die Bestellungen in umgekehrter Reihenfolge, um Indexabweichungen zu vermeiden
for(int i = totalOrders - 1; i >= 0; i--)
{
ulong ticket = OrderGetTicket(i);
if(ticket > 0)
{
if(OrderGetString(ORDER_SYMBOL) == _Symbol && OrderGetInteger(ORDER_MAGIC) == magic)
{
if(trade.OrderDelete(ticket))
deleted++;
else
PrintFormat("Fehler beim Löschen des Auftrags Nr. %d: %s", ticket, trade.ResultComment());
}
}
}
return deleted;
}
//+------------------------------------------------------------------+
