English Русский 中文 Español 日本語
preview
Scalping Orderflow für MQL5

Scalping Orderflow für MQL5

MetaTrader 5Beispiele | 21 November 2024, 15:44
391 0
Javier Santiago Gaston De Iriarte Cabrera
Javier Santiago Gaston De Iriarte Cabrera

Einführung

Ein Beispiel für ein ausgeklügeltes algorithmisches Handelssystem für MetaTrader 5 (MQL5), das die Scalping OrderFlow-Technik verwendet, ist dieser Expert Advisor (EA).

Eine kurzfristige Handelsstrategie, die als „Scalping Order Flow“ bekannt ist, konzentriert sich auf die Identifizierung möglicher Einstiegs- und Ausstiegspunkte auf dem Markt, indem sie den Echtzeitfluss der Aufträge untersucht. Es trifft schnelle Handelsentscheidungen, indem es die Untersuchung von Volumen, Preisaktivität und Orderbuchdaten kombiniert. In der Regel werden die Positionen nur für sehr kurze Zeit gehalten - oft innerhalb von Minuten oder sogar Sekunden.

Dieser EA findet Handelsmöglichkeiten auf der Grundlage von Ungleichgewichten im Orderflow, indem er eine Vielzahl von technischen Indikatoren und Marktanalysemethoden einsetzt. Erweiterte Risikomanagementfunktionen wie Trailing Stops, partielle Positionsschließung und dynamische Positionsgröße sind ebenfalls enthalten. Darüber hinaus enthält der EA eine Methode, um den Handel während wichtiger Nachrichtenereignisse zu verhindern, und setzt ein Limit für aufeinanderfolgende Verluste.

Die Vorhersage kurzfristiger Kursschwankungen durch die Untersuchung von Echtzeitdaten des Orderbuchs und der Volumendynamik ist die Grundidee des OrderFlow-Handels. Durch die Kombination dieser Idee mit anderen etablierten Indikatoren der technischen Analyse entwickelt dieser Expert Advisor eine hybride Strategie, die darauf abzielt, Handelsgelegenheiten mit hoher Wahrscheinlichkeit zu identifizieren.

Die Betonung des Risikomanagements in diesem EA ist eines seiner Hauptmerkmale. Eine wirksame Risikokontrolle ist in der turbulenten Welt des Devisenhandels unerlässlich, insbesondere bei der Anwendung von Scalping-Taktiken. Um das Kapital zu schützen und die möglichen Renditen zu optimieren, umfasst dieses System Trailing Stops, Methoden zur teilweisen Schließung von Positionen und dynamische Positionsgrößen.

Aufgrund seines flexiblen Designs können Händler die Parameter des EAs so anpassen, dass sie besser zu ihrem Handelsstil und ihrer Risikotoleranz passen. Die Nutzer können verschiedene Aspekte des Systems an ihre Handelsziele und Marktperspektiven anpassen, z. B. Volumenschwellen und Indikatorzeiträume.

Es ist wichtig zu verstehen, dass dieser EA, auch wenn er automatisch handelt, keine Lösung für ein „fire and forget" darstellt. Die Grundlagen des Devisenhandels, die Ideen hinter OrderFlow und die speziellen Indikatoren, die in diesem System enthalten sind, sollten von den Nutzern gut verstanden werden. Es ist ratsam, eine routinemäßige Überwachung durchzuführen und notwendige Änderungen vorzunehmen, um zu gewährleisten, dass der EA unter verschiedenen Marktbedingungen optimal funktioniert.


Der Kodex

Dieser Expert Advisor (EA) wurde für MetaTrader 5 entwickelt und implementiert eine fortschrittliche Order Flow Scalping-Strategie mit hochentwickelten Risikomanagement-Funktionen. Der EA beginnt mit der Initialisierung verschiedener technischer Indikatoren und der Validierung der Eingabeparameter während der Funktion OnInit(). Es richtet Handles für Indikatoren wie gleitende Durchschnitte, ADX, ATR, RSI und Bollinger Bänder ein.

#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>

