How to get the value of the signalline of macd?

 

Hello, this probably is a sump question, but I have a problem with the MACD:

If I have following code:

double PriceArray[];
   
int MacDDefinition = iMACD(_Symbol, _Period, 12, 26, 9, PRICE_CLOSE);

CopyBuffer(MacDDefinition, 0, 0, 3, PriceArray);

float MACDValue = myPriceArray[0];

the MACDValue ist the value of the MACDline right?

I want to code a crossover so I also need the value of the signal line, but I don't find out how to access it.

Or would I do this in a different way?

Thanks.

 
UnknownInnocent:

Hello, this probably is a sump question, but I have a problem with the MACD:

If I have following code:

the MACDValue ist the value of the MACDline right?

I want to code a crossover so I also need the value of the signal line, but I don't find out how to access it.

Or would I do this in a different way?

Thanks.

  1. Wir können hier Deutsch sprechen :)
  2. Für MQL4 oder MQL5?
  3. Aber schau mal nach in der Referenz iMACD (Kursor drauf stellen und F1 drücken) und orientiere Dich an dem dortigen  Beispiel! Du findest alles, was Du brauchst!
 
Carl Schreiber:
  1. Wir können hier Deutsch sprechen :)
  2. Für MQL4 oder MQL5?
  3. Aber schau mal nach in der Referenz iMACD (Kursor drauf stellen und F1 drücken) und orientiere Dich an dem dortigen  Beispiel! Du findest alles, was Du brauchst!

1. Ups mein Fehler, bin Englisch aus so Foren gewohnt xD

2. Ich hatte gehofft, dass das keinen großen Unterschied macht, aber eher mql5

3. Ich blicke das gnaze Mql-Zeug nicht so ganz... In Java hätte ich das jetzt irgendwie so gemacht:

MACD myMacd = new MACD(_Symbol, _Period, 12, 26, 9, PRICE_CLOSE); 

float MACDValue = myMacd.getMACDValue();

float SignalValue = myMacd.getSignalValue();

so scheint das aber nicht zu funktionieren.

Diese Dokumentation macht mich leider auch nicht schlau... Das ist doch der Code für den Indikator? 

Diese folgenden Zeilen sind doch das wonach ich suche:

double         MACDBuffer[]; double         SignalBuffer[];

//--- Teil des Arrays iMACDBuffer mit Werten auf Indikator-Puffer mit Index 0 ausfüllen
   if(CopyBuffer(ind_handle,0,0,amount,macd_buffer)<0)
     {
      //--- wenn die Kopie fehlschlägt, Fehlercode anzeigen
      PrintFormat("Daten konnte nicht aus dem Indikator iMACD kopiert werden, Fehlercode ist %d",GetLastError());
      //--- Beenden mit Null-Ergebnis - dies bedeutet, dass der Indikator nicht berechnet wird
      return(false);
     }
 
//--- Teil des Arrays SignalBuffer mit Werten auf Indikator-Puffer mit Index 1 ausfüllen
   if(CopyBuffer(ind_handle,1,0,amount,signal_buffer)<0)
     {
      //--- wenn die Kopie fehlschlägt, Fehlercode anzeigen
      PrintFormat("Daten konnte nicht aus dem Indikator iMACD kopiert werden, Fehlercode ist %d",GetLastError());
      //--- Beenden mit Null-Ergebnis - dies bedeutet, dass der Indikator nicht berechnet wird
      return(false);
     }

Ich verstehe nur nicht, wie ich darauf im EA zugreifen kann.

Wenn ich das hier ausführe:

CopyBuffer(MacDDefinition, 0, 0, 3, myPriceArray);

kopiere ich ja wohl nur die Werte für den MACD, aber wie komme ich an die Werte der Signallinie?

 
UnknownInnocent:

1. Ups mein Fehler, bin Englisch aus so Foren gewohnt xD

