Geschrieben 28. Januar 201115 Jr. comment_111060 Ich habe das Problem, dass der MTF-Bollinger auf 5M nicht exakt das ausgibt was auf dem 60M abgebildet wird. Kann mal jemand über den Code sehen, wo liegt da der Fehler? //+------------------------------------------------------------------+ //| MTF_BollinderBands.mq4 | //| Copyright © 2006, Keris2112 | //| | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Keris2112" #property link "http://www.forex-tsd.com" #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 LawnGreen #property indicator_color2 Yellow #property indicator_color3 Yellow //---- input parameters /************************************************************************* PERIOD_M1 1 PERIOD_M5 5 PERIOD_M15 15 PERIOD_M30 30 PERIOD_H1 60 PERIOD_H4 240 PERIOD_D1 1440 PERIOD_W1 10080 PERIOD_MN1 43200 You must use the numeric value of the timeframe that you want to use when you set the TimeFrame' value with the indicator inputs. --------------------------------------- PRICE_CLOSE 0 Close price. PRICE_OPEN 1 Open price. PRICE_HIGH 2 High price. PRICE_LOW 3 Low price. PRICE_MEDIAN 4 Median price, (high+low)/2. PRICE_TYPICAL 5 Typical price, (high+low+close)/3. PRICE_WEIGHTED 6 Weighted close price, (high+low+close+close)/4. You must use the numeric value of the Applied Price that you want to use when you set the 'applied_price' value with the indicator inputs. --------------------------------------- MODE_SMA 0 Simple moving average, MODE_EMA 1 Exponential moving average, MODE_SMMA 2 Smoothed moving average, MODE_LWMA 3 Linear weighted moving average. You must use the numeric value of the MA Method that you want to use when you set the 'ma_method' value with the indicator inputs. **************************************************************************/ extern int TimeFrame=0; extern int MAPeriod=3;// was 20 extern int BandsShift=0; extern int StdDev=2;//was 2 double ExtMapBuffer1[]; double ExtMapBuffer2[]; double ExtMapBuffer3[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { string short_name; //---- indicator line SetIndexBuffer(0,ExtMapBuffer1); SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(1,ExtMapBuffer2); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(2,ExtMapBuffer3); SetIndexStyle(2,DRAW_LINE); //---- name for DataWindow and indicator subwindow label switch(TimeFrame) { case 1 : string TimeFrameStr="Period_M1"; break; case 5 : TimeFrameStr="Period_M5"; break; case 15 : TimeFrameStr="Period_M15"; break; case 30 : TimeFrameStr="Period_M30"; break; case 60 : TimeFrameStr="Period_H1"; break; case 240 : TimeFrameStr="Period_H4"; break; case 1440 : TimeFrameStr="Period_D1"; break; case 10080 : TimeFrameStr="Period_W1"; break; case 43200 : TimeFrameStr="Period_MN1"; break; default : TimeFrameStr="Current Timeframe"; } IndicatorShortName(short_name+MAPeriod+") "+TimeFrameStr); } //---- return(0); //+------------------------------------------------------------------+ //| MTF Moving Average | //+------------------------------------------------------------------+ int start() { datetime TimeArray[]; int i,shift,limit,y=0,counted_bars=IndicatorCounted(); // Plot defined timeframe on to current timeframe ArrayCopySeries(TimeArray,MODE_TIME,Symbol(),TimeFrame); limit=Bars-counted_bars; for(i=0,y=0;i<limit;i++) { if (Time[i]<TimeArray[y]) y++; /*********************************************************** Add your main indicator loop below. You can reference an existing indicator with its iName or iCustom. Rule 1: Add extern inputs above for all neccesary values Rule 2: Use 'TimeFrame' for the indicator timeframe Rule 3: Use 'y' for the indicator's shift value **********************************************************/ ExtMapBuffer1[i]=iBands(NULL,TimeFrame,MAPeriod,StdDev,BandsShift,PRICE_CLOSE,MODE_MAIN,y); ExtMapBuffer2[i]=iBands(NULL,TimeFrame,MAPeriod,StdDev,BandsShift,PRICE_HIGH,MODE_UPPER,y); ExtMapBuffer3[i]=iBands(NULL,TimeFrame,MAPeriod,StdDev,BandsShift,PRICE_LOW,MODE_LOWER,y); } // return(0); } //+------------------------------------------------------------------+ Bearbeitet 28. Januar 201115 Jr. von whipsaw <quote> tag durch <code> tag ersetzt Melden
Geschrieben 28. Januar 201115 Jr. comment_111063 Hast du's mal mit kleiner-gleich versucht? for(i=0,y=0;i<=limit;i++) Generell haben die ganzen MTF-Indikatoren, die man so im Web findet alle das Problem, dass sie die Situation nicht berücksichtigen, wenn die Daten mal eine zeitlang wegbleiben, dass dann die kleinen Zeitrahmen schneller nachgeladen werden als die großen.In diesem konkreten Fall bedeutet das dann, dass die Funktion ArrayCopySeries den Fehler 4066 liefert und der Indikatorverlauf für den entsprechenden Zeitraum, in dem die Daten weg waren, eine flache Linie bleibt und nicht nachberechnet wird.Sauber wäre es, nach ArrayCopySeries über GetLastError abzufragen, ob ein Fehler 4066 auftrat und in einer Schleife die ArrayCopySeries()-Funktion so lange aufzurufen, bis sie keinen Fehler mehr zurückgibt.Aber das nur am Rande. Wenn du den Indikator immer neu lädtst, nachdem du mal Offline warst, wirst du das Problem garnicht bemerken... Melden
Geschrieben 28. Januar 201115 Jr. Autor comment_111072 Hast du's mal mit kleiner-gleich versucht? Du meinst: for(i=0,y=0;i[b]>[/b]=limit;i++) ? Wenn du den Indikator immer neu lädtst, nachdem du mal Offline warst, wirst du das Problem garnicht bemerken...Leider sind die Außenbänder trotz Neuladung weiterhin zu weit weg. Melden
Geschrieben 28. Januar 201115 Jr. Autor comment_111076 Nochmal im 1H, man siehts hierbei am deutlichsten. Melden
Geschrieben 28. Januar 201115 Jr. comment_111077 Du meinst: for(i=0,y=0;i>=limit;i++) ?Nein er meint es so wie er es geschrieben hat. Der Unterschied ist, das bei " Mir fällt jetzt kein direkter Fehler auf, deswegen ein paar Nachfragen (auch ein bissl für alle mitleser die Fragen die man sich bei solchen Fehlern stellen sollte):Es klingt als würd es normalerweise passen, nur teilweise nicht. Hast du die Werte überprüft, passen sie normalerweise oder "schauts nur richtig aus"?Sind die Werte bei den Fehlern nachvollziehbar (sprich sind es zB die Werte vom Vorbar, oder ganz seltsame)? Ist es reproduzierbar (also passts immer an der gleichen Stelle nicht? Gibt es ein "Muster" wann es nicht passt? (immer am Tagesbeginn etc.)Hast du schon versucht mit Debugoutput das Verhalten nachzuvollziehen (also wann welcher Bar berechnet/neuberechnet wird)?Ich würde zB mal i,y und die 3 Indikatorwerte ausgeben lassen, und dann nachschauen was passiert, vielleicht hilft das (ggf. auch noch Time und TimeArray[y]). hth Melden
Geschrieben 28. Januar 201115 Jr. Autor comment_111078 Die Bänder des MTF sind ständig außerhalb, da liegt das Problem. Hier muss an der grundsätzlichen Berechnung etwas nicht stimmen. Bin erst gerade dabei mir beizubringen wie Arrays funktionieren, von daher kann ich die Programmierlogik noch nicht nachvollziehen. Melden
Geschrieben 28. Januar 201115 Jr. comment_111088 Die Bänder des MTF sind ständig außerhalb, da liegt das Problem. Hier muss an der grundsätzlichen Berechnung etwas nicht stimmen.Das ist schon klar, das das nicht stimmt.Die äußeren BBs ergeben sich aus dem mittleren Band + Standardabweichung.Bei deinem Indikator dient als Basis für die äußeren Bänder aber nicht das Mittlere, das ja über den Close Kurs berechnet wird, sondern eine Berechnung über High- bzw. Low-Kurs.Ersetze das PRICE_HIGH und das PRICE_LOW durch PRICE_CLOSE, dann sollte es passen. Melden
Ich habe das Problem, dass der MTF-Bollinger auf 5M nicht exakt das ausgibt was auf dem 60M abgebildet wird. Kann mal jemand über den Code sehen, wo liegt da der Fehler?
//+------------------------------------------------------------------+ //| MTF_BollinderBands.mq4 | //| Copyright © 2006, Keris2112 | //| | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Keris2112" #property link "http://www.forex-tsd.com" #property indicator_chart_window #property indicator_buffers 3 #property indicator_color1 LawnGreen #property indicator_color2 Yellow #property indicator_color3 Yellow //---- input parameters /************************************************************************* PERIOD_M1 1 PERIOD_M5 5 PERIOD_M15 15 PERIOD_M30 30 PERIOD_H1 60 PERIOD_H4 240 PERIOD_D1 1440 PERIOD_W1 10080 PERIOD_MN1 43200 You must use the numeric value of the timeframe that you want to use when you set the TimeFrame' value with the indicator inputs. --------------------------------------- PRICE_CLOSE 0 Close price. PRICE_OPEN 1 Open price. PRICE_HIGH 2 High price. PRICE_LOW 3 Low price. PRICE_MEDIAN 4 Median price, (high+low)/2. PRICE_TYPICAL 5 Typical price, (high+low+close)/3. PRICE_WEIGHTED 6 Weighted close price, (high+low+close+close)/4. You must use the numeric value of the Applied Price that you want to use when you set the 'applied_price' value with the indicator inputs. --------------------------------------- MODE_SMA 0 Simple moving average, MODE_EMA 1 Exponential moving average, MODE_SMMA 2 Smoothed moving average, MODE_LWMA 3 Linear weighted moving average. You must use the numeric value of the MA Method that you want to use when you set the 'ma_method' value with the indicator inputs. **************************************************************************/ extern int TimeFrame=0; extern int MAPeriod=3;// was 20 extern int BandsShift=0; extern int StdDev=2;//was 2 double ExtMapBuffer1[]; double ExtMapBuffer2[]; double ExtMapBuffer3[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { string short_name; //---- indicator line SetIndexBuffer(0,ExtMapBuffer1); SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(1,ExtMapBuffer2); SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(2,ExtMapBuffer3); SetIndexStyle(2,DRAW_LINE); //---- name for DataWindow and indicator subwindow label switch(TimeFrame) { case 1 : string TimeFrameStr="Period_M1"; break; case 5 : TimeFrameStr="Period_M5"; break; case 15 : TimeFrameStr="Period_M15"; break; case 30 : TimeFrameStr="Period_M30"; break; case 60 : TimeFrameStr="Period_H1"; break; case 240 : TimeFrameStr="Period_H4"; break; case 1440 : TimeFrameStr="Period_D1"; break; case 10080 : TimeFrameStr="Period_W1"; break; case 43200 : TimeFrameStr="Period_MN1"; break; default : TimeFrameStr="Current Timeframe"; } IndicatorShortName(short_name+MAPeriod+") "+TimeFrameStr); } //---- return(0); //+------------------------------------------------------------------+ //| MTF Moving Average | //+------------------------------------------------------------------+ int start() { datetime TimeArray[]; int i,shift,limit,y=0,counted_bars=IndicatorCounted(); // Plot defined timeframe on to current timeframe ArrayCopySeries(TimeArray,MODE_TIME,Symbol(),TimeFrame); limit=Bars-counted_bars; for(i=0,y=0;i<limit;i++) { if (Time[i]<TimeArray[y]) y++; /*********************************************************** Add your main indicator loop below. You can reference an existing indicator with its iName or iCustom. Rule 1: Add extern inputs above for all neccesary values Rule 2: Use 'TimeFrame' for the indicator timeframe Rule 3: Use 'y' for the indicator's shift value **********************************************************/ ExtMapBuffer1[i]=iBands(NULL,TimeFrame,MAPeriod,StdDev,BandsShift,PRICE_CLOSE,MODE_MAIN,y); ExtMapBuffer2[i]=iBands(NULL,TimeFrame,MAPeriod,StdDev,BandsShift,PRICE_HIGH,MODE_UPPER,y); ExtMapBuffer3[i]=iBands(NULL,TimeFrame,MAPeriod,StdDev,BandsShift,PRICE_LOW,MODE_LOWER,y); } // return(0); } //+------------------------------------------------------------------+Bearbeitet von whipsaw
<quote> tag durch <code> tag ersetzt