// Input parameters
input int VolumeThreshold = 35000;  // Volume threshold to consider imbalance
input int OrderFlowPeriod = 30;   // Number of candles to analyze order flow
input double RiskPercent = 1.0;   // Risk percentage per trade
input int ADXPeriod = 14;         // ADX Period
input int ADXThreshold = 25;      // ADX threshold for strong trend
input int MAPeriod = 200;         // Moving Average Period
input ENUM_TIMEFRAMES Timeframe = PERIOD_M15;  // Timeframe for analysis
input double MaxLotSize = 0.1;    // Maximum allowed lot size
input int ATRPeriod = 14;         // ATR Period
input double ATRMultiplier = 2.0; // ATR Multiplier
input int RSIPeriod = 14;         // RSI Period
input int RSIOverbought = 70;     // RSI Overbought level
input int RSIOversold = 30;       // RSI Oversold level
input int MAFastPeriod = 10;      // Fast Moving Average Period
input int MASlowPeriod = 30;      // Slow Moving Average Period
input int BollingerPeriod = 20;   // Bollinger Bands Period
input double BollingerDeviation = 2.5; // Bollinger Bands Standard Deviation
input int MaxConsecutiveLosses = 1; // Maximum number of consecutive losses before pausing
input int MinBarsBetweenTrades = 1; // Minimum number of bars between trades

// Global variables
CTrade trade;
CPositionInfo positionInfo;
int maHandle, adxHandle, atrHandle, rsiHandle, maFastHandle, maSlowHandle, bollingerHandle;
int consecutiveLosses = 0;
datetime lastTradeTime = 0;
int barsSinceLastTrade = 0;

