|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
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);
}
//+------------------------------------------------------------------+
|
|
|||
Hallo,
in deinem Code vergleichst du Äpfel mit Birnen. Code:
double MinLowerBand = ArrayMinimum(LowerBuffer,25,i); Du musst also an der gefunden Position erst noch den Preis auslesen. Bei Code:
double Min = Low[Lowest(NULL,240,MODE_LOW,25,i)]; Eigentlich hast du alles richtig gemacht, die Pfeile müssten auch gelöscht werden, lt. deinem Code ist da alles O.K. Gruß naranjoe |
|
|||
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. 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);
}
|
|
|||
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 ? |
|
|||
Zitat:
wenn i=100 dann ist die Pos. 125. Gruß narnajoe |
|
|||
Und wie schaut es mit meinem Code aus ?
Hast du dafür eine Lösung ? |
|
|||
Zitat:
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 |
|
|||
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. |
|
|||
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); naranjoe |
|
|||
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); } |
Lesezeichen |
Stichworte |
bollinger bands, bollinger bänder, bollingerbands, bollingerbänder, indikator, mql4, programmierung metatrader |
|
|