Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/metatrader-4/programmierung-mql4/)
-   -   Indikator mit BollingerBands (http://www.expert-advisor.com/forum/metatrader-4/programmierung-mql4/2111-indikator-mit-bollingerbands.html)

Biatsch 07.04.12 18:16

Indikator mit BollingerBands
 
Hi,
ich versuche mich gerade ein einem Indikator, der mir ein Pfeilsignal gibt, wenn der Kurs innerhalb der letzten 25 Perioden das untere Band geschnitten hat.
Alles soll im 4H_Chart geprüft werden.

Leider setzt was auch immer ich da programmiert habe einen Pfeil an jede einzelne Kerze.
Außerdem werden die Pfeile beim Entfernen des Indikators nicht gelöscht, was aber der Fall sein soll.

Wisst Ihr, wo der Fehler liegt ?

HTML-Code:

#property indicator_chart_window

#property indicator_buffers 3
#property indicator_color1 LightSeaGreen
#property indicator_color2 LightSeaGreen
#property indicator_color3 LightSeaGreen
//---- indicator parameters
extern int    BandsPeriod=34;
extern int    BandsShift=0;
extern double BandsDeviations=2.0;
//---- buffers
double MovingBuffer[];
double UpperBuffer[];
double LowerBuffer[];
int x=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                        |
//+------------------------------------------------------------------+
int deinit()
{
 for(int z=1;z<=x;z++)
      {
      ObjectDelete("BUY" + z);
      }
}

int init()
  {
//---- indicators
  SetIndexStyle(0,DRAW_LINE);
  SetIndexBuffer(0,MovingBuffer);
  SetIndexStyle(1,DRAW_LINE);
  SetIndexBuffer(1,UpperBuffer);
  SetIndexStyle(2,DRAW_LINE);
  SetIndexBuffer(2,LowerBuffer);
//----
  SetIndexDrawBegin(0,BandsPeriod+BandsShift);
  SetIndexDrawBegin(1,BandsPeriod+BandsShift);
  SetIndexDrawBegin(2,BandsPeriod+BandsShift);
//----
  return(0);
  }
//+------------------------------------------------------------------+
//| Bollinger Bands                                                  |
//+------------------------------------------------------------------+
int start()
  {
  int i,k,counted_bars=IndicatorCounted();
 
  i = Bars-counted_bars-1;
 
  while(i>
=0)
      {     
      MovingBuffer[i] = iMA  (NULL,240,BandsPeriod,BandsShift,MODE_SMA,MODE_CLOSE,i);
      UpperBuffer[i]  = iBands(NULL,240,BandsPeriod,BandsDeviations,0,PRICE_CLOSE,MODE_UPPER,i);
      LowerBuffer[i]  = iBands(NULL,240,BandsPeriod,BandsDeviations,0,PRICE_CLOSE,MODE_LOWER,i);
     
      double Min = Low[Lowest(NULL,240,MODE_LOW,25,i)];
      double MinLowerBand = ArrayMinimum(LowerBuffer,25,i);
     
        if(Min<MinLowerBand){
            x++;
            ObjectCreate("BUY" + x,OBJ_ARROW,0,Time[i],Low[i]);
            ObjectSet("BUY" + x,OBJPROP_COLOR,Red);
            ObjectSet("BUY" + x,OBJPROP_STYLE,SYMBOL_ARROWUP);
            ObjectSet("BUY" + x,OBJPROP_WIDTH,3);
            ObjectSet("BUY" + x,OBJPROP_BACK,true);
        }
     
      i--;
    }
//----
  return(0);
  }
//+------------------------------------------------------------------+


naranjoe 07.04.12 19:48

Hallo,

in deinem Code vergleichst du Äpfel mit Birnen.

Code:

double MinLowerBand = ArrayMinimum(LowerBuffer,25,i);
ArrayMinimum liefert dir ein INT mit der Position der entsprechenden Kerze.
Du musst also an der gefunden Position erst noch den Preis auslesen.

Bei
Code:

double Min = Low[Lowest(NULL,240,MODE_LOW,25,i)];
hast du das "i" vergessen, soll heissen iLowest !!!

Eigentlich hast du alles richtig gemacht, die Pfeile müssten auch
gelöscht werden, lt. deinem Code ist da alles O.K.


Gruß
naranjoe

Biatsch 08.04.12 13:01

Thx, ich habe den Code nun nachgebessert, aber das Resultat ist nicht das, das ich erhofft hatte.

Ich wollte, dass der Pfeil immer dann auftaucht, wenn der Kurs das untere Band innerhalb der letzten 25 Perioden im 4H_Chart unterschritten hat.

Dies trifft aber nicht zu.
Ich scheine also noch (mindestens) einen Denkfehler zu machen.

Ich habe mal ein Bild des Indikators hochgeladen.
Unter anderem dort, wo die Daumen sind hätten weitere Pfeile sein müssen.

PS: Dass der Indikator keinen Sinn macht ist mir bewusst. Es geht mir darum das Prinzip zu verstehen.

http://cdn02.trixum.de/upload2/32000...86e023bf1b.jpg

HTML-Code:

#property indicator_chart_window

#property indicator_buffers 3
#property indicator_color1 LightSeaGreen
#property indicator_color2 LightSeaGreen
#property indicator_color3 LightSeaGreen

extern int    BandsPeriod=34;
extern int    BandsShift=0;
extern double BandsDeviations=2.0;

double MovingBuffer[];
double UpperBuffer[];
double LowerBuffer[];
int x=0;
int MinPosition=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                        |
//+------------------------------------------------------------------+
int deinit()
{
 for(int z=1;z<=x;z++)
      {
      ObjectDelete("BUY" + z);
      }
}

int init()
  {
//---- indicators
  SetIndexStyle(0,DRAW_LINE);
  SetIndexBuffer(0,MovingBuffer);
  SetIndexStyle(1,DRAW_LINE);
  SetIndexBuffer(1,UpperBuffer);
  SetIndexStyle(2,DRAW_LINE);
  SetIndexBuffer(2,LowerBuffer);
//----
  SetIndexDrawBegin(0,BandsPeriod+BandsShift);
  SetIndexDrawBegin(1,BandsPeriod+BandsShift);
  SetIndexDrawBegin(2,BandsPeriod+BandsShift);
//----
  return(0);
  }
//+------------------------------------------------------------------+
//| Bollinger Bands                                                  |
//+------------------------------------------------------------------+
int start()
{
  int i,k,counted_bars=IndicatorCounted();

  i = Bars-counted_bars-1;

  while(i>
=0)
      {
      MovingBuffer[i] = iMA  (NULL,240,BandsPeriod,BandsShift,MODE_SMA,MODE_CLOSE,i);
      UpperBuffer[i]  = iBands(NULL,240,BandsPeriod,BandsDeviations,0,PRICE_CLOSE,MODE_UPPER,i);
      LowerBuffer[i]  = iBands(NULL,240,BandsPeriod,BandsDeviations,0,PRICE_CLOSE,MODE_LOWER,i);

      double Min = Low[iLowest(NULL,240,MODE_LOW,25,i)];
      int MinPosition = ArrayMinimum(LowerBuffer,25,i);
      double MinLowerBand = iBands(NULL,240,BandsPeriod,BandsDeviations,0,PRICE_CLOSE,MODE_LOWER,MinPosition); 

        if(Min<MinLowerBand){
            x++;
            ObjectCreate("BUY" + x,OBJ_ARROW,0,Time[i],Low[i]);
            ObjectSet("BUY" + x,OBJPROP_COLOR,Red);
            ObjectSet("BUY" + x,OBJPROP_STYLE,SYMBOL_ARROWUP);
            ObjectSet("BUY" + x,OBJPROP_WIDTH,3);
            ObjectSet("BUY" + x,OBJPROP_BACK,true);
        }

      i--;
    }
//----
  return(0);
}


Biatsch 08.04.12 14:10

Ich habe außerdem noch eine Frage zur Zeile:

int MinPosition = ArrayMinimum(LowerBuffer,25,i);

Wenn das Minimum z.B. 25 Perioden von der aktuellen Position entfernt ist und i=100 ist; welchen Wert hat dann MinPosition ? 125 oder 25 ?

naranjoe 08.04.12 14:33

Zitat:

Zitat von Biatsch (Beitrag 12346)
Ich habe außerdem noch eine Frage zur Zeile:

int MinPosition = ArrayMinimum(LowerBuffer,25,i);

Wenn das Minimum z.B. 25 Perioden von der aktuellen Position entfernt ist und i=100 ist; welchen Wert hat dann MinPosition ? 125 oder 25 ?

Die 25 Perioden werden immer von der aktuellen Pos., also i berechnet.
wenn i=100 dann ist die Pos. 125.

Gruß
narnajoe

Biatsch 08.04.12 14:57

Und wie schaut es mit meinem Code aus ?
Hast du dafür eine Lösung ?

naranjoe 08.04.12 15:31

Zitat:

Thx, ich habe den Code nun nachgebessert, aber das Resultat ist nicht das, das ich erhofft hatte.

Ich wollte, dass der Pfeil immer dann auftaucht, wenn der Kurs das untere Band innerhalb der letzten 25 Perioden im 4H_Chart unterschritten hat.

Dies trifft aber nicht zu.
Ich scheine also noch (mindestens) einen Denkfehler zu machen.
Ich vermute mal, das der Fehler darin liegt, dass du eine Pos. in den letzten 25 Kerzen markieren möchtest ausgehend von i.
Eigentlich überflüssing da deine Schleife die Pos. schon passiert hat.
Versuch das ganze doch mal ohne die letzten 25 Positionen auszuwerten und
nur mit der aktuellen Position zu arbeiten.

Gruß
naranjoe

Biatsch 08.04.12 17:53

Ich meinte es schon so, wie ich es beschrieben habe.
Wenn der Kurs einmal unterhalb des unteren Bandes liegt, sollen alle folgenden 25 Kerzen einen Pfeil bekommen.
Links vom ersten Daumen wurde das untere Band unterschritten, also hätten die nächsten 25 Kerzen ebenfalls rote Pfeile bekommen sollen.

naranjoe 08.04.12 17:54

Nochwas,

MinPosition suchst du mit ArrayMinimum.
Bei dem Buffer den du durchsuchst sind die Elemente allerdings von links
nach rechts ablgelegt. Du müsstest also ein ArraySetAsSeries
auf LowerBuffer anwenden. Das ist allerdings nicht möglich da ja der
Indikator von links nach rechts arbeitet.
Mein Vorschlag:
Du suchst die Position wie bei Min mit iLowest.

Code:

MinPosition = iLowest(NULL,240,MODE_LOW,25,i);
Gruß
naranjoe

Biatsch 09.04.12 18:45

Nun hätte ich eine Frage zum folgenden Indikator:
Ich habe das Problem, dass die grüne Linie nicht angezeigt wird, wenn ich den Indikator anlege.
Ich muss ihm immer erst kompilieren, damit die Linie sichtbar wird.

HTML-Code:

#property indicator_separate_window

#property indicator_buffers 2
#property indicator_color1 Yellow
#property indicator_width1 2
#property indicator_color2 Green
#property indicator_width2 2

extern int BBPeriod        = 34;
extern int StdDeviation    = 2;
extern int MAPeriod        = 23;

double BLGBuffer[];
double MABuffer[];

int init() {
    string short_name;
   
    SetIndexStyle(0,DRAW_LINE);
    SetIndexBuffer(0,BLGBuffer);
    SetIndexStyle(1,DRAW_LINE);
    SetIndexBuffer(1,MABuffer);

    return(0);
}


int start() {

    int i = Bars - IndicatorCounted() - 1;
   
    while(i>=0){
   
        double dUpperBand = iBands(NULL,0,BBPeriod,StdDeviation,0,PRICE_CLOSE,MODE_UPPER,i);
        double dLowerBand = iBands(NULL,0,BBPeriod,StdDeviation,0,PRICE_CLOSE,MODE_LOWER,i);
           
        BLGBuffer[i] = dUpperBand - dLowerBand;
       
        MABuffer[i]  = iMAOnArray(BLGBuffer,0,MAPeriod,0,MODE_SMA,i);
    i--;
    }

    return(0);
}



Alle Zeitangaben in WEZ +2. Es ist jetzt 00:53 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2018 vbdesigns.de
Copyright ©2009 - 2017 by Expert-Advisor.com - Das Metatrader Forum