// New global variables for statistics
int totalTrades = 0;
int winningTrades = 0;
double totalProfit = 0;
int OnInit()
{
    // Logging initialization
    Print("Starting Order Flow EA v13...");
    
    // Verify trading permissions
    if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
    {
        Print("Error: Automated trading is not allowed in the terminal.");
        return INIT_FAILED;
    }
    
    if(!MQLInfoInteger(MQL_TRADE_ALLOWED))
    {
        Print("Error: Automated trading is not allowed for this EA.");
        return INIT_FAILED;
    }
    
    // Initialize trading object
    trade.SetExpertMagicNumber(123456);
    trade.SetMarginMode();
    trade.SetTypeFillingBySymbol(_Symbol);
    trade.SetDeviationInPoints(10); // 1 pip deviation allowed
    Print("Trading object initialized.");
    
    // Initialize indicators
    maHandle = iMA(_Symbol, Timeframe, MAPeriod, 0, MODE_SMA, PRICE_CLOSE);
    adxHandle = iADX(_Symbol, Timeframe, ADXPeriod);
    atrHandle = iATR(_Symbol, Timeframe, ATRPeriod);
    rsiHandle = iRSI(_Symbol, Timeframe, RSIPeriod, PRICE_CLOSE);
    maFastHandle = iMA(_Symbol, Timeframe, MAFastPeriod, 0, MODE_EMA, PRICE_CLOSE);
    maSlowHandle = iMA(_Symbol, Timeframe, MASlowPeriod, 0, MODE_EMA, PRICE_CLOSE);
    bollingerHandle = iBands(_Symbol, Timeframe, BollingerPeriod, 0, BollingerDeviation, PRICE_CLOSE);
    
    // Verify indicator initialization
    if(maHandle == INVALID_HANDLE || adxHandle == INVALID_HANDLE || atrHandle == INVALID_HANDLE || 
       rsiHandle == INVALID_HANDLE || maFastHandle == INVALID_HANDLE || maSlowHandle == INVALID_HANDLE ||
       bollingerHandle == INVALID_HANDLE)
    {
        Print("Error initializing indicators:");
        if(maHandle == INVALID_HANDLE) Print("- Invalid MA");
        if(adxHandle == INVALID_HANDLE) Print("- Invalid ADX");
        if(atrHandle == INVALID_HANDLE) Print("- Invalid ATR");
        if(rsiHandle == INVALID_HANDLE) Print("- Invalid RSI");
        if(maFastHandle == INVALID_HANDLE) Print("- Invalid Fast MA");
        if(maSlowHandle == INVALID_HANDLE) Print("- Invalid Slow MA");
        if(bollingerHandle == INVALID_HANDLE) Print("- Invalid Bollinger Bands");
        return INIT_FAILED;
    }
    
    Print("All indicators initialized successfully.");
    
    // Verify input parameters
    if(VolumeThreshold <= 0 || OrderFlowPeriod <= 0 || RiskPercent <= 0 || RiskPercent > 100 ||
       ADXPeriod <= 0 || ADXThreshold <= 0 || MAPeriod <= 0 || MaxLotSize <= 0 || ATRPeriod <= 0 ||
       ATRMultiplier <= 0 || RSIPeriod <= 0 || RSIOverbought <= RSIOversold || MAFastPeriod <= 0 ||
       MASlowPeriod <= 0 || BollingerPeriod <= 0 || BollingerDeviation <= 0 || MaxConsecutiveLosses < 0 ||
       MinBarsBetweenTrades < 0)
    {
        Print("Error: Invalid input parameters.");
        return INIT_FAILED;
    }
    
    Print("Input parameters validated.");
    
    // Initialize global variables
    consecutiveLosses = 0;
    lastTradeTime = 0;
    barsSinceLastTrade = MinBarsBetweenTrades;

Die Haupthandelslogik wird in der Funktion OnTick() ausgeführt, die bei jedem Preis-Tick aufgerufen wird. Der EA prüft zunächst, ob sich ein neuer Balken gebildet hat und ob der Handel erlaubt ist. Anschließend wird der Auftragsfluss durch den Vergleich von Kauf- und Verkaufsvolumen über einen bestimmten Zeitraum analysiert. Der EA verwendet mehrere technische Indikatoren, um Handelssignale zu bestätigen, einschließlich Trendstärke (ADX), Preisposition im Verhältnis zu gleitenden Durchschnitten und RSI-Niveaus.

void OnTick()
{
    if(!IsNewBar())
        return;
    
    Print("Current state - Consecutive losses: ", consecutiveLosses, 
          ", Bars since last trade: ", barsSinceLastTrade);
    
    if(!IsTradeAllowed())
    {
        Print("Trading not allowed. Check EA configuration and account permissions.");
        return;
    }
    
    // Check if there's an open position and manage it
    if(PositionExists())
    {
        ManageOpenPositions();
        return; // Exit if there's an open position
    }
    
    barsSinceLastTrade++; // Increment only if there's no open position
    
    if(!IsRiskAcceptable())
    {
        Print("Risk not acceptable.");
        return;
    }
    
    double buyVolume = 0, sellVolume = 0;
    AnalyzeOrderFlow(buyVolume, sellVolume);
    
    double adxValue[], maValue[], atrValue[], rsiValue[], maFastValue[], maSlowValue[], bollingerUpper[], bollingerLower[];
    if(!GetIndicatorData(adxValue, maValue, atrValue, rsiValue, maFastValue, maSlowValue, bollingerUpper, bollingerLower))
        return;
    
    bool strongTrend = (adxValue[0] > ADXThreshold);
    bool aboveMA = (SymbolInfoDouble(_Symbol, SYMBOL_LAST) > maValue[0]);
    bool fastAboveSlow = (maFastValue[0] > maSlowValue[0]);
    
    int dynamicSL = (int)(atrValue[0] * ATRMultiplier / SymbolInfoDouble(_Symbol, SYMBOL_POINT));
    int dynamicTP = dynamicSL * 3;  // Risk/Reward ratio of 1:3
    
    double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID);
    
    // Conditions for a buy trade
    if(strongTrend && aboveMA && fastAboveSlow && buyVolume > sellVolume + VolumeThreshold &&
       rsiValue[0] < RSIOverbought && currentPrice < bollingerUpper[0] &&
       barsSinceLastTrade >= MinBarsBetweenTrades)
    {
        Print("Buy conditions met. Attempting to open position...");
        if(ExecuteTrade(ORDER_TYPE_BUY, dynamicSL, dynamicTP))
        {
            Print("Buy position opened successfully.");
            barsSinceLastTrade = 0;
        }
    }
    // Conditions for a sell trade
    else if(strongTrend && !aboveMA && !fastAboveSlow && sellVolume > buyVolume + VolumeThreshold &&
            rsiValue[0] > RSIOversold && currentPrice > bollingerLower[0] &&
            barsSinceLastTrade >= MinBarsBetweenTrades)
    {
        Print("Sell conditions met. Attempting to open position...");
        if(ExecuteTrade(ORDER_TYPE_SELL, dynamicSL, dynamicTP))
        {
            Print("Sell position opened successfully.");
            barsSinceLastTrade = 0;
        }
    }
}

Für das Risikomanagement implementiert der EA eine dynamische Positionsgröße, die auf einem Prozentsatz des Kontostands und der aktuellen Marktvolatilität (unter Verwendung der ATR) basiert. Außerdem verfügt er über einen Trailing-Stop-Mechanismus und eine teilweise Positionsschließung, um Gewinne zu sichern. Der EA begrenzt das Risiko, indem er eine maximale Anzahl von aufeinanderfolgenden Verlusten und eine Mindestanzahl von Balken zwischen den Trades vorschreibt.

