Anfänger EA - Bitte um Hilfe :-)

 

Hallo zusammen,

ich habe mir meinen ersten und einfachen EA erstellt. Leider ist ein Fehler im Code, sodass keine Trade eröffent werden. Ich finde diesen Fehler nicht und benötige eure Hilfe.

Was habe ich falsch gemacht? 


Dieser EA soll wie folgt funktionieren:

  1. Initialisierung (OnInit-Funktion)

    • Der EA prüft zuerst, ob er auf dem H1-Zeitrahmen (stündlich) ausgeführt wird. Wenn nicht, wird er mit einer Fehlermeldung gestoppt.
    • Danach initialisiert der EA den einfachen gleitenden Durchschnitt (SMA) mit der gewählten Periode und bezieht sich dabei auf den Schlusspreis der Kerzen.
  2. Handelsbedingungen (OnTick-Funktion)

    • Der EA prüft ständig den Preis in Bezug auf den SMA:
      • Kaufbedingung: Wenn der Schlusspreis der aktuellen Kerze über dem SMA liegt und der Schlusspreis der vorherigen Kerze unter dem SMA lag, wird eine Kauforder platziert.
      • Verkaufsbedingung: Wenn der Schlusspreis der aktuellen Kerze unter dem SMA liegt und der Schlusspreis der vorherigen Kerze über dem SMA lag, wird eine Verkaufsorder platziert.
  3. Handelsdetails

    • Die Größe der Position, die geöffnet wird (sowohl für den Kauf als auch für den Verkauf), wird durch die Variable lotSize bestimmt.
    • Es gibt einen festgelegten Take-Profit (Gewinnziel) und Stop-Loss (maximaler Verlust), definiert in Pips, für jeden Handel. Diese Werte werden verwendet, um die genauen Preisniveaus für den Take-Profit und Stop-Loss für den jeweiligen Trade zu berechnen.
  4. Fehlerbehandlung

    • Wenn beim Senden einer Order ein Fehler auftritt, wird der Grund für den Fehler in das Terminal-Journal gedruckt.
  5. Magic Number

    • Jeder Trade, der vom EA platziert wird, hat eine eindeutige ID, die als "Magic Number" bezeichnet wird. Dies erleichtert es, Trades, die von diesem speziellen EA platziert wurden, von anderen Trades zu unterscheiden, die möglicherweise gleichzeitig auf dem Konto laufen.


//+------------------------------------------------------------------+
//|                                      Einfacher SMA Crossover EA  |
//|                                      Copyright 2023, Firma XYZ  |
//|                                       http://www.firma-xyz.net/ |
//+------------------------------------------------------------------+
input int MA_Period = 14;          // Period of SMA

// Convert these variables to input parameters for easy adjustments from EA settings window.
input double lotSize = 0.01;       // Lot size for the trade
input double takeProfitPips = 30;  // Take profit in pips
input double stopLossPips = 10;    // Stop loss in pips

int magicNumber = 250877;          // Magic number for trades
double SMA[];
double price[];

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArraySetAsSeries(SMA, true);
   ArraySetAsSeries(price, true);

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int dataCount = iBars(_Symbol, PERIOD_H1);

   int handle = iMA(_Symbol, PERIOD_H1, MA_Period, 0, MODE_SMA, PRICE_CLOSE);
   if (handle == INVALID_HANDLE)
       return;

   CopyBuffer(handle, 0, 0, dataCount, SMA);
   CopyClose(_Symbol, PERIOD_H1, 0, dataCount, price);

   if (price[0] > SMA[0] && price[1] <= SMA[1])
     {
      MqlTradeRequest request;
      MqlTradeResult result;
      
      request.action = TRADE_ACTION_DEAL;
      request.symbol = _Symbol;
      request.volume = lotSize;
      request.type = ORDER_TYPE_BUY;  // Corrected order type
      request.price = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_ASK), _Digits);
      request.sl = request.price - stopLossPips * _Point;
      request.tp = request.price + takeProfitPips * _Point;
      request.deviation = 10;
      request.magic = magicNumber;
      
      if(!OrderSend(request, result))
        Print("OrderSend failed with error(", GetLastError(), ")");
     }

   if (price[0] < SMA[0] && price[1] >= SMA[1])
     {
      MqlTradeRequest request;
      MqlTradeResult result;
      
      request.action = TRADE_ACTION_DEAL;
      request.symbol = _Symbol;
      request.volume = lotSize;
      request.type = ORDER_TYPE_SELL;  // Corrected order type
      request.price = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits);
      request.sl = request.price + stopLossPips * _Point;
      request.tp = request.price - takeProfitPips * _Point;
      request.deviation = 10;
      request.magic = magicNumber;
      
      if(!OrderSend(request, result))
        Print("OrderSend failed with error(", GetLastError(), ")");
     }
  }