2. Ich hatte gehofft, dass das keinen großen Unterschied macht, aber eher mql5

3. Ich blicke das gnaze Mql-Zeug nicht so ganz... In Java hätte ich das jetzt irgendwie so gemacht:

so scheint das aber nicht zu funktionieren.

Diese Dokumentation macht mich leider auch nicht schlau... Das ist doch der Code für den Indikator? 

Diese folgenden Zeilen sind doch das wonach ich suche:

//--- Teil des Arrays iMACDBuffer mit Werten auf Indikator-Puffer mit Index 0 ausfüllen
   if(CopyBuffer(ind_handle,0,0,amount,macd_buffer)<0)
     {
      //--- wenn die Kopie fehlschlägt, Fehlercode anzeigen
      PrintFormat("Daten konnte nicht aus dem Indikator iMACD kopiert werden, Fehlercode ist %d",GetLastError());
      //--- Beenden mit Null-Ergebnis - dies bedeutet, dass der Indikator nicht berechnet wird
      return(false);
     }
 
//--- Teil des Arrays SignalBuffer mit Werten auf Indikator-Puffer mit Index 1 ausfüllen
   if(CopyBuffer(ind_handle,1,0,amount,signal_buffer)<0)
     {
      //--- wenn die Kopie fehlschlägt, Fehlercode anzeigen
      PrintFormat("Daten konnte nicht aus dem Indikator iMACD kopiert werden, Fehlercode ist %d",GetLastError());
      //--- Beenden mit Null-Ergebnis - dies bedeutet, dass der Indikator nicht berechnet wird
      return(false);
     }

Ich verstehe nur nicht, wie ich darauf im EA zugreifen kann.

Wenn ich das hier ausführe:

kopiere ich ja wohl nur die Werte für den MACD, aber wie komme ich an die Werte der Signallinie?

Das ist ein buffer, steht auch genauso in der beschreibung

buffer 0 ist main line

 buffer 1 signal line

 

Du musst über den Index auf die Werte zugreifen.

Hier ein Beispiel, das Signal für deinen EA etc. musst du natürlich noch proggen:

//+------------------------------------------------------------------+
input ENUM_TIMEFRAMES      inp_Timeframe        = PERIOD_CURRENT; // timeframe 
input int                  inp_fast_ema_period  =             12; // period of fast ema 
input int                  inp_slow_ema_period  =             26; // period of slow ema 
input int                  inp_signal_period    =              9; // period of signal
input ENUM_APPLIED_PRICE   inp_applied_price    =    PRICE_CLOSE; // type of price   

//+------------------------------------------------------------------+
int    haMACD;
double buMACD_Buffer[];
double buMACD_Signal[];
int    toCopy = 3;
int    precision = _Digits+1;