bool IsRiskAcceptable()
{
    if(IsHighImpactNews())
    {
        Print("Risk not acceptable: High impact news detected.");
        return false;
    }
    
    if(consecutiveLosses >= MaxConsecutiveLosses)
    {
        Print("Risk not acceptable: Maximum consecutive losses reached (", consecutiveLosses, "/", MaxConsecutiveLosses, ").");
        return false;
    }
    
    if(barsSinceLastTrade < MinBarsBetweenTrades)
    {
        Print("Risk not acceptable: Not enough bars since last trade (", barsSinceLastTrade, "/", MinBarsBetweenTrades, ").");
        return false;
    }
    
    double equity = AccountInfoDouble(ACCOUNT_EQUITY);
    double balance = AccountInfoDouble(ACCOUNT_BALANCE);
    double drawdown = (balance - equity) / balance * 100;
    if(drawdown > 20) // Increased from 10% to 20%
    {
        Print("Risk not acceptable: Excessive drawdown (", DoubleToString(drawdown, 2), "%).");
        return false;
    }
    
    Print("Risk acceptable. Consecutive losses: ", consecutiveLosses, 
          ", Bars since last trade: ", barsSinceLastTrade, 
          ", Current drawdown: ", DoubleToString(drawdown, 2), "%");
    return true;
}

Die Funktion CalculateLotSize() bestimmt die geeignete Positionsgröße auf der Grundlage des Kontostands, des Risikoprozentsatzes und der aktuellen Marktbedingungen. Die Funktion ManageOpenPositions() verwaltet bestehende Trades und implementiert Trailing Stops und Teilschließungen.

double CalculateLotSize(double stopLossDistance)
{
    double accountBalance = AccountInfoDouble(ACCOUNT_BALANCE);
    double maxRiskAmount = accountBalance * (RiskPercent / 100);
    double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
    double lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
    
    if(tickValue == 0 || stopLossDistance == 0)
    {
        Print("Error: Tick value or Stop Loss distance is 0");
        return 0;
    }
    
    double lotSize = NormalizeDouble(maxRiskAmount / (stopLossDistance * tickValue), 2);
    lotSize = MathFloor(lotSize / lotStep) * lotStep;
    
    double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
    double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
    
    lotSize = MathMax(MathMin(lotSize, maxLot), minLot);
    lotSize = MathMin(lotSize, MaxLotSize);
    
    double margin = AccountInfoDouble(ACCOUNT_MARGIN_FREE);
    double requiredMargin = SymbolInfoDouble(_Symbol, SYMBOL_MARGIN_INITIAL) * lotSize;
    
    if(requiredMargin > margin)
    {
        Print("Not enough free margin to open this position. Required: ", requiredMargin, " Available: ", margin);
        return 0;
    }
    
    Print("Calculated lot size: ", lotSize, " Risk: $", NormalizeDouble(lotSize * stopLossDistance * tickValue, 2));
    
    return lotSize;
}

Die Fehlerbehandlung wird umfassend durch die Funktion HandleTradingErrors() geregelt, die detailliertes Feedback zu verschiedenen handelsbezogenen Fehlern liefert. Der EA enthält auch Funktionen für die Protokollierung von Handelsstatistiken und die Überprüfung auf wichtige Nachrichtenereignisse (wobei letzteres als Platzhalter für die Nutzer zur Verfügung steht).

