Robot Problems

 

Hello ich habe ein Problem mit meinem Robot 

Ich möchte eine simple 3ema Cross Strategie

Long Trade Einstiegsregeln 10 kreuzt die 20 und 50 von unten nach oben Ausstieg Long: wenn 10er EMA die 20 von oben nach unten kreuzt 

Short Trade Einstiegsregeln 10 kreuzt die 20 und 50 von oben nach unten Ausstiegsregeln wenn die 10er EMA die 20 von unten nach oben kreuzt 

Ich möchte auch durch einen Timer regelmäßig alle 60 Sekunden prüfen ob die Einstiegsregeln und die Ausstiegsregeln gegeben sind da ich den Chart manchmal je nach Trend flexibel einsetzen will und zB mal auf den 4H Chart wechseln möchte und ich bei on Tick ja dann bei den 4H Chart 4 Stunden warten müsste bis das geprüft wird ?  

Beim kompilen bekomme ich keine Fehlermeldungen 

Könnte mir jemand bitte paar Tipps geben ? oder hat jemand paar Ideen ? Würde mich über jede Hilfe freuen 

#property copyright "Copyright 2023, MetaQuotes Ltd."

#property link      "https://www.mql5.com"

#property version   "1.00"

#property strict



// External parameters

extern int FastEmaPeriod = 10;

extern int MediumEmaPeriod = 20;

extern int SlowEmaPeriod = 50;

extern double LotSize = 0.01;

extern int TimerIntervalInSeconds = 60; // Timer interval in seconds



// Dynamic arrays to store the previous MA values for each symbol

double PrevFastEma[];

double PrevMediumEma[];

double PrevSlowEma[];



// Timer variable for entry conditions

datetime entryTimer = 0;



// Timer variable for exit conditions

datetime exitTimer = 0;



// Array to keep track of open trades for each symbol

bool isTradeOpen[];

int tradeMagicNumbers[];



// Additional variables

string lastTradedSymbol = "";

string symbols[] = {"EURUSD", "AUDUSD", "USDJPY", "USDCAD"}; // Add the symbols you want to trade here

int totalSymbols = ArraySize(symbols);



// Store the time when the last trade was opened for each symbol

datetime lastTradeOpenTime[];



// Store the entry timer for each symbol

datetime entryTimers[];



void OnInit()

{

    // Initialize the entry timers for each symbol

    ArrayResize(entryTimers, totalSymbols);

    for (int i = 0; i < totalSymbols; i++)

    {

        entryTimers[i] = TimeCurrent();

    }



    // Set the timer event to trigger every TimerIntervalInSeconds seconds

    EventSetMillisecondTimer(TimerIntervalInSeconds * 1000);

}



void OnDeinit(const int reason)

{

    // Close all trades before deinitializing the EA

    for (int s = 0; s < totalSymbols; s++)

    {

        CloseTradesForSymbol(symbols[s]);

    }

}



void OnTimer()

