Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

MTF-Bollingers fehlerhaft

Geschrieben

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

Featured Replies

Geschrieben

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...

Geschrieben
  • Autor

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.

Geschrieben

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

Geschrieben
  • Autor

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.

Geschrieben

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.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.