//+------------------------------------------------------------------+
//| Function for error handling                                      |
//+------------------------------------------------------------------+
void HandleTradingErrors(int errorCode)
{
    switch(errorCode)
    {
        case TRADE_RETCODE_REQUOTE:
            Print("Error: Requote");
            break;
        case TRADE_RETCODE_REJECT:
            Print("Error: Request rejected");
            break;
        case TRADE_RETCODE_CANCEL:
            Print("Error: Request cancelled by trader");
            break;
        case TRADE_RETCODE_PLACED:
            Print("Order placed successfully");
            break;
        case TRADE_RETCODE_DONE:
            Print("Request completed");
            break;
        case TRADE_RETCODE_DONE_PARTIAL:
            Print("Request partially completed");
            break;
        case TRADE_RETCODE_ERROR:
            Print("Request processing error");
            break;
        case TRADE_RETCODE_TIMEOUT:
            Print("Error: Request cancelled by timeout");
            break;
        case TRADE_RETCODE_INVALID:
            Print("Error: Invalid request");
            break;
        case TRADE_RETCODE_INVALID_VOLUME:
            Print("Error: Invalid volume in request");
            break;
        case TRADE_RETCODE_INVALID_PRICE:
            Print("Error: Invalid price in request");
            break;
        case TRADE_RETCODE_INVALID_STOPS:
            Print("Error: Invalid stops in request");
            break;
        case TRADE_RETCODE_TRADE_DISABLED:
            Print("Error: Trading is disabled");
            break;
        case TRADE_RETCODE_MARKET_CLOSED:
            Print("Error: Market is closed");
            break;
        case TRADE_RETCODE_NO_MONEY:
            Print("Error: Not enough money to complete request");
            break;
        case TRADE_RETCODE_PRICE_CHANGED:
            Print("Error: Prices changed");
            break;
        case TRADE_RETCODE_PRICE_OFF:
            Print("Error: No quotes to process request");
            break;
        case TRADE_RETCODE_INVALID_EXPIRATION:
            Print("Error: Invalid order expiration date");
            break;
        case TRADE_RETCODE_ORDER_CHANGED:
            Print("Error: Order state changed");
            break;
        case TRADE_RETCODE_TOO_MANY_REQUESTS:
            Print("Error: Too many requests");
            break;
        case TRADE_RETCODE_NO_CHANGES:
            Print("Error: No changes in request");
            break;
        case TRADE_RETCODE_SERVER_DISABLES_AT:
            Print("Error: Autotrading disabled by server");
            break;
        case TRADE_RETCODE_CLIENT_DISABLES_AT:
            Print("Error: Autotrading disabled by client terminal");
            break;
        case TRADE_RETCODE_LOCKED:
            Print("Error: Request locked for processing");
            break;
        case TRADE_RETCODE_FROZEN:
            Print("Error: Order or position frozen");
            break;
        case TRADE_RETCODE_INVALID_FILL:
            Print("Error: Invalid order filling type");
            break;
        case TRADE_RETCODE_CONNECTION:
            Print("Error: No connection to trading server");
            break;
        case TRADE_RETCODE_ONLY_REAL:
            Print("Error: Operation allowed only for live accounts");
            break;
        case TRADE_RETCODE_LIMIT_ORDERS:
            Print("Error: Pending orders limit reached");
            break;
        case TRADE_RETCODE_LIMIT_VOLUME:
            Print("Error: Volume limit for orders and positions reached");
            break;
        default:
            Print("Unknown error: ", errorCode);
            break;
    }
}

Insgesamt stellt dieser EA ein komplexes Handelssystem dar, das die Orderflow-Analyse mit traditionellen technischen Indikatoren und fortschrittlichen Risikomanagementtechniken kombiniert. Es ist für erfahrene Händler gedacht und sollte vor dem Live-Einsatz gründlich getestet werden.

Anmerkung:  Die Funktion für hochaktuelle Ereignisse ist noch nicht fertig, ich überlasse es Ihnen, sie zu beenden.



Backtesting

Dieser EA funktioniert auch in Zeiträumen von 5, 15 und 30 Minuten.

Sie müssen alle Zeiträume gut analysieren und den EA optimieren, bevor Sie mit ihm handeln wollen.

Dies sind die Ergebnisse für einen Zeitraum von 15 Minuten

Einstellungen 15 min

Eingänge 15 min

Grafik 15 min

Backtesting 15 min

Anhand von Daten aus 15-Minuten-Charts wird in dieser Backtesting-Studie untersucht, wie sich eine Handelsstrategie für das Währungspaar EURUSD von 2000 bis 2025 entwickelt hat. Mit einem Hebelverhältnis von 1:100 und einer Starteinlage von 3000 USD war die Kontogröße vergleichsweise bescheiden, und der hohe Hebel kann sowohl Gewinne als auch Verluste vergrößern. Während der Backtesting-Periode brachte der Ansatz eine bescheidene Rendite von 4,19 % auf die anfängliche Einlage von 3000 USD, mit einem Gesamtnettogewinn von 125,83 USD.

