Warum gibt es nur einen Grenzwert von 200 bar?
Guter Indikator... Gute Arbeit...
Der Indikator funktioniert nicht
Leider, ja. Es funktioniert nicht. 4 Kompilierungsfehler, und dumme noch dazu. Aber der Indikator ist interessant.
kann aufgrund von Fehlern nicht kompiliert werden
//Indikator interessant. Korrigierter Code
//+------------------------------------------------------------------+ //|iGDR_Fractal_Levels.mq5 | //| Copyright © 2008-2009, GreenDog, Russland | //|krot@inbox.ru | //+------------------------------------------------------------------+ //---- Indikator Urheberschaft #property copyright "Copyright © 2008-2009, GreenDog". //---- Link zur Website des Autors #property link "krot@inbox.ru" //---- Versionsnummer des Indikators #property version "1.00" //---- Anzeige im Hauptfenster zeichnen #property indicator_chart_window #property indicator_buffers 1 #property indicator_plots 1 //+----------------------------------------------+ Deklaration einer Aufzählung //|| //+----------------------------------------------+ enum FRACTAL_MODE { MODE_HIGH_LOW=0, // von extrema MODE_LOW, // nach Scheitelpunkt MODE_HIGH // durch Tröge }; //+----------------------------------------------+ Deklaration einer Aufzählung //|| //+----------------------------------------------+ enum FRACTAL_TYPE { TYPE1=0, // streng TYPE2 // nicht-strikt }; //+----------------------------------------------+ //|| Indikator-Eingabeparameter | //+----------------------------------------------+ input uint frNum_=2; // Anzahl der Balken des Fraktals, 2=Fraktal mit 5 Balken, 3=Fraktal mit 7 Balken usw. input FRACTAL_TYPE frType= TYPE2; // Art der Fraktaldefinition 0=streng, 1=nicht-streng input FRACTAL_MODE frMode =MODE_HIGH_LOW; // Modus input double dlt_=0.24; // Abweichung von der durchschnittlichen Balkenhöhe input uint sBars_=200; // Anzahl der Balken (max. 200) //---- input color BG1_Color = PaleGreen; // Hintergrundfarbe der ersten Ebenen input color TL1Color = Green; // Farbe der Zeilen der ersten Ebene input color BG2_Color = Yellow; // Hintergrundfarbe der zweiten Ebenen input color TL2Color = DarkOrange; // Farbe der Linien der zweiten Ebenen input color BG3_Color = Pink; // Hintergrundfarbe der dritten Ebenen input color TL3Color = Red; // Farbe der Linien der dritten Ebene //+----------------------------------------------+ uint lastBars=0; uint frNum,sBars; datetime lastTime=0; color BGColor[3],TLColor[3]; double aData[240][2],aRes[3][2]; //+------------------------------------------------------------------+ //| Benutzerdefinierte Initialisierungsfunktion für Indikatoren | //+------------------------------------------------------------------+ void OnInit() { //---- Initialisierung von Konstanten frNum=frNum_; if(frNum_<2) frNum=2; sBars=sBars_; if(sBars_>200) sBars=200; if(sBars_<10) sBars=10; BGColor[0]=BG1_Color; BGColor[1]=BG2_Color; BGColor[2]=BG3_Color; TLColor[0]=TL1Color; TLColor[1]=TL2Color; TLColor[2]=TL3Color; //---- } //+------------------------------------------------------------------+ //| Erstellen einer Textbeschriftung| //+------------------------------------------------------------------+ void CreateTextLabel(long chart_id, // Kennung der Karte string name, // Objektname int nwin, // Fensterindex datetime time1, // Zeit von 1 Preisstufe double price1, // 1 Preisniveau color Color, // Linienfarbe string text, // Text string font, // Schriftart int fontsize) // Schriftgröße { //---- ObjectCreate(chart_id,name,OBJ_TEXT,nwin,time1,price1); ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color); ObjectSetInteger(chart_id,name,OBJPROP_BACK,true); ObjectSetInteger(chart_id,name,OBJPROP_SELECTED,true); ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,true); ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,true); ObjectSetString(chart_id,name,OBJPROP_FONT,font); ObjectSetString(chart_id,name,OBJPROP_TEXT,text); ObjectSetInteger(chart_id,name,OBJPROP_FONTSIZE,fontsize); //---- } //+------------------------------------------------------------------+ //|| Zurücksetzen der Textbeschriftung| //+------------------------------------------------------------------+ void SetTextLabel(long chart_id, // Kennung der Karte string name, // Objektname int nwin, // Fensterindex datetime time1, // Zeit von 1 Preisstufe double price1, // 1 Preisniveau color Color, // Linienfarbe int style, // Linienstil int width, // Linienstärke string text, // Text string font, // Schriftart int fontsize) // Schriftgröße { //---- if(ObjectFind(chart_id,name)==-1) { CreateTextLabel(chart_id,name,nwin,time1,price1,Color,text,font,fontsize); } else { ObjectSetString(chart_id,name,OBJPROP_TEXT,text); ObjectMove(chart_id,name,0,time1,price1); ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color); } //---- } //+------------------------------------------------------------------+ //| Erstellen eines Kanals| //+------------------------------------------------------------------+ void CreateChannel(long chart_id, // Kennung der Karte string name, // Objektname int nwin, // Fensterindex datetime time1, // Zeit von 1 Preisstufe double price1, // 1 Preisniveau datetime time2, // Zeitpunkt des Preisniveaus 2 double price2, // 2 Preisniveau datetime time3, // Zeitpunkt des Preisniveaus 3 double price3, // 3 Preisniveau color Color, // Linienfarbe int style, // Linienstil int width, // Linienstärke string text) // Text { //---- ObjectCreate(chart_id,name,OBJ_CHANNEL,nwin,time1,price1,time2,price2); ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color); ObjectSetInteger(chart_id,name,OBJPROP_STYLE,style); ObjectSetInteger(chart_id,name,OBJPROP_WIDTH,width); ObjectSetString(chart_id,name,OBJPROP_TEXT,text); ObjectSetInteger(chart_id,name,OBJPROP_FILL,true); ObjectSetInteger(chart_id,name,OBJPROP_BACK,true); ObjectSetInteger(chart_id,name,OBJPROP_RAY_RIGHT,true); ObjectSetInteger(chart_id,name,OBJPROP_RAY,true); ObjectSetInteger(chart_id,name,OBJPROP_SELECTED,true); ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,true); ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,true); //---- } //+------------------------------------------------------------------+ //|| Neuinstallation des Kanals| //+------------------------------------------------------------------+ void SetChannel(long chart_id, // Kennung der Karte string name, // Objektname int nwin, // Fensterindex datetime time1, // Zeit von 1 Preisstufe double price1, // 1 Preisniveau datetime time2, // Zeitpunkt des Preisniveaus 2 double price2, // 2 Preisniveau datetime time3, // Zeitpunkt des Preisniveaus 3 double price3, // 3 Preisniveau color Color, // Linienfarbe int style, // Linienstil int width, // Linienstärke string text) // Text { //---- if(ObjectFind(chart_id,name)==-1) { CreateChannel(chart_id,name,nwin,time1,price1,time2,price2,time3,price3,Color,style,width,text); } else { ObjectSetString(chart_id,name,OBJPROP_TEXT,text); ObjectMove(chart_id,name,0,time1,price1); ObjectMove(chart_id,name,1,time2,price2); ObjectMove(chart_id,name,2,time3,price3); ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color); } //---- } //+------------------------------------------------------------------+ //| Erstellen einer Trendlinie| //+------------------------------------------------------------------+ void CreateTline(long chart_id, // Kennung der Karte string name, // Objektname int nwin, // Fensterindex datetime time1, // Zeit von 1 Preisstufe double price1, // 1 Preisniveau datetime time2, // Zeitpunkt des Preisniveaus 2 double price2, // 2 Preisniveau color Color, // Linienfarbe int style, // Linienstil int width, // Linienstärke string text) // Text { //---- ObjectCreate(chart_id,name,OBJ_TREND,nwin,time1,price1,time2,price2); ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color); ObjectSetInteger(chart_id,name,OBJPROP_STYLE,style); ObjectSetInteger(chart_id,name,OBJPROP_WIDTH,width); ObjectSetString(chart_id,name,OBJPROP_TEXT,text); ObjectSetInteger(chart_id,name,OBJPROP_BACK,false); ObjectSetInteger(chart_id,name,OBJPROP_RAY_RIGHT,true); ObjectSetInteger(chart_id,name,OBJPROP_RAY,true); ObjectSetInteger(chart_id,name,OBJPROP_SELECTED,true); ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,true); ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,true); //---- } //+------------------------------------------------------------------+ //|| Zurücksetzen der Trendlinie| //+------------------------------------------------------------------+ void SetTline(long chart_id, // Kennung der Karte string name, // Objektname int nwin, // Fensterindex datetime time1, // Zeit von 1 Preisstufe double price1, // 1 Preisniveau datetime time2, // Zeitpunkt des Preisniveaus 2 double price2, // 2 Preisniveau color Color, // Linienfarbe int style, // Linienstil int width, // Linienstärke string text) // Text { //---- if(ObjectFind(chart_id,name)==-1) { CreateTline(chart_id,name,nwin,time1,price1,time2,price2,Color,style,width,text); } else { ObjectSetString(chart_id,name,OBJPROP_TEXT,text); ObjectMove(chart_id,name,0,time1,price1); ObjectMove(chart_id,name,1,time2,price2); ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color); } //---- } //+------------------------------------------------------------------+ //| Suche nach dem oberen Fraktal| //+------------------------------------------------------------------+ bool upFrac(int cnt,const double &High[]) { //---- for(int i=1; i<=int(frNum); i++) { if(frType==TYPE1) { //---- wenn strenge Bedingung und Post- oder Pre-Balken über-gleich dem Nachbarn sind - kein Fraktal if(High[cnt+i]>=High[cnt+i-1] || High[cnt-i]>=High[cnt-i+1]) return(false); } else { //---- wenn die Bedingung nicht strikt ist und Post- oder Pre-Bars oberhalb der Mitte liegen - kein Fraktal if(High[cnt+i]>High[cnt] || High[cnt-i]>High[cnt]) return(false); } } //---- return(true); } //+------------------------------------------------------------------+ //| Suche nach dem unteren Fraktal| //+------------------------------------------------------------------+ bool dwFrac(int cnt,const double &Low[]) { //---- for(int i=1; i<=int(frNum); i++) { if(frType==TYPE1) { //---- wenn strenge Bedingung und Post- oder Pre-Balken niedriger sind als der Nachbar - kein Fraktal if(Low[cnt+i]<=Low[cnt+i-1] || Low[cnt-i]<=Low[cnt-i+1]) return(false); } else { //---- wenn die Bedingung nicht strikt ist und Post- oder Pre-Bars unterhalb des Zentrums liegen - kein Fraktal if(Low[cnt+i]<Low[cnt] || Low[cnt-i]<Low[cnt]) return(false); } } //---- return(true); } //+------------------------------------------------------------------+ //| Benutzerdefinierte Indikator-Deinitialisierungsfunktion | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //---- Comment(""); for(int i=0; i<3; i++) { string name="IPGDR_Lv"+string(i); ObjectDelete(0,name); ObjectDelete(0,name+"Up"); ObjectDelete(0,name+"Dw"); ObjectDelete(0,name+"Tx"); } //---- } //+------------------------------------------------------------------+ //| Benutzerdefinierte Indikator-Iterationsfunktion | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, // Menge der Historie in Balken zum aktuellen Tick const int prev_calculated,// Betrag der Historie in Balken zum vorherigen Tick const datetime &time[], const double &open[], const double& high[], // Preisfeld mit Preismaxima für die Indikatorberechnung const double& low[], // Preisfeld mit Preisminima für die Indikatorberechnung const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //---- prüfen, ob die Anzahl der Balken für die Berechnung ausreicht if(rates_total<int(sBars)) return(0); //---- Indizierung von Elementen in Arrays, wie in Zeitreihen ArraySetAsSeries(time,true); ArraySetAsSeries(close,true); ArraySetAsSeries(open,true); ArraySetAsSeries(high,true); ArraySetAsSeries(low,true); lastBars=rates_total; //---- sucht nach Fraktalen und fügt sie in das Array ein, aber nicht mehr als die erlaubte Anzahl von Fraktalen. int sh=0; ArrayInitialize(aData,0); double lastExt=0; int total=int(sBars-2*frNum); int start=int(frNum+1); for(int i=start; i<total; i++) { // if(frMode!=MODE_LOW && upFrac(i,high)) if(frMode!=FRACTAL_MODE::MODE_LOW && upFrac(i,high)) { //---- Scheitelpunkte hinzufügen [außer Trogmodus] //---- überspringt doppelte benachbarte Scheitelpunkte unter nicht-strikter Bedingung if(!(frType!=TYPE1 && lastExt>0 && lastExt==high[i])) { aData[sh][0]=high[i]; lastExt=high[i]; sh++; } } if(sh>=240) break; // if(frMode!=MODE_HIGH && dwFrac(i,low)) if(frMode!=FRACTAL_MODE::MODE_HIGH && dwFrac(i,low)) { //---- Vertiefungen hinzufügen [außer Scheitelpunktmodus] //---- überspringt doppelte benachbarte Tröge unter nicht strikter Bedingung if(!frType!=TYPE1 && lastExt>0 && lastExt==low[i]) { aData[sh][0]=low[i]; lastExt=low[i]; sh++; } } if(sh>=240) break; } //---- bestimmen den durchschnittlichen Kerzenabstand und die entsprechende Toleranz double dlt,sHL=0; for(int i=1; i<=int(sBars); i++) sHL+=(high[i]-low[i]); sHL/=sBars; dlt=sHL*dlt_; //---- Bewertungen für jede Stufe festlegen for(int i=0; i<sh; i++) for(int j=i+1; j<sh; j++) if(aData[j][0]>aData[i][0]-dlt && aData[j][0]<aData[i][0]+dlt) { aData[i][1]+=1; aData[j][1]+=1; } //---- identifizieren die drei stärksten Ebenen double cur[2],tmp[2]; aRes[0][0]=aData[0][0]; aRes[0][1]=aData[0][1]; for(int i=1; i<sh; i++) { cur[0]=aData[i][0]; cur[1]=aData[i][1]; if(cur[1]>aRes[0][1]) { //---- wenn die Bewertung größer als Rang 1 ist, dann wird Rang 1 der aktuelle tmp[0]=aRes[0][0]; tmp[1]=aRes[0][1]; aRes[0][0]=cur[0]; aRes[0][1]=cur[1]; cur[0]=tmp[0]; cur[1]=tmp[1]; } //---- wenn die Bewertung höher als der 2. Platz ist, aber nicht zum 1. Platz gehört, den 2. Platz ersetzen if(cur[1]>aRes[1][1] && (cur[0]<aRes[0][0]-dlt || cur[0]>aRes[0][0]+dlt)) { tmp[0]=aRes[1][0]; tmp[1]=aRes[1][1]; aRes[1][0]=cur[0]; aRes[1][1]=cur[1]; cur[0]=tmp[0]; cur[1]=tmp[1]; } //---- wenn die Bewertung höher als der 3. Platz ist und nicht zum 1. und 2. Platz gehört, ersetzen Sie den 3. if(cur[1]>aRes[2][1] && (cur[0]<aRes[0][0]-dlt || cur[0]>aRes[0][0]+dlt) && (cur[0]<aRes[1][0]-dlt || cur[0]>aRes[1][0]+dlt)) { aRes[2][0]=cur[0]; aRes[2][1]=cur[1]; } } for(int i=0; i<3; i++) { double dwL=aRes[i][0]-dlt,upL=aRes[i][0]+dlt; string name="IPGDR_Lv"+string(i); SetChannel(0,name,0,time[24],upL,time[1],upL,time[24],dwL,BGColor[i],STYLE_SOLID,1,name); SetTline(0,name+"Up",0,time[24],upL,time[1],upL,TLColor[i],STYLE_SOLID,1,name+"Up"); SetTline(0,name+"Dw",0,time[24],dwL,time[1],dwL,TLColor[i],STYLE_SOLID,1,name+"Dw"); SetTextLabel(0,name+"Tx",0,time[32],upL+2*_Point,TLColor[i],STYLE_SOLID,1,DoubleToString(aRes[i][0],_Digits),"tahoma",14); } //---- Kommentare zur Ausgabe string rem1="",rem2=""; if(frType==TYPE2) rem1=rem1+"Klassiker"; else rem1=rem1+"Streng"; rem1=rem1+string(frNum*2+1)+"Balkenfraktale".; // if(frMode==MODE_LOW) rem1=rem1+", troughs"; if(frMode==FRACTAL_MODE::MODE_LOW) rem1=rem1+", Hintern."; //else if(frMode==MODE_HIGH) rem1=rem1+", vertex"; else if(frMode==FRACTAL_MODE::MODE_HIGH) rem1=rem1+", Oberteile."; rem1=rem1+"\n gefunden."+string(sh)+" Fraktal(e) \n Stärkste Stufen "; StringConcatenate(rem2,aRes[0][0],"[",aRes[0][1],"], ", aRes[1][0],"[",aRes[1][1],"], ",aRes[2][0],"[",aRes[2][1], "], error ±",NormalizeDouble(dlt/_Point,1),"Absatz(e)"); Comment(rem1+rem2); //---- ChartRedraw(0); //---- return(rates_total); } //+------------------------------------------------------------------+
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
iGDR_Fractal_Levels:
iGDR_Fractal_Levels zeigt die durchschnittlichen Werte der Fraktale eines bestimmten Zeitraums.
Autor: Nikolay Kositsin