//+------------------------------------------------------------------+

Vielen Dank für eure Unterstützung.

Viele Grüße

Daniel

 

Hmm - da ist fast alles falsch und müsste neu geschrieben werden.

Lies mal das hier;

Quickstart for newbies: https://www.mql5.com/de/articles/496
und: https://www.mql5.com/de/articles/100
Kochbücher: https://www.mql5.com/de/search#!keyword=kochbuch
https://www.mql5.com/en/forum/447439
https://www.mql5.com/en/forum/9950

Außerdem gilt: Es gibt fast nichts, was nicht schon für MT4/MT5 programmiert wurde.

Googe mal nach: "site:mql5.com EA mq5 ma"

In dieser Artikelserie wird jeder Indikator erklärt und wie er für Kauf und Verkauf verwendet werden kann:  https://www.mql5.com/de/users/m.aboud/publications

Es felt nur das Senden und Verwalten von Kauf- und Verkaufsaufträgen. Den Teil könntest Du aber aus dieser Datei entnehmen, die bereits auf Deinem PC ist: ..\MQL5\Experts\Examples\Moving Average\Moving Average.mq5

Oder nimm diesen Artikel "Vergleich verschiedener Typen gleitender Durchschnitte im Handel" (mit EA): https://www.mql5.com/de/articles/3791

Schnelleinstieg oder Kurzanleitung für Anfänger
Schnelleinstieg oder Kurzanleitung für Anfänger
  • www.mql5.com
Liebe Leser, in diesem Artikel möchte ich Ihnen vermitteln und zeigen, wie man sich möglichst schnell und einfach die Grundlagen der Erstellung automatischer Handelssysteme, wie die Arbeit mit Indikatoren u. a., erschließt. Der Beitrag richtet sich an Neueinsteiger, in ihm kommen weder komplizierte noch schwer zu verstehende Beispiele zur Anwendung.
 
Carl Schreiber #:

Hmm - da ist fast alles falsch und müsste neu geschrieben werden.

Lies mal das hier;

Quickstart for newbies: https://www.mql5.com/de/articles/496
und: https://www.mql5.com/de/articles/100
Kochbücher: https://www.mql5.com/de/search#!keyword=kochbuch
https://www.mql5.com/en/forum/447439
https://www.mql5.com/en/forum/9950

Außerdem gilt: Es gibt fast nichts, was nicht schon für MT4/MT5 programmiert wurde.

Googe mal nach: "site:mql5.com EA mq5 ma"

In dieser Artikelserie wird jeder Indikator erklärt und wie er für Kauf und Verkauf verwendet werden kann:  https://www.mql5.com/de/users/m.aboud/publications

Es felt nur das Senden und Verwalten von Kauf- und Verkaufsaufträgen. Den Teil könntest Du aber aus dieser Datei entnehmen, die bereits auf Deinem PC ist: ..\MQL5\Experts\Examples\Moving Average\Moving Average.mq5

Oder nimm diesen Artikel "Vergleich verschiedener Typen gleitender Durchschnitte im Handel" (mit EA): https://www.mql5.com/de/articles/3791

Hey Carl,

dank für deine Antwort. Ich werde ich da mal durcharbeiten.

Viele Grüße

Daniel

 
DanielMarkus:
price[];

Hallo,

MA, Stoploss und Takeprofit werden als Integer (int) definiert.

Sie haben leider anderen Still des Programmierung, sonst könnte ich vielleicht mehr Fehler finden.

Gruß Igor