Mit 1,13 USD Gewinn pro 1 USD Verlust scheint die Strategie insgesamt leicht profitabel gewesen zu sein, wie der Gewinnfaktor von 1,13 zeigt. Insgesamt wurden 364 Trades durchgeführt, davon 167 Käufe und 197 Verkäufe. Die hohe Gewinnquote von 73,60 % bei Verkaufs-Transaktionen und 86,23 % bei Kauf-Transaktionen deutet auf eine gute Handelsauswahl hin.

Die Methode schien nur geringe Gewinne, aber höhere Verluste zu haben, wenn die Handelsgeschäfte gegen sie liefen, da der durchschnittliche Gewinn pro Gewinngeschäft (3,71) deutlich geringer war als der durchschnittliche Verlust pro Verlustgeschäft (-12,62 USD). Es gab maximal 15 Handelsgeschäfte mit Gewinnen und maximal 5 Geschäfte mit Verlusten. Der größte Gewinn lag bei 50,22 USD, während der größte Verlust bei -66,10 USD lag.

Der größte Drawdown der Strategie auf der Aktienkurve betrug 5,63 %, was ein akzeptabler Verlust ist und auf ein umsichtiges Risikomanagement hindeutet. Die Strategie erzielte Gewinne, die das eingegangene Risiko angemessen ausglichen, wie die Sharpe Ratio von 1,83 zeigt.

Alles in allem sieht es so aus, als ob es sich um einen Hochfrequenz-Scalping-Ansatz handelt, der darauf abzielt, viele kleine, erfolgreiche Handelsgeschäfte zu machen, während man gelegentlich größere Verluste erleidet. CopyRetryClaude kann Fehler machen, wie seine hohe Gewinnquote und sein geringerer Gewinnfaktor zeigen, was ihn anfällig für erhebliche Verluste machen könnte, wenn sich die Marktbedingungen ändern. Bitte überprüfen Sie Ihre Antworten noch einmal.

5 Minuten Zeitrahmen

Einstellungen 5 min

Eingänge 5 min

Grafik 5 min

Backtesting 5 min

Anhand von Daten aus 5-Minuten-Charts wird in diesem Backtesting untersucht, wie sich eine Handelsstrategie für das Währungspaar EURUSD zwischen dem 1. Januar 2000 und dem 1. Februar 2025 entwickelt hat. Die Technik verwendet eine Ersteinzahlung von 3000 USD mit einem Hebel von 1:100, was auf eine relativ kleine Kontogröße mit hohem Hebel hinweist, der das Potenzial hat, sowohl Gewinne als auch Verluste zu vergrößern.

Die Backtesting-Ergebnisse zeigen, dass die anfängliche Einlage von 3000 USD zu einem Gesamtnettogewinn von 150,32 USD führte, was einer bescheidenen Rendite von 5,01 % über einen Zeitraum von 25 Jahren entspricht. Insgesamt wurden mit dieser Strategie 1732 Transaktionen durchgeführt, darunter 1023 Verkäufe und 709 Käufe. Die gute Handelsauswahl zeigte sich in beiden Richtungen, wie die hohen Gewinnquoten von 81,82 % bzw. 81,95 % für die Verkaufs- und Kauf-Transaktionen belegen.

Die Methode schien viele kleine Gewinne, aber große Verluste zu haben, wenn die Trades gegen sie liefen, da der durchschnittliche Gewinn pro gewinnendem Trade (2,27) viel kleiner war als der durchschnittliche Verlust pro verlorenem Trade (-9,79 USD). Mit 1,05 USD an Gewinnen für jeden $1 an Verlusten war die Strategie insgesamt nur wenig lukrativ, wie der Gewinnfaktor von 1,05 zeigt. Der größte Drawdown der Strategie auf der Aktienkurve betrug 9,95 %, was ein angemessener Wert ist, aber Fragen zum Risikomanagement aufwerfen könnte.

Der Ansatz scheint zu Renditen geführt zu haben, die das eingegangene Risiko nur geringfügig ausgleichen, wie die Sharpe-Ratio von 0,92 zeigt. Die Aktienkurve zeigt im Allgemeinen eine Aufwärtstendenz, allerdings gibt es auch bemerkenswerte Schwankungen und Abschwünge.