//+------------------------------------------------------------------+
int OnInit()
{
   haMACD=iMACD(_Symbol,inp_Timeframe,inp_fast_ema_period,inp_slow_ema_period,inp_signal_period,inp_applied_price);
   if(haMACD==INVALID_HANDLE)
      {
         Alert("*ERROR* creating iMACD handle");
         return(INIT_FAILED);
      }

   ArraySetAsSeries(buMACD_Buffer,true);
   ArraySetAsSeries(buMACD_Signal,true);

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
void OnTick()
{
   if(CopyBuffer(haMACD,0,0,toCopy,buMACD_Buffer) != toCopy) return;
   if(CopyBuffer(haMACD,1,0,toCopy,buMACD_Signal) != toCopy) return;

   Comment("\nMACD_Buffer[1]:",DoubleToString(buMACD_Buffer[1],precision),
           "\nMACD_Signal[1]:",DoubleToString(buMACD_Signal[1],precision),
           "\nMACD_Buffer[0]:",DoubleToString(buMACD_Buffer[0],precision),
           "\nMACD_Signal[0]:",DoubleToString(buMACD_Signal[0],precision));
}

Wenn du bei iMACD auf F1 drückst ist dir auch nicht viel geholfen weil das alles, wie so oft, voll überkompliziert dargestellt wird und ausserdem ein Indikator und kein EA geproggt wird.

Also eigentlich vollkommen sinnentleert!

 
Otto Pauser:

Du musst über den Index auf die Werte zugreifen.

Hier ein Beispiel, das Signal für deinen EA etc. musst du natürlich noch proggen:

Wenn du bei iMACD auf F1 drückst ist dir auch nicht viel geholfen weil das alles, wie so oft, voll überkompliziert dargestellt wird und ausserdem ein Indikator und kein EA geproggt wird.

Also eigentlich vollkommen sinnentleert!

Vielen Dank, das hat mir jetzt wirklich weitergeholfen! Ich habe noch einen EMA mit eingebaut und würde mich freuen, wenn nochmal jemand drüber schauen könnte, ob ich das richtig implementiert habe und ob ich meine Signale richtig berechne:

buy:

1. MACD- und Signal-Linie sind unter 0

2. MACD-Linie schneidet über Signal-Linie

3. Schlusskurs der vorherigen Kerze liegt über dem EMA

sell:

1. MACD- und Signal-Linie sind über 0

2. MACD-Linie schneidet unter Signal-Linie

3. Schlusskurs der vorherigen Kerze liegt unter dem EMA

Der Code:

#include <Trade\Trade.mqh>
CTrade trade;

//+------------------------------------------------------------------+
input ENUM_TIMEFRAMES      inp_Timeframe        = PERIOD_CURRENT; // timeframe 
input ENUM_APPLIED_PRICE   inp_applied_price    =    PRICE_CLOSE; // type of price   
//+------------------------------------------------------------------+
//Input MACD
input int                  inp_fast_ema_period  =             12; // period of fast ema 
input int                  inp_slow_ema_period  =             26; // period of slow ema 
input int                  inp_signal_period    =              9; // period of signal
//INPUT EMA
input int                  inp_ema_period       =            200; // period of ema
input int                  inp_ema_shift        =              0; // ema shift
input ENUM_MA_METHOD       inp_ma_method        =       MODE_EMA; // ma mode
//+------------------------------------------------------------------+
//Price
MqlRates price[];

//MACD
int    haMACD;
double buMACD_Buffer[];
double buMACD_Signal[];
int    toCopy = 3;
int    precision = _Digits+1;

//EMA
int    haEMA;
double buEMA_buffer[];
//+------------------------------------------------------------------+
int OnInit()
{
   
   ArraySetAsSeries(price, true);
   
   haMACD=iMACD(_Symbol,inp_Timeframe,inp_fast_ema_period,inp_slow_ema_period,inp_signal_period,inp_applied_price);
   if(haMACD==INVALID_HANDLE)
   {
      Alert("*ERROR* creating iMACD handle");
      return(INIT_FAILED);
   }

   ArraySetAsSeries(buMACD_Buffer,true);
   ArraySetAsSeries(buMACD_Signal,true);
   
   haEMA = iMA(_Symbol, inp_Timeframe, inp_ema_period, inp_ema_shift, inp_ma_method, inp_applied_price);
   if(haEMA == INVALID_HANDLE)
   {
      Alert("*ERROR* creating iMA handle");
      return(INIT_FAILED);
   }

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
void OnTick()
{  
   CopyRates(Symbol(), Period(), 0, 20, price);
   
   if(CopyBuffer(haMACD,0,0,toCopy,buMACD_Buffer) != toCopy) return;
   if(CopyBuffer(haMACD,1,0,toCopy,buMACD_Signal) != toCopy) return;
   
   CopyBuffer(haEMA, 0, 0, 3, buEMA_buffer);
   
   Comment(buEMA_buffer[0]);
           
   //Signal
   if(PositionsTotal() < 1) {
      
      //Get the Bid price
      double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits);
   
      //Get the Ask price
      double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_ASK), _Digits);
      
      if(buMACD_Buffer[0] < 0 &&
         buMACD_Signal[0] < 0 &&
         buMACD_Buffer[0] > buMACD_Signal[0] && 
         buMACD_Buffer[1] <= buMACD_Signal[1] &&
         price[1].close > buEMA_buffer[1]) {
         
            trade.Buy(0.10, NULL, Ask, (Ask-150*_Point), (Ask+150*_Point), NULL);
            
      } else if(buMACD_Buffer[0] > 0 && 
                buMACD_Signal[0] > 0 && 
                buMACD_Buffer[0] < buMACD_Signal[0] && 
                buMACD_Buffer[1] >= buMACD_Signal[1] &&
                price[1].close < buEMA_buffer[1]) {
                
         trade.Sell(0.10, NULL, Bid, (Bid+150*_Point), (Bid-150*_Point), NULL);
      }  
   }
}