{

    // Execute the trading logic at regular intervals (every TimerIntervalInSeconds seconds)

    for (int s = 0; s < totalSymbols; s++)

    {

        string symbol = symbols[s];



        // Check if there is an open trade for this symbol

        bool hasOpenTrade = CheckSymbolHasOpenTrade(symbol);



        // Check the entry conditions for long trades

        double FastEmaValue = iMA(symbol, 0, FastEmaPeriod, 0, MODE_EMA, PRICE_CLOSE, 0);

        double MediumEmaValue = iMA(symbol, 0, MediumEmaPeriod, 0, MODE_EMA, PRICE_CLOSE, 0);

        double SlowEmaValue = iMA(symbol, 0, SlowEmaPeriod, 0, MODE_EMA, PRICE_CLOSE, 0);

        

        // Update the previous EMA values for the current symbol

        PrevFastEma[s] = iMA(symbol, 0, FastEmaPeriod, 0, MODE_EMA, PRICE_CLOSE, 1);

        PrevMediumEma[s] = iMA(symbol, 0, MediumEmaPeriod, 0, MODE_EMA, PRICE_CLOSE, 1);

        PrevSlowEma[s] = iMA(symbol, 0, SlowEmaPeriod, 0, MODE_EMA, PRICE_CLOSE, 1);



        // Check for the Fast EMA crossing above the Medium EMA and the Medium EMA crossing above the Slow EMA (for long entry)

        bool isFastCrossAboveMedium = (PrevFastEma[s] <= PrevMediumEma[s] && FastEmaValue > MediumEmaValue);



        // Check for the Fast EMA crossing below the Medium EMA and the Medium EMA crossing below the Slow EMA (for short entry)

        bool isFastCrossBelowMedium = (PrevFastEma[s] >= PrevMediumEma[s] && FastEmaValue < MediumEmaValue);



        // Only consider opening a new trade if no trade is currently open for this symbol

        if (!hasOpenTrade)

        {

            // Open long trade if entry conditions are met

            if (isFastCrossAboveMedium && lastTradedSymbol != symbol)

            {

                // Close any existing trades for this symbol

                CloseTradesForSymbol(symbol);



                // Open the long trade

                int magicNumber = s + 1; // You can customize how you generate magic numbers

                int ticket = OrderSend(symbol, OP_BUY, LotSize, Ask, 2, 0, 0, "Entry Buy", magicNumber, 0, Green);

                if (ticket > 0)

                {

                    Print("Long trade opened successfully for ", symbol, ". Ticket: ", ticket);

                    isTradeOpen[s] = true; // Mark the trade as open for this symbol

                    tradeMagicNumbers[s] = magicNumber; // Store the Magic Number of the opened trade

                    exitTimer = TimeCurrent(); // Reset the exit timer

                    lastTradedSymbol = symbol; // Set the lastTradedSymbol to the current symbol to prevent trading the same symbol again in this timer interval

                    lastTradeOpenTime[s] = TimeCurrent(); // Record the time when the trade was opened

                    entryTimers[s] = TimeCurrent(); // Reset the entry timer for this symbol

                }

                else

                {

                    Print("Error opening long trade for ", symbol, ". Error code: ", GetLastError());

                }

            }

            // Open short trade if entry conditions are met

            else if (isFastCrossBelowMedium && lastTradedSymbol != symbol)

            {

                // Close any existing trades for this symbol

                CloseTradesForSymbol(symbol);



                // Open the short trade

                int magicNumber = -(s + 1); // You can customize how you generate magic numbers

                int ticket = OrderSend(symbol, OP_SELL, LotSize, Bid, 2, 0, 0, "Entry Sell", magicNumber, 0, Red);

                if (ticket > 0)

                {

                    Print("Short trade opened successfully for ", symbol, ". Ticket: ", ticket);

                    isTradeOpen[s] = true; // Mark the trade as open for this symbol

                    tradeMagicNumbers[s] = magicNumber; // Store the Magic Number of the opened trade

                    exitTimer = TimeCurrent(); // Reset the exit timer

                    lastTradedSymbol = symbol; // Set the lastTradedSymbol to the current symbol to prevent trading the same symbol again in this timer interval

                    lastTradeOpenTime[s] = TimeCurrent(); // Record the time when the trade was opened

                    entryTimers[s] = TimeCurrent(); // Reset the entry timer for this symbol

                }

                else

                {

                    Print("Error opening short trade for ", symbol, ". Error code: ", GetLastError());

                }

            }

        }



        // Update previous EMA values for the current symbol

        PrevFastEma[s] = FastEmaValue;

        PrevMediumEma[s] = MediumEmaValue;

        PrevSlowEma[s] = SlowEmaValue;

    }



    // Check for exit conditions for each open trade

    ManageExits();

}



// Function to check if a symbol has an open trade

bool CheckSymbolHasOpenTrade(string symbol)

{

    for (int i = OrdersTotal() - 1; i >= 0; i--)

    {

        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

        {

            if (OrderSymbol() == symbol)

            {

                return true;

            }

        }

    }



    return false;

}



// Function to close all trades for a specific symbol

void CloseTradesForSymbol(string symbol)

{

    for (int i = OrdersTotal() - 1; i >= 0; i--)

    {

        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

        {

            if (OrderSymbol() == symbol)

            {

                bool closeResult = OrderClose(OrderTicket(), OrderLots(), OrderType() == OP_BUY ? Bid : Ask, 2, OrderType() == OP_BUY ? Red : Green);

                if (closeResult)

                {

                    Print("Trade closed for ", symbol, ". Ticket: ", OrderTicket());

                }

                else

                {

                    Print("Error closing trade for ", symbol, ". Error code: ", GetLastError());

                }

            }

        }

    }

}



void ManageExits()

