Problem mit iCustom und Extreme_TMA_line_indicator - Seite 2 123 Neuer Kommentar Paul_K 2019.11.19 19:50 #11 Carl Schreiber: Na, dann fang doch mal an zu experimentieren. InpRedraw wird doch nur einmal im Code verwendet: Also, da der Debugger mit historischen Daten (Strg+F5) über den Tester läuft setzt da mal einen Debugger halt und kontrolliere den Wert und den Weg! Du kannst aber auch die Variable ändern: von auf Probier es einfach... Danke für die Hinweise, dass mit dem input bool InpRedraw = true; // true=Redraw false:no hatte ich auch schon ausprobiert, aber ohne Erfolg. Hab auch im Indikator-Code die ganze enum und InpRedraw Geschichte rausgeschmissen, der Indikator funktionierte sogar noch :) da war ich richtig glücklich, weil ich erst seit einem Jahr dabei bin, aber es hat alles nichts geholfen. Bin hinundhergerisssen, ob es an der iCustom Parameterübergabe liegt oder am Indi-Code... aber das ergibt keinen Sinn, weil der Indikator in Realtime einwandfrei funktioniert... Scalping. Tick Chart auf Preismuster (Gartley, Schmetterling, Fledermaus,...) Zeichnung der H_Linie auf Carl Schreiber 2019.11.19 20:12 #12 Kann es daran liegen dass der Tester bezüglich der Parameter 'seinen eigenen Kopf' hat? Druck doch mal in beiden OnInit()s aus, welchen Wert der Parameter hat. Otto Pauser 2019.11.19 21:07 #13 Bei mir steht der Indikator 'Extreme_TMA_line_indicator.mq5' mehrfach herum. Einmal im Ordner MQL5\Indicators und im Ordner MQL5\Indicators\Examples. Prüf mal nach ob der bei dir auch mehrfach herumsteht. Da hat der EA bei mir den falschen Indi 'erwischt'. Jetzt geht's. Indikatoren: NRTR_ATR_STOP_HTF Großartiger EA im Backtest! Expert Advisors: EA Trix Paul_K 2019.11.19 21:36 #14 Otto Pauser: Jetzt habe ich das Problem begriffen. Der letzte Inputparameter wird einfach nicht an den Indi weitergegeben. Lass den letzten Parameter (inpRedraw) einfach weg, dann sollte der Indi die Standardeinstellung nehmen. Im Prinzip könntest du alle weglassen, kannst aber dann nix mehr optiomieren. Wenn du das in die OnInit() einfügst siehst du den Indi im Chart. (nicht nur im Tester). so mache ich es meistens, ohne Parameter, weil ich die Standardeinstellung bevorzuge, aber das verrückte ist, dass es nicht funktioniert, er liefert immer die "No" Einstellung (rote Linien). ich habe schon viele iCustoms implementiert, aber so ein Problem hatte ich noch nie... FOREX - Trends, Prognosen Pivot-Indikatoren FOREX - Trends, Prognosen Otto Pauser 2019.11.19 21:44 #15 Paul_K: so mache ich es meistens, ohne Parameter, weil ich die Standardeinstellung bevorzuge, aber das verrückte ist, dass es nicht funktioniert, er liefert immer die "No" Einstellung (rote Linien). ich habe schon viele iCustoms implementiert, aber so ein Problem hatte ich noch nie... Das ist auch mir ein Rätsel- Ich hab den Indi umgebaut. Die Colorline herausgenommen und auch die letzten 2 parameter. Bei mir läuft er. Versuche den mal. Ich hab die (alte) statische definition auf dynamisch (flexibler) umgestellt. //+------------------------------------------------------------------+ //| Extreme_TMA_line_indicator.mq5 | //| Copyright 2018, MetaQuotes Software Corp. | //| https://mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2018, MetaQuotes Software Corp." #property link "https://mql5.com" #property version "1.00" #property description "Extreme TMA Line indicator" #property indicator_chart_window #property indicator_buffers 4 #property indicator_plots 3 //--- input parameters input uint InpPeriodTMA = 56; // TMA period input uint InpPeriodATR = 100; // ATR period input double InpMultiplierATR = 2.0; // ATR multiplier //--- indicator buffers double BufferTMA[]; double BufferTop[]; double BufferBottom[]; double BufferATR[]; //--- global variables double multiplier; double threshold; int period_tma; int period_atr; int period_max; int handle_atr; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- set global variables period_tma=int(InpPeriodTMA<1 ? 1 : InpPeriodTMA); period_atr=int(InpPeriodATR<1 ? 1 : InpPeriodATR); period_max=fmax(period_atr,period_tma); multiplier=InpMultiplierATR; //--- indicator buffers mapping SetIndexBuffer(0,BufferTMA,INDICATOR_DATA); SetIndexBuffer(1,BufferTop,INDICATOR_DATA); SetIndexBuffer(2,BufferBottom,INDICATOR_DATA); SetIndexBuffer(3,BufferATR,INDICATOR_CALCULATIONS); PlotIndexSetString(0,PLOT_LABEL,"TMA"); PlotIndexSetString(1,PLOT_LABEL,"Top"); PlotIndexSetString(2,PLOT_LABEL,"Low"); PlotIndexSetString(3,PLOT_LABEL,"ATR"); PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE); PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE); PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_LINE); PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2); PlotIndexSetInteger(1,PLOT_LINE_WIDTH,1); PlotIndexSetInteger(2,PLOT_LINE_WIDTH,1); PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrGreen); PlotIndexSetInteger(1,PLOT_LINE_COLOR,clrDarkGray); PlotIndexSetInteger(2,PLOT_LINE_COLOR,clrDarkGray); //--- setting indicator parameters IndicatorSetString(INDICATOR_SHORTNAME,"Extreme TMA Line ("+(string)period_tma+","+(string)period_atr+","+DoubleToString(multiplier,1)+","+DoubleToString(threshold,2)+")"); IndicatorSetInteger(INDICATOR_DIGITS,Digits()); //--- setting buffer arrays as timeseries ArraySetAsSeries(BufferTMA,true); ArraySetAsSeries(BufferTop,true); ArraySetAsSeries(BufferBottom,true); ArraySetAsSeries(BufferATR,true); //--- create handles handle_atr=iATR(NULL,PERIOD_CURRENT,period_atr); if(handle_atr==INVALID_HANDLE) { Print("The iATR(",(string)period_atr,") object was not created: Error ",GetLastError()); return INIT_FAILED; } return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- Установка массивов буферов как таймсерий ArraySetAsSeries(close,true); //--- Проверка и расчёт количества просчитываемых баров if(rates_total<fmax(period_max,4)) return 0; //--- Проверка и расчёт количества просчитываемых баров int limit=rates_total-prev_calculated; if(limit>1) { limit=rates_total-period_max-2; ArrayInitialize(BufferTMA,EMPTY_VALUE); ArrayInitialize(BufferTop,EMPTY_VALUE); ArrayInitialize(BufferBottom,EMPTY_VALUE); ArrayInitialize(BufferATR,0); } //--- Подготовка данных int count=(limit>1 ? rates_total : 1); int copied=CopyBuffer(handle_atr,0,0,count,BufferATR); if(copied!=count) return 0; //--- Расчёт индикатора for(int i=limit; i>=0 && !IsStopped(); i--) { int tcount=period_tma; bool period_last=(i==0 ? true : false); while(tcount>0) { tcount=(!period_last ? 0 : tcount-1); double sum=0; double sumw=(period_tma+2)*(period_tma+1)/2; for(int j=0; j<=period_tma; j++) { sum+=(period_tma-j+1)*close[i+j]; if(i-j>0) { sum+=(period_tma-j+1)*close[i-j]; sumw+=(period_tma-j+1); } } if(sumw!=0) { BufferTMA[i]=sum/sumw; } } } //--- Канал и Цвет for(int i=limit; i>=0 && !IsStopped(); i--) { double range=BufferATR[i]*multiplier; BufferTop[i]=BufferTMA[i]+range; BufferBottom[i]=BufferTMA[i]-range; } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ Diskussion zum Artikel "Der Moving Average im Strategietester Von der Theorie zur Paul_K 2019.11.20 10:52 #16 Otto Pauser: Das ist auch mir ein Rätsel- Ich hab den Indi umgebaut. Die Colorline herausgenommen und auch die letzten 2 parameter. Bei mir läuft er. Versuche den mal. Ich hab die (alte) statische definition auf dynamisch (flexibler) umgestellt. Krass :) tausendfachen Dank das du dir die Mühe gemacht hast. ich kann es kaum glauben, hast was gut bei mir. Werde ihn heute Abend gleich mal ausprobieren... fühlt sich an wie Weihnachten, kann es kaum abwarten :) Vielen, vielen Dank!!! HILFE Function not defined [WARNUNG GESCHLOSSEN!] Alle Fragen Merkmale der Sprache mql5, Paul_K 2019.11.21 17:25 #17 Otto Pauser: Das ist auch mir ein Rätsel- Ich hab den Indi umgebaut. Die Colorline herausgenommen und auch die letzten 2 parameter. Bei mir läuft er. Versuche den mal. Ich hab die (alte) statische definition auf dynamisch (flexibler) umgestellt. Ich habe deinen Indikator eingebaut und sogar MT5 neu installiert, aber das Ergebnis hat sich leider nicht verändert... Auf dem Bild habe ich einen Ausschnitt vom Ergebnis, könntest du bitte den Tag mal bei dir durchlaufen lassen, um zu gucken, ob es da Unterschiede gibt... #include<Trade\Trade.mqh> CTrade trade; //+------------------------------------------------------------------+ //| input parameters | //+------------------------------------------------------------------+ input uint InpPeriodTMA = 56; // TMA period input uint InpPeriodATR = 100; // ATR period input double InpMultiplierATR = 2.0; // ATR multiplier input double InpThreshold = 0.5; // Trend threshold //+------------------------------------------------------------------+ //| global definitions | //+------------------------------------------------------------------+ double Bid; double Ask; double Balance = 0; // Bruttokontostand double Equity = 0; // Nettokontostand input double sto = 200; input double tpo = 200; int haTMA; double buTmaMid[], buTmaTop[], buTmaBot[]; int toCopy=3; double myTmaMid_0, myTmaTop_0, myTmaBot_0; //+------------------------------------------------------------------+ //| Expert initialization function | ,InpPeriodTMA,InpPeriodATR,InpMultiplierATR,InpThreshold,InpRedraw //+------------------------------------------------------------------+ int OnInit() { haTMA=iCustom(_Symbol,_Period,"Examples\\Extreme_TMA_line_indicator1"); if(haTMA==INVALID_HANDLE) { Alert("*ERROR* Invalid TMA handle"); return(INIT_FAILED); } ArraySetAsSeries(buTmaMid,true); ArraySetAsSeries(buTmaTop,true); ArraySetAsSeries(buTmaBot,true); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { Comment(""); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { Balance=AccountInfoDouble(ACCOUNT_BALANCE); Equity=AccountInfoDouble(ACCOUNT_EQUITY); Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); MqlRates PreisInfo[]; ArraySetAsSeries(PreisInfo,true); CopyRates(Symbol(),Period(),0,3,PreisInfo); double Kurs_0 = PreisInfo[0].close; double Kurs_1 = PreisInfo[1].close; if(CopyBuffer(haTMA,0,0,toCopy,buTmaMid)!=toCopy) return; if(CopyBuffer(haTMA,1,0,toCopy,buTmaTop)!=toCopy) return; if(CopyBuffer(haTMA,2,0,toCopy,buTmaBot)!=toCopy) return; myTmaMid_0 = buTmaMid[0]; myTmaTop_0 = buTmaTop[0]; myTmaBot_0 = buTmaBot[0]; if(PositionsTotal()==0){ if(Kurs_0 > myTmaTop_0){ // trade.Buy(0.1,NULL,Ask,(Ask-sto*_Point),(Ask+tpo*_Point),NULL); trade.Sell(0.1,NULL,Bid,(Bid+sto*_Point),(Bid-tpo*_Point),NULL); Print("kurs_0: " + DoubleToString(Bid)+ "\nmyTmaTop_0: "+DoubleToString(myTmaTop_0,_Digits)+ "\nmyTmaBot_0: "+DoubleToString(myTmaBot_0,_Digits)+ "\nmyTmaMid_0: "+DoubleToString(myTmaMid_0,_Digits) ); } } } //+------------------------------------------------------------------+ //| Utilities | //+------------------------------------------------------------------+ bool IsNewBar(void) // returns true if new candle was born { static datetime oldTime=WRONG_VALUE; datetime barTime=iTime(_Symbol,_Period,0); if(oldTime==WRONG_VALUE) oldTime=barTime; if(barTime==oldTime) return(false); else oldTime=barTime; return(true); } Dateien: ergebnis.JPG 295 kb [Archiv] Lernen Sie, wie Wünsche für MQL5 Fragen von einem "Dummy" Paul_K 2019.11.21 17:48 #18 Carl Schreiber: Kann es daran liegen dass der Tester bezüglich der Parameter 'seinen eigenen Kopf' hat? Druck doch mal in beiden OnInit()s aus, welchen Wert der Parameter hat. Carl Schreiber: Kann es daran liegen dass der Tester bezüglich der Parameter 'seinen eigenen Kopf' hat? Druck doch mal in beiden OnInit()s aus, welchen Wert der Parameter hat. Das glaube ich auch langsam, das mein Tester sein eigenes Ding durchzieht... Ich hab mir das IndikatorHandle ausgeben lassen, da kam ne 10.0000000 raus bei den Arrays habe ich nur Fehlermeldungen erhalten, keine Ahnung wie das in der Oninit() gehen soll... Interessant und humorvoll [Archiv] Lernen Sie, wie Wer hat schon das Otto Pauser 2019.11.21 17:51 #19 Paul_K: Ich habe deinen Indikator eingebaut und sogar MT5 neu installiert, aber das Ergebnis hat sich leider nicht verändert... Auf dem Bild habe ich einen Ausschnitt vom Ergebnis, könntest du bitte den Tag mal bei dir durchlaufen lassen, um zu gucken, ob es da Unterschiede gibt... Ich schau mir das noch heute, etwas später, an. Paul_K 2019.11.21 19:27 #20 Otto Pauser: Ich schau mir das noch heute, etwas später, an. danke, mach dir aber keinen Streß... PS Ich habe vergessen die IsNewBar() einzubauen, aber das ändert am Ergebnis ja nichts 123 Neuer Kommentar
Na, dann fang doch mal an zu experimentieren.
InpRedraw wird doch nur einmal im Code verwendet:
Also, da der Debugger mit historischen Daten (Strg+F5) über den Tester läuft setzt da mal einen Debugger halt und kontrolliere den Wert und den Weg!
Du kannst aber auch die Variable ändern:
von
auf
Probier es einfach...
Danke für die Hinweise, dass mit dem
hatte ich auch schon ausprobiert, aber ohne Erfolg.
Hab auch im Indikator-Code die ganze enum und InpRedraw Geschichte rausgeschmissen,
der Indikator funktionierte sogar noch :) da war ich richtig glücklich, weil ich erst seit einem Jahr dabei bin, aber
es hat alles nichts geholfen. Bin hinundhergerisssen, ob es an der iCustom Parameterübergabe liegt oder
am Indi-Code... aber das ergibt keinen Sinn, weil der Indikator in Realtime einwandfrei funktioniert...
Kann es daran liegen dass der Tester bezüglich der Parameter 'seinen eigenen Kopf' hat?
Druck doch mal in beiden OnInit()s aus, welchen Wert der Parameter hat.
Bei mir steht der Indikator 'Extreme_TMA_line_indicator.mq5' mehrfach herum.
Einmal im Ordner MQL5\Indicators und im Ordner MQL5\Indicators\Examples. Prüf mal nach ob der bei dir auch mehrfach herumsteht.
Da hat der EA bei mir den falschen Indi 'erwischt'.
Jetzt geht's.
Jetzt habe ich das Problem begriffen. Der letzte Inputparameter wird einfach nicht an den Indi weitergegeben.
Lass den letzten Parameter (inpRedraw) einfach weg, dann sollte der Indi die Standardeinstellung nehmen.
Im Prinzip könntest du alle weglassen, kannst aber dann nix mehr optiomieren.
Wenn du das in die OnInit() einfügst siehst du den Indi im Chart. (nicht nur im Tester).
so mache ich es meistens, ohne Parameter, weil ich die Standardeinstellung bevorzuge,
aber das verrückte ist, dass es nicht funktioniert, er liefert immer die "No" Einstellung (rote Linien).
ich habe schon viele iCustoms implementiert, aber so ein Problem hatte ich noch nie...
so mache ich es meistens, ohne Parameter, weil ich die Standardeinstellung bevorzuge,
aber das verrückte ist, dass es nicht funktioniert, er liefert immer die "No" Einstellung (rote Linien).
ich habe schon viele iCustoms implementiert, aber so ein Problem hatte ich noch nie...
Das ist auch mir ein Rätsel- Ich hab den Indi umgebaut. Die Colorline herausgenommen und auch die letzten 2 parameter. Bei mir läuft er.
Versuche den mal. Ich hab die (alte) statische definition auf dynamisch (flexibler) umgestellt.
Das ist auch mir ein Rätsel- Ich hab den Indi umgebaut. Die Colorline herausgenommen und auch die letzten 2 parameter. Bei mir läuft er.
Versuche den mal. Ich hab die (alte) statische definition auf dynamisch (flexibler) umgestellt.
Krass :) tausendfachen Dank das du dir die Mühe gemacht hast.
ich kann es kaum glauben, hast was gut bei mir.
Werde ihn heute Abend gleich mal ausprobieren... fühlt sich an wie Weihnachten, kann es kaum abwarten :)
Vielen, vielen Dank!!!
Das ist auch mir ein Rätsel- Ich hab den Indi umgebaut. Die Colorline herausgenommen und auch die letzten 2 parameter. Bei mir läuft er.
Versuche den mal. Ich hab die (alte) statische definition auf dynamisch (flexibler) umgestellt.
Ich habe deinen Indikator eingebaut und sogar MT5 neu installiert, aber das Ergebnis hat sich leider nicht verändert...
Auf dem Bild habe ich einen Ausschnitt vom Ergebnis, könntest du bitte den Tag mal bei dir durchlaufen lassen, um
zu gucken, ob es da Unterschiede gibt...
Kann es daran liegen dass der Tester bezüglich der Parameter 'seinen eigenen Kopf' hat?
Druck doch mal in beiden OnInit()s aus, welchen Wert der Parameter hat.
Kann es daran liegen dass der Tester bezüglich der Parameter 'seinen eigenen Kopf' hat?
Druck doch mal in beiden OnInit()s aus, welchen Wert der Parameter hat.
Das glaube ich auch langsam, das mein Tester sein eigenes Ding durchzieht...
Ich hab mir das IndikatorHandle ausgeben lassen, da kam ne 10.0000000 raus
bei den Arrays habe ich nur Fehlermeldungen erhalten, keine Ahnung wie das in der Oninit() gehen soll...
Ich habe deinen Indikator eingebaut und sogar MT5 neu installiert, aber das Ergebnis hat sich leider nicht verändert...
Auf dem Bild habe ich einen Ausschnitt vom Ergebnis, könntest du bitte den Tag mal bei dir durchlaufen lassen, um
zu gucken, ob es da Unterschiede gibt...
Ich schau mir das noch heute, etwas später, an.
danke, mach dir aber keinen Streß...
PS Ich habe vergessen die IsNewBar() einzubauen, aber das ändert am Ergebnis ja nichts