Achso und eins noch: Wenn ich nen geringen SL/TP einstelle, passiert es öfter, dass an einem Signal zum Beispiel 10 Trades geöffnet werden, kann man sowas verhindern?

Vielen Dank!

 

Ich schau mir das gerne heute Abend an, an einen zusätzlichen EMA hätte ich auch gedacht!

Tags über habe ich halt immer viele andere Dinge zu tun ;)

 
Otto Pauser:

Ich schau mir das gerne heute Abend an, an einen zusätzlichen EMA hätte ich auch gedacht!

Das freut mich zu hören :)

Wenn ich nen geringen SL/TP einstelle, passiert es öfter, dass an einem Signal zum Beispiel 10 Trades geöffnet werden, kann man sowas verhindern?

Dazu habe ich das gefunden: https://www.mql5.com/de/articles/2110

Da habe ich gesehen, dass du schon kommentiert hast (

1,) Wer soll das verstehen ?

2.) Wer progt seine EA schon so, aber

3.) ich habe verstanden.

     Dieser Artikel richtet sich an blutige Anfänger. Doch die werden nix damit anzufangen wissen, und quälen uns im Forum.

     @MetaQuotes: Bitte bringt doch endlich ein vernünftiges Tutorial heraus.

)

Nun du hattest Recht... hier bin ich um dich im Forum zu quälen.

Ich habe versucht das zu implementieren:

#property copyright "Copyright 2020, Marcus Kornmann"
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh>
CTrade trade;

//+------------------------------------------------------------------+
input ENUM_TIMEFRAMES      inp_Timeframe        = PERIOD_CURRENT; // timeframe 
input ENUM_APPLIED_PRICE   inp_applied_price    =    PRICE_CLOSE; // type of price   
//+------------------------------------------------------------------+
//Input MACD
input int                  inp_fast_ema_period  =             12; // period of fast ema 
input int                  inp_slow_ema_period  =             26; // period of slow ema 
input int                  inp_signal_period    =              9; // period of signal
//INPUT EMA
input int                  inp_ema_period       =            200; // period of ema
input int                  inp_ema_shift        =              0; // ema shift
input ENUM_MA_METHOD       inp_ma_method        =       MODE_EMA; // ma mode
//+------------------------------------------------------------------+
//Price
MqlRates price[];

//MACD
int    haMACD;
double buMACD_Buffer[];
double buMACD_Signal[];
int    toCopy = 3;
int    precision = _Digits+1;

//EMA
int    haEMA;
double buEMA_buffer[];