{

    int exitTimeIntervalInSeconds = 60; // Adjust this value according to your requirements (2 minutes)



    for (int s = 0; s < totalSymbols; s++)

    {

        if (isTradeOpen[s])

        {

            string symbol = symbols[s];

            int magicNumber = tradeMagicNumbers[s];



            double FastEmaValue = iMA(symbol, 0, FastEmaPeriod, 0, MODE_EMA, PRICE_CLOSE, 0);

            double MediumEmaValue = iMA(symbol, 0, MediumEmaPeriod, 0, MODE_EMA, PRICE_CLOSE, 0);



            // Check the exit conditions only if the trade has been open for the specified time interval

            if (TimeCurrent() - entryTimers[s] >= exitTimeIntervalInSeconds)

            {

                // Check the exit conditions for long trades

                if (OrderType() == OP_BUY && FastEmaValue < MediumEmaValue && OrderMagicNumber() == magicNumber)

                {

                    // Close the long trade

                    bool closeResult = OrderClose(OrderTicket(), OrderLots(), Bid, 2, Red);

                    if (closeResult)

                    {

                        Print("Long trade closed successfully for ", symbol, ". Ticket: ", OrderTicket());

                        isTradeOpen[s] = false; // Mark the trade as closed for this symbol

                        tradeMagicNumbers[s] = 0; // Reset the stored Magic Number for this symbol

                    }

                    else

                    {

                        Print("Error closing long trade for ", symbol, ". Error code: ", GetLastError());

                    }

                }

                // Check the exit conditions for short trades

                else if (OrderType() == OP_SELL && FastEmaValue > MediumEmaValue && OrderMagicNumber() == magicNumber)

                {

                    // Close the short trade

                    bool closeResult = OrderClose(OrderTicket(), OrderLots(), Ask, 2, Green);

                    if (closeResult)

                    {

                        Print("Short trade closed successfully for ", symbol, ". Ticket: ", OrderTicket());

                        isTradeOpen[s] = false; // Mark the trade as closed for this symbol

                        tradeMagicNumbers[s] = 0; // Reset the stored Magic Number for this symbol

                    }

                    else

                    {

                        Print("Error closing short trade for ", symbol, ". Error code: ", GetLastError());

                    }

                }

            }

        }

    }

}
Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • 2023.07.24
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 
  1. Wir können hier Deutsch sprechen :)
  2. Bitte editiere Deinen Beitrag, sodass Code als Code (wird formatiert) angezeigt wird: oder Alt+S.
  3. Es gibt fast nichts, was nicht schon für MT4/5 programmiert wurde!
  4. Such mal nach 3 ma EA (https://www.mql5.com/en/search#!keyword=3%20ma%20EA&amp;module=mql5_module_codebase) in der CodeBase.
  5. Zumindest gibt's dort etwas, was Du kopieren könntest: Copy & Paste die schnellste Form zu programmieren :)
  6. Wenn das Programm nicht tut, was es soll hilft der Debugger: https://www.metatrader5.com/de/metaeditor/help/development/debug
  7. Der Kompiler sagt genau wo was falsch ist: F7=kompilieren, dann F8=Sprung zum ersten Fehler.
  8. OnTick wird bei jedem neuen Tick aufgerufen und dann wird (bei guten Indikatoren) nur der letzte, aktuelle Balken geändert - OnTimer braucht es nicht wirklich, denke ich.
  9. Hier noch Literatur für Anfänger in MQL5:
        https://www.mql5.com/de/articles/496
        https://www.mql5.com/de/articles/100
  10. Wenn Du den Cursor auf eine MQL-Funktion setzt und F1 drückst, siehst Du direkt die Referenz.

 

Bearbeitet 

Zum 7ten Punkt ich bekomme keine Fehlermeldungen beim Kompilieren 

Und vielen Dank für die verlinkten Artikel
 
  1. Ist das für MT4 oder MT5? In MT5 liefert iMA ein Handle, keine Werte: Kursor auf iMA und F1 drücken, so kommt man gleich zum Beispiel.
  2. Bei MultiCurrency würde ich MT5 wählen, er ist schneller und wird weiterentwickelt:

  3. Ich würde keinen EA machen, der mehrere Symbole handelt. Er wäre nicht gut in Backtests optimierbar.
  4. MT5 ist multi-threaded, also jeder EA auf seinem Chart wird parallel zu den anderen bearbeitet. a) MT4 kann das nicht und b) Dein EA mit vielen Symbolen verhindert das.
  5. Aber suche mal nach multi currency: https://www.mql5.com/en/search#!keyword=multi%20currency&module=mql5_module_codebase
    Wie wird dort das Problem gelöst. Dort wird für jedes Symbol ein eigener Parametersatz definiert.
  6. In OnDeinit Positionen schließen kann fehlschlagen, das OnDeinit nach ca. 5 Sekunden beendet wird und wenn die Latenzzeit aus Internet und Server länger dauert...
    In MT5 gäbe es OrderSendAsync(), da wartet das Terminal nicht auf die Antwort des Brokers.
  7. Was sagt denn der Debugger, wenn Du mit ihm Zeilenweise durch das Programm gehst?
  8. Ist der Code von ChatGPT? Dann vergiss es, der funktioniert nie, man muss alles neu schreiben.
  9. Mach erst einmal einen EA für ein Symbol (das des Charts = _Symbol) und dann kannst Du immer noch auf mehrere Symbole 'hochziehen' - Für alles gibt es Beispiele.
  10. Aber: Was funktioniert denn jetzt eigentlich nicht?
 

1. ist für mt4 mt5 wird nicht von meinem broker unterstüzt.

3. Okay danke dann mache ich am besten einen eigenen pro Symbol 

5. Okay danke 

6. Dann werde ich das so handhaben 

7. Muss ich noch ausprobieren 

8. Ja dachte ich probiere mal aus.

10. Die Eintstiegs und Aussteigsregeln sind erfüllt aber öffnet keine Trades

 

10. Die Eintstiegs und Aussteigsregeln sind erfüllt aber öffnet keine Trades

Da müsste aber im Log von Experts und Journal stehen, was passiert, wenn der Auftrag gesendet aber nicht durchgeführt wird.

PS. Es gibt genug Broker mit MT5 und vor allem MQ bietet Demokonten (nur für MT5) für die Backtests mit langer Historie.

Lies zur Brokerwahl: https://www.mql5.com/de/forum/446736

Broker suchen
Broker suchen
  • 2023.05.03
  • www.mql5.com
MetaQuotes (MQ) ist KEIN Broker und bietet auch keine Finanz-, Anlage-, Makler-, Handels- oder Datenfeed-Dienstleistungen an und ist auch nicht an...