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.
- Wir können hier Deutsch sprechen :)
- Für MQL4 oder MQL5?
- 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!
- Wir können hier Deutsch sprechen :)
- Für MQL4 oder MQL5?
- 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 |
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?
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 |
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!
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 ;)
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....

- www.mql5.com
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 } } } }
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.

- www.mql5.com

- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
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.