Geschrieben 9. Januar 201016 Jr. comment_91653 Hallo, Ich habe mir folgenden Custom Indicator geschrieben.Allerdings gibt mir der Indicator falsche Werte zurück, aber ich verstehe nicht wieso... Eigentlich sollte es ja nichts grosses sein, 2 MAs zu berechnen und davon die Differenz auszugeben...Aber die berechneten MAs stimmen bei weitem nicht mit den angezeigten im Chart über ein. Vielleicht hat jemand jajemand Lust über die paar Zeilen drüber zu schauen und mich zu erleuchten. Vielen Dank,askerix #property indicator_separate_window #property indicator_buffers 3 #property indicator_color1 Navy #property indicator_color2 Navy #property indicator_color3 Red //---- input parameters extern int MAfast=20; extern int MAslow=100; extern string MAfastMode="MODE_EMA"; extern string MAslowMode="MODE_SMA"; extern string slowMAPrice="PRICE_CLOSE"; extern string fastMAPrice="PRICE_CLOSE"; //---- buffers double ExtMapBuffer1[]; double ExtMapBuffer2[]; double ExtMapBuffer3[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer3); SetIndexStyle(1,DRAW_NONE); SetIndexBuffer(1,ExtMapBuffer2); SetIndexStyle(2,DRAW_NONE); SetIndexBuffer(2,ExtMapBuffer1); IndicatorShortName("DiffMA - " +MAfast+ "/" +MAslow ); SetIndexLabel(2, "MAfast"); SetIndexLabel(1, "MAslow"); SetIndexLabel(0, "MAdiff"); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); int i; double dMAfast, dMAslow; //---- i = Bars - counted_bars; while (i>0) { dMAfast = iMA(Symbol(),NULL, MAfast, 0, MAfastMode, fastMAPrice,i); dMAslow = iMA(Symbol(),NULL, MAslow, 0, MAslowMode, slowMAPrice,i); ExtMapBuffer1[i] = dMAfast; ExtMapBuffer2[i] = dMAslow; ExtMapBuffer3[i] = MathAbs(NormalizeDouble( dMAfast - dMAslow,4)); i--; } //---- return(0); } Bearbeitet 9. Januar 201016 Jr. von askerix Melden
Geschrieben 9. Januar 201016 Jr. comment_91655 Servus, inwiefern falsche Werte? Liefert der Compiler irgendwelche Fehler beim compilieren? Melden
Geschrieben 9. Januar 201016 Jr. Autor comment_91658 Hi Mythos, nein keinerlei Fehler.Ich habe mal einen Screenshot angehängt.Die MAs sind gleich eingestellt 9EMA-Close und 40EMA-Close und trotzdem kommt es zu einer differenz von 3 Pips beim EMA40 - das kann kein Rundungsfehler mehr sein. Askerix edit noch ein 2. Screenshot mit extremeren Abweichungen Bearbeitet 9. Januar 201016 Jr. von askerix Melden
Geschrieben 9. Januar 201016 Jr. comment_91661 nein keinerlei Fehler.unglaublich (musste es selber testen ums zu glauben), das is dann mMn ein böser Bug vom Editor!Bei solchen problemen hilft oft ein Blick ins Journal bzw. Experten Log im Terminal dort wirst du in dem Fall folgende Zeilen lesen: ... invalid integer number as parameter 6 for iMA function Das Problem ist folgendes: die iMA Funktion erwartet als 5. und 6. Parameter ein Zahl als Identifier welchen Modus und welchen Preis sie verwenden soll. In MQL sind diese Identifier als Konstante definiert wodurch du im Sourcecode zB MODE_EMA schreiben kannst. Denn dieses "MODE_EMA" ersetzt der Compiler vor dem compilieren durch die entsprechende Zahl.Du hast jetzt aber Strings die du der Funktion übergibst, und mit der weiß sie verständlicherweise nix anzufangen. Welchen MA die Funktion dann berechnet ist leider nicht definiert, ich vermute einen SMA auf Close-Basis. Wenn du slow und fast auf gleiche Werte setzt hast du dann trotzdem Differenzen oder ist die Diff dann 0? Melden
Geschrieben 9. Januar 201016 Jr. comment_91663 Die MAs sind gleich eingestellt 9EMA-Close und 40EMA-Close und trotzdem kommt es zu einer differenz vonZeig bitte mal einen Screenshot von den Einstellungen. Im Standardquelltext nutzt Du nämlich einen SMA und einen EMA. Achte mal darauf, dass sowohl die Einstellungen im Indikator als auch die im Chart genutzten MAs gleich sind. Eventuell ist da ja noch irgendwo ein Unterschied. UpdateOkay, Mythos war mal wieder schneller, das mit dem String hatte ich nun noch gar nicht auf dem Plan - dennoch würde ich nochmal im Detail alles angucken . Melden
Geschrieben 9. Januar 201016 Jr. Autor comment_91665 Vielen Dank!!! Das erklärt die falschen Werte, werde es anpassen.Und gut dass ich den EA-Log Ordner jetzt auch kenne, musste gleich mal ein 1GB alte Logs löschen. Melden
Geschrieben 9. Januar 201016 Jr. comment_91666 Und gut dass ich den EA-Log Ordner jetzt auch kenne, musste gleich mal ein 1GB alte Logs löschen. *G* ist immer praktisch, ich meinte aber eigentlich direkt den Log im MetaTrader (ok, es sind die gleichen Einträge aber im MT sieht mans schneller als extra den Ordner aufzumachen) Okay, Mythos war mal wieder schneller Melden
Hallo,
Ich habe mir folgenden Custom Indicator geschrieben.
Allerdings gibt mir der Indicator falsche Werte zurück, aber ich verstehe nicht wieso...
Eigentlich sollte es ja nichts grosses sein, 2 MAs zu berechnen und davon die Differenz auszugeben...
Aber die berechneten MAs stimmen bei weitem nicht mit den angezeigten im Chart über ein.
Vielleicht hat jemand jajemand Lust über die paar Zeilen drüber zu schauen und mich zu erleuchten.
Vielen Dank,
askerix
#property indicator_separate_window #property indicator_buffers 3 #property indicator_color1 Navy #property indicator_color2 Navy #property indicator_color3 Red //---- input parameters extern int MAfast=20; extern int MAslow=100; extern string MAfastMode="MODE_EMA"; extern string MAslowMode="MODE_SMA"; extern string slowMAPrice="PRICE_CLOSE"; extern string fastMAPrice="PRICE_CLOSE"; //---- buffers double ExtMapBuffer1[]; double ExtMapBuffer2[]; double ExtMapBuffer3[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer3); SetIndexStyle(1,DRAW_NONE); SetIndexBuffer(1,ExtMapBuffer2); SetIndexStyle(2,DRAW_NONE); SetIndexBuffer(2,ExtMapBuffer1); IndicatorShortName("DiffMA - " +MAfast+ "/" +MAslow ); SetIndexLabel(2, "MAfast"); SetIndexLabel(1, "MAslow"); SetIndexLabel(0, "MAdiff"); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); int i; double dMAfast, dMAslow; //---- i = Bars - counted_bars; while (i>0) { dMAfast = iMA(Symbol(),NULL, MAfast, 0, MAfastMode, fastMAPrice,i); dMAslow = iMA(Symbol(),NULL, MAslow, 0, MAslowMode, slowMAPrice,i); ExtMapBuffer1[i] = dMAfast; ExtMapBuffer2[i] = dMAslow; ExtMapBuffer3[i] = MathAbs(NormalizeDouble( dMAfast - dMAslow,4)); i--; } //---- return(0); }Bearbeitet von askerix