Die Parameter der Methode empfehlen die Verwendung eines komplizierten Multifaktor-Ansatzes für Handelsentscheidungen unter Verwendung einer Vielzahl von technischen Indikatoren wie ADX, RSI gleitende Durchschnitte und Bollinger Bänder. Alles in allem sieht es so aus, als ob es sich um einen Hochfrequenz-Scalping-Ansatz handelt, der darauf abzielt, viele kleine, erfolgreiche Handelsgeschäfte zu machen, während man gelegentlich größere Verluste erleidet. Es könnte schwierig sein, im Laufe der Zeit beträchtliche Renditen zu erzielen, und in ungünstigen Marktsituationen kann es zu größeren Rückschlägen kommen, da die Gewinnrate hoch, die Gewinnkomponente jedoch niedrig ist.


Schlussfolgerung

Dieser Expert Advisor für MetaTrader 5 verwendet modernste Risikomanagement-Tools und wendet einen komplexen Order Flow Scalping-Ansatz an. Es verwendet eine Kombination aus verschiedenen technischen Indikatoren, Orderflow-Analyse und dynamischer Positionsgröße, um hochwahrscheinliche Forex-Handelsmöglichkeiten zu finden. Das Backtesting des EA auf verschiedenen Zeitrahmen für das EURUSD-Paar, insbesondere auf 15- und 5-Minuten-Intervallen, zeigt Potenzial.

Dennoch weisen die Ergebnisse sowohl auf Vorteile als auch auf Nachteile hin. Trotz der hohen Gewinnquoten und der bescheidenen Rentabilität dieser Strategie kann es sein, dass sie aufgrund des niedrigen Gewinnfaktors und der relativ geringen Gewinne über längere Testzeiträume keine hohen Renditen erzielen kann. Da die Methode dazu neigt, dass häufige kleine Gewinne durch größere, sporadische Verluste ausgeglichen werden, kann es bei ungünstigen Marktbedingungen zu erheblichen Verlusten kommen.



Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/en/articles/15895

Beigefügte Dateien |
SO_Final.mq5 (58.46 KB)
Neuinterpretation klassischer Strategien in MQL5 (Teil III): Prognose des FTSE 100 Neuinterpretation klassischer Strategien in MQL5 (Teil III): Prognose des FTSE 100
In dieser Artikelserie werden wir uns bekannte Handelsstrategien noch einmal ansehen und untersuchen, ob wir diese Strategien mithilfe von KI verbessern können. Im heutigen Artikel werden wir uns mit dem FTSE 100 befassen und versuchen, den Index anhand eines Teils der Einzelwerte, aus denen er sich zusammensetzt, zu prognostizieren.
Die Handelsgeschäfte direkt auf dem Chart beurteilen, statt in der Handelshistorie unterzugehen Die Handelsgeschäfte direkt auf dem Chart beurteilen, statt in der Handelshistorie unterzugehen
In diesem Artikel werden wir ein einfaches Tool für die bequeme Anzeige von Positionen und Handelsgeschäften direkt auf dem Chart mit Schlüsselnavigation erstellen. So können die Händler einzelne Handelsgeschäfte visuell prüfen und erhalten alle Informationen über die Handelsergebnisse direkt vor Ort.
Analyse mehrerer Symbole mit Python und MQL5 (Teil I): NASDAQ für Hersteller von integrierten Schaltungen Analyse mehrerer Symbole mit Python und MQL5 (Teil I): NASDAQ für Hersteller von integrierten Schaltungen
Diskutieren Sie mit uns, wie Sie KI nutzen können, um Ihre Positionsgrößen und Ordermengen zu optimieren und so die Rendite Ihres Portfolios zu maximieren. Wir zeigen Ihnen, wie Sie algorithmisch ein optimales Portfolio ermitteln und Ihr Portfolio an Ihre Renditeerwartungen oder Ihre Risikotoleranz anpassen können. In dieser Diskussion werden wir die SciPy-Bibliothek und die MQL5-Sprache verwenden, um ein optimales und diversifiziertes Portfolio mit allen uns zur Verfügung stehenden Daten zu erstellen.
Entwicklung eines Expertenberaters für mehrere Währungen (Teil 13): Automatisierung der zweiten Phase — Aufteilung in Gruppen Entwicklung eines Expertenberaters für mehrere Währungen (Teil 13): Automatisierung der zweiten Phase — Aufteilung in Gruppen
Die erste Stufe der automatischen Optimierung haben wir bereits umgesetzt. Wir führen die Optimierung für verschiedene Symbole und Zeiträume nach mehreren Kriterien durch und speichern Informationen über die Ergebnisse jedes Durchgangs in der Datenbank. Nun werden wir die besten Gruppen von Parametersätzen aus den in der ersten Stufe gefundenen auswählen.