//--- Einfügen einer neuen Variablen (Wert in Sekunden für eine Kerze dieses Zeitrahmens, für М15 wäre es 60 sec. * 15 = 900 sec)
datetime Time_open = 60 * _Period;
//--- Einfügen einer neuen Variablen (Eröffnungszeitpunkt der Kerze des 1. Position)
datetime Time_bar = 0;
//+------------------------------------------------------------------+
int OnInit()
{
   
   ArraySetAsSeries(price, true);
   
   haMACD=iMACD(_Symbol,inp_Timeframe,inp_fast_ema_period,inp_slow_ema_period,inp_signal_period,inp_applied_price);
   if(haMACD==INVALID_HANDLE)
   {
      Alert("*ERROR* creating iMACD handle");
      return(INIT_FAILED);
   }

   ArraySetAsSeries(buMACD_Buffer,true);
   ArraySetAsSeries(buMACD_Signal,true);
   
   haEMA = iMA(_Symbol, inp_Timeframe, inp_ema_period, inp_ema_shift, inp_ma_method, inp_applied_price);
   if(haEMA == INVALID_HANDLE)
   {
      Alert("*ERROR* creating iMA handle");
      return(INIT_FAILED);
   }

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
void OnTick()
{  
   CopyRates(Symbol(), Period(), 0, 20, price);
   
   if(CopyBuffer(haMACD,0,0,toCopy,buMACD_Buffer) != toCopy) return;
   if(CopyBuffer(haMACD,1,0,toCopy,buMACD_Signal) != toCopy) return;
   
   CopyBuffer(haEMA, 0, 0, 3, buEMA_buffer);
   
   Comment(buEMA_buffer[0]);
           
   //Signal
   if(PositionsTotal() < 1) {
      
      //--- Einfügen einer neuen Zeile (entfernt das Verbot des Wiedereröffnung, wenn eine neue Kerze erscheint)
      if( (TimeCurrent() - Time_bar) > 60 * _Period ) Time_open = 60 * _Period; 
      
      //Get the Bid price
      double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits);
   
      //Get the Ask price
      double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_ASK), _Digits);
      
      if(buMACD_Buffer[0] < 0 &&
         buMACD_Signal[0] < 0 &&
         buMACD_Buffer[0] > buMACD_Signal[0] && 
         buMACD_Buffer[1] <= buMACD_Signal[1] &&
         price[1].close > buEMA_buffer[1] &&
         (TimeCurrent()-Time[0])<Time_open) {
         
            if(trade.Buy(0.10, NULL, Ask, (Ask-10*_Point), (Ask+15*_Point), NULL)) {
               Time_open = TimeCurrent()-Time[0]; //neue Zeile (speichert das Zeitintervall zwischen Kerzeneröffnung und Positionseröffnung)
               Time_bar = Time[0]; //neue Zeile (speichert den Eröffnungszeitpunkt der Kerze der ersten Position)
            }
            
      } else if(buMACD_Buffer[0] > 0 && 
                buMACD_Signal[0] > 0 && 
                buMACD_Buffer[0] < buMACD_Signal[0] && 
                buMACD_Buffer[1] >= buMACD_Signal[1] &&
                price[1].close < buEMA_buffer[1] &&
                (TimeCurrent()-Time[0])<Time_open) {
                
         if(trade.Sell(0.10, NULL, Bid, (Bid+10*_Point), (Bid-15*_Point), NULL);){
            Time_open = TimeCurrent()-Time[0]; //neue Zeile (speichert das Zeitintervall zwischen Kerzeneröffnung und Positionseröffnung)
            Time_bar = Time[0]; //neue Zeile (speichert den Eröffnungszeitpunkt der Kerze der ersten Position)
         }
      }  
   }
}

Allerdings verstehe ich nicht wo die im Beispiel dieses Time-Array hernehmen, wodurch das bei mir natürlich auch nicht funktioniert....

Schutz vor Falschauslöser bei Handelsroboter
Schutz vor Falschauslöser bei Handelsroboter
  • www.mql5.com
In diesem Artikel beschreiben wir Wege der Verbesserung der Stabilität eines Handelsroboters durch die Beseitigung von möglichen Mehrfachauslösungen (Geknatter) auf unterschiedliche Weise: beide verwenden die Ein- und Ausstiegsalgorithmen sowohl separat wie in Verbindung. Die Natur des Problems Das Problem von Falschauslösungen entsteht häufig...
 

Ich hab darin herumgefummelt, jetzt läuft es. Auf EURUSD dieses Jahr macht es sogar Gewinne(€558) bei einem drawdown von nur 1.12%!

Das mitTime_open bzw Time_bar durchschaue ich nicht ganz, ich würde das anders machen.

Zum Formatieren des Codes rate ich dir die Enstellung des Styler GNU. Jede schließende Klammer sitzt unter der zugehörigen öffnenden = old LISP style ;)

Du bist auf einem guten Weg!

#property copyright "Copyright 2020, Marcus Kornmann"
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh>
CTrade Trade;

//+------------------------------------------------------------------+
input group                "GENERAL"
input ENUM_TIMEFRAMES      inp_Timeframe        = PERIOD_CURRENT; // timeframe
input ENUM_APPLIED_PRICE   inp_applied_price    =    PRICE_CLOSE; // type of price
input group                "MONEY"
input double               inp_Lotsize          =           0.10; // Lotsize
input int                  inp_SL_points        =            245; // SL (points)
input int                  inp_TP_points        =            250; // TP (points)

//+------------------------------------------------------------------+
input group                "MACD"
input int                  inp_fast_ema_period  =             12; // period of fast ema
input int                  inp_slow_ema_period  =             26; // period of slow ema
input int                  inp_signal_period    =              9; // period of signal
input group                "MA"
input int                  inp_ema_period       =            200; // period of ema
input int                  inp_ema_shift        =              0; // ema shift
input ENUM_MA_METHOD       inp_ma_method        =       MODE_EMA; // ma mode
//+------------------------------------------------------------------+
//Price
MqlRates rates[];       // umbenannt von price -> rates

//MACD
int    haMACD;
double buMACD_Buffer[];
double buMACD_Signal[];
int    toCopy = 3;
int    precision = _Digits+1;

//EMA
int    haEMA;
double buEMA_buffer[];

//--- Einfügen einer neuen Variablen (Wert in Sekunden für eine Kerze dieses Zeitrahmens, für М15 wäre es 60 sec. * 15 = 900 sec)
datetime Time_open = 60 * _Period;
//--- Einfügen einer neuen Variablen (Eröffnungszeitpunkt der Kerze des 1. Position)
datetime Time_bar = 0;

double sl_distance;
double tp_distance;
//+------------------------------------------------------------------+
int OnInit()
{

   ArraySetAsSeries(rates, true);

   haMACD=iMACD(_Symbol,inp_Timeframe,inp_fast_ema_period,inp_slow_ema_period,inp_signal_period,inp_applied_price);
   if(haMACD==INVALID_HANDLE)
      {
         Alert("*ERROR* creating iMACD handle");
         return(INIT_FAILED);
      }

   ArraySetAsSeries(buMACD_Buffer,true);
   ArraySetAsSeries(buMACD_Signal,true);

   haEMA = iMA(_Symbol, inp_Timeframe, inp_ema_period, inp_ema_shift, inp_ma_method, inp_applied_price);
   if(haEMA == INVALID_HANDLE)
      {
         Alert("*ERROR* creating iMA handle");
         return(INIT_FAILED);
      }

   sl_distance=inp_SL_points*_Point;
   tp_distance=inp_TP_points*_Point;

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
void OnTick()
{
   if(CopyRates(Symbol(),inp_Timeframe,0,toCopy,rates) != toCopy)
      return;
   if(CopyBuffer(haMACD,0,0,toCopy,buMACD_Buffer) != toCopy)
      return;
   if(CopyBuffer(haMACD,1,0,toCopy,buMACD_Signal) != toCopy)
      return;
   if(CopyBuffer(haEMA, 0,0,toCopy,buEMA_buffer) != toCopy)
      return;

   Comment(buEMA_buffer[0]);

//Signal
   if(PositionsTotal() < 1)
      {
         //--- Einfügen einer neuen Zeile (entfernt das Verbot des Wiedereröffnung, wenn eine neue Kerze erscheint)
         if( (TimeCurrent() - Time_bar) > 60 * _Period ) Time_open = 60 * _Period;

         double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_BID), _Digits);         //Get the Bid price
         double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol, SYMBOL_ASK), _Digits);         //Get the Ask price

         if(buMACD_Buffer[0] < 0 &&
               buMACD_Signal[0] < 0 &&
               buMACD_Buffer[0] > buMACD_Signal[0] &&
               buMACD_Buffer[1] <= buMACD_Signal[1] &&
               rates[1].close > buEMA_buffer[1] &&
               (TimeCurrent()-rates[0].time)<Time_open)
            {
               if(Trade.Buy(inp_Lotsize, NULL, Ask, (Ask-sl_distance), (Ask+tp_distance)))
                  {
                     Time_open = TimeCurrent()-rates[0].time;  // speichert das Zeitintervall zwischen Kerzeneröffnung und Positionseröffnung
                     Time_bar  = rates[0].time;                // speichert den Eröffnungszeitpunkt der Kerze der ersten Position
                  }

            }
         else if(buMACD_Buffer[0] > 0 &&
                 buMACD_Signal[0] > 0 &&
                 buMACD_Buffer[0] < buMACD_Signal[0] &&
                 buMACD_Buffer[1] >= buMACD_Signal[1] &&
                 rates[1].close < buEMA_buffer[1] &&
                 (TimeCurrent()-rates[0].time)<Time_open)
            {
               if(Trade.Sell(inp_Lotsize, NULL, Bid, (Bid+sl_distance), (Bid-tp_distance)))
                  {
                     Time_open = TimeCurrent()-rates[0].time;  // speichert das Zeitintervall zwischen Kerzeneröffnung und Positionseröffnung
                     Time_bar  = rates[0].time;                // speichert den Eröffnungszeitpunkt der Kerze der ersten Position
                  }
            }
      }
}
 
Otto Pauser:

Ich hab darin herumgefummelt, jetzt läuft es. Auf EURUSD dieses Jahr macht es sogar Gewinne(€558) bei einem drawdown von nur 1.12%!

Das mitTime_open bzw Time_bar durchschaue ich nicht ganz, ich würde das anders machen.

Zum Formatieren des Codes rate ich dir die Enstellung des Styler GNU. Jede schließende Klammer sitzt unter der zugehörigen öffnenden = old LISP style ;)

Du bist auf einem guten Weg!

Vielen vielen Dank!

Zu dem Time-Zeug: wenn ich mit engen SL bzw. TP arbeite, habe ich das Problem, dass an einer Kerze beispielsweise 10 Positionen geöffnet werden, also für ein Signal 10 Trades. Das soll aber nicht sein, pro Signal nur ein Trade. Als Lösung hatte ich das gefunden:

https://www.mql5.com/de/articles/2110 (Daher kommt das Time-Zeug) verstehe aber nicht ganz wie man das implementieren soll.

Schutz vor Falschauslöser bei Handelsroboter
Schutz vor Falschauslöser bei Handelsroboter
  • www.mql5.com
In diesem Artikel beschreiben wir Wege der Verbesserung der Stabilität eines Handelsroboters durch die Beseitigung von möglichen Mehrfachauslösungen (Geknatter) auf unterschiedliche Weise: beide verwenden die Ein- und Ausstiegsalgorithmen sowohl separat wie in Verbindung. Die Natur des Problems Das Problem von Falschauslösungen entsteht häufig...
 

Ihr wisst schon, dass der MT5 mit einem MACD-EA daher kommt?

Er befindet sich im Verzeichnis: ...\MQL5\Experts\Examples\MACD

Grund der Beschwerde: