![]() |
|
Startseite | Registrieren | Hilfe | Benutzerliste | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
![]() |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
![]()
Hallo,
ich habe mit einem Indikator ein Problem. Und zwar zeichnet mir dieser nachdem die Differenzen zwischen verschiedenen Perioden verglichen und anschließend mit einem Vergleichswert abgeglichen wurden einen entsprechenden Pfeil in den Chart. Das funktioniert soweit auch. Leider treten in unregelmäßigen Abständen Fehler aud. Und zwar werden dann mit nahezu jedem neuen Bar weitere Pfeile gezeichnet. Dies passiert auch ausschließlich in zwei WP (EURAUD und GBPAUD). In allen anderen WP auf denen ich den Indikator laufen lasse ist der Fehler nicht. Daher bin ich wirklich absolut ratlos woran dies liegen kann. Vielleicht hat einer Zeit und Lust mal drüber zu schauen. Ich habe die mql Datei angehängt und einen Screenshot vom Fehler. Evtl liegt es auch daran, dass ich Renkos nutze. Wenn es kein Programmierfehler ist würde ich aber aufhören zu suchen. |
|
|||
![]()
@Crashbulle: Wie willst Du auf einen progammtechnischen Fehler etwas Sinnvolles schreiben wenn Du dir den Code nicht einmal anschaust?
Worauf soll sich bitte deine Aussage zur Stärke beziehen? Hat das auch nur im entferntesten etwas mit meiner Frage bzw mit dem geschildertem Problem zu tun. Tu mir einen Gefallen, wenn Du nichts zu sagen hast, dann lass es. |
|
|||
![]()
So ist es besser. Bei meinem ersten Beitrag wusste ich noch nicht wie ich den Code einfüge.
Code:
#property copyright "Copyright 2016, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property indicator_chart_window //#property strict #property indicator_buffers 2 #property indicator_color1 Chartreuse #property indicator_color2 Red #property indicator_width1 2 #property indicator_width2 2 extern bool AlertPopups=true; extern bool AlertSounds=true; bool AlertEmails=false; bool AlertNotifications=false; string SoundFile = "news.wav"; double THV_Coral; //Variablen für Coral und Donchian Channel bool DCTop; bool DCBottom; datetime OldTime; //Für Alarm 1 Mal int Auswahl=0; //Auswahlvariable Alarm int Risiko = 11; double buf_0[]; //Array zum speichern der Tiefwerte double buf_1[]; //Array zum speichern der Hochwerte double buf_2[]; //Array zum speichern der Vergleichswerte bool Abfrage_01 = false; //Variable für Arrow_up bool Abfrage_02 = false; //Variable für Arrow_down int i,j,k; //Variable für Schleifenzähler int z1,z2,z3; //Variable für Auswahlentscheidung double AbsWert; //Absolutvariable der Summe von durchschnittlicher Differenz aus den letzten 10 Perioden double VerglWert; //Absolutvariable aus dem WPR double HochWert; double TiefWert; int init() { IndicatorBuffers(3); SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID, 1); //Arrow_up SetIndexArrow(0, 233); SetIndexBuffer(0, buf_0); SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID, 1); //Arrow_down SetIndexArrow(1, 234); SetIndexBuffer(1, buf_1); SetIndexLabel(0,"Arrow_up"); SetIndexLabel(1,"Arrow_down"); SetIndexBuffer(2, buf_2); return (0); } int deinit() { Comment(""); return (0); } int start() { int Balken = IndicatorCounted(); //---- THV_Coral = iCustom(Symbol(), 0, "Coral" , 0, 55, 0, 1); //Lage der Coral in der vorherigen Periode DCTop = iCustom(Symbol(), 0, "Donchian", 40, 0, 1); //Top-Wert des Dochian Channels auf der vorherigen Kerze DCBottom = iCustom(Symbol(), 0, "Donchian", 40, 1, 1); //Bottom-Wert des Dochian Channels auf der vorherigen Kerze //----- for(j=0; j<=9; j++) AbsWert += MathAbs(High[j] - Low[j]); //Summierung der Differenz von High und Low der letzten 10 Perioden. Davon wird der Betrag gewählt. AbsWert=AbsWert/10; //Durchsnittswert des vorher erwittelten Betrags j=0; //----- while(j<=9 && z1<1) {if(MathAbs(Open[j]-(Close[j+1]))>=2.0*AbsWert) z1++; j++;} //Vergleicht 10 Perioden lang ob die Differrenz zwischen Open und Close >= 2 Mal dem durschnittlichem Absolutwert ist if(z1>=1) z2=j; else z2=-1; j=0; z1=0; while(j<=6 && z1<1) {if(MathAbs(Close[j+3]-Close[j])>=4.6*AbsWert) z1++; j++;} //Vergleicht 7 Perioden lang ob die Differenz zwischen Close (Periode j+3) und Close (Periode j) >= 4,6 Mal dem durchschnittlichem Absolutwert ist. if(z1>=1) z3=j; else z3=-1; //----- if(z2>-1) Risiko=3; //Abschnitt wählt den Risikofaktor else Risiko=11; if(z3>-1) Risiko=4; else Risiko=11; //----- for(i=Bars-Balken; i>=0; i--) { VerglWert=100-MathAbs(iWPR(NULL,0,Risiko,i)); //Es wird ein Vergleichswert auf Basis der WPR berechnet. buf_2[i]=VerglWert; //Speichert Vergleichswert in Array (Position i) HochWert=0; TiefWert=0; //----- if(VerglWert<29) //Abgleich des Vergleichswertes mit dem Grenzwert 29 { for(k=1 ;buf_2[i+k]>29 && buf_2[i+k]<=71; k++); //Durchlaufe das Array solange die darin gespeicherten Vergleichswerte zwischen 29 und 71 liegen. Erhöhe den Zähler bei jedem Durchlauf um den Faktor 1. if(buf_2[i+k]>71) HochWert=High[i]+AbsWert/2; //Nachem die Schleife durchlaufen wurde, wird geprüft ob der Vergleichswert > 71 ist. Hochwert wird berechnet. } if(VerglWert>71) //Abgleich des Vergleichswertes mit dem Grenzwert 71 { for(k=1; buf_2[i+k]>=29 && buf_2[i+k]<71; k++); //Durchlaufe das Array solange die darin gespeicherten Vergleichswerte zwischen 29 und 71 liegen. Erhöhe den Zähler bei jedem Durchlauf um den Faktor 1. if(buf_2[i+k]<29) TiefWert=Low[i]-AbsWert/2; //Nachdem die Schleife durchlaufen wurde, wird geprüft ob der Vergleichswert < 29 ist. Tiefwert wird berechnet. } //----- if(TiefWert!=0 && Abfrage_01==FALSE) { buf_0[i]=TiefWert-1*Point; //Zeichnet Arrow_up Abfrage_01=TRUE; Abfrage_02=FALSE; Auswahl=1; //Variable für Auswahl des Alarm (siehe unten) } if(HochWert!=0 && Abfrage_02==FALSE) { buf_1[i]=HochWert+1*Point; //Zeichnet Arrow_down Abfrage_01=FALSE; Abfrage_02=TRUE; Auswahl=2; //Variable für Auswahl des Alarm (siehe unten) } } //----- //RenkoAlarm if(OldTime != Time[0]) { if(Close[2]-Open[2]<0 && Close[1]-Open[1]>0 && Auswahl==2) //Positiver Bar nachdem ein negativer Pfeil gezeichnet wurde doAlerts(Symbol()+" Buy Signal",SoundFile); if(Close[2]-Open[2]>0 && Close[1]-Open[1]<0 && Auswahl==1) //Negativer Bar nachdem ein positiver Pfeil gezeichnet wurde doAlerts(Symbol()+" Sell Signal",SoundFile); OldTime=Time[0]; } return (0); } void doAlerts(string message,string soundfile){ //Alarmfunktion if (AlertPopups) Alert(message); if (AlertSounds) PlaySound(soundfile); if (AlertEmails) SendMail(message,message); if (AlertNotifications) SendNotification(message); } |
|
|||
![]()
Habe den Fehler gefunden und gelöst. Falls einer sich damit beschäftigt haben sollte braucht er keine Zeit mehr verschwenden.
|
|
||||
![]()
Hallo Lena,
Wäre schön wenn du uns teil haben läst wo der Fehler war. Und die Korrektur on stell würdes. Gruß Franz ![]() ________________________ Die ganze Natur ist eigentlich nichts anderes als ein Zusammenhang von Erscheinungen nach Regeln. * Immanuel Kant deutscher Philosoph (1724 - 1804) |
|
|||
![]()
Vergiss was ich geschrieben habe. Der blöde Bug ist noch immer da. Keine Ahnung woran es liegen kann.
Habe aber ein wenig verändert. Inzwischen sieht es so aus: Code:
#property copyright "Copyright 2016, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property indicator_chart_window //#property strict #property indicator_buffers 2 #property indicator_color1 Chartreuse #property indicator_color2 Red #property indicator_width1 2 #property indicator_width2 2 extern bool AlertPopups=true; extern bool AlertSounds=true; bool AlertEmails=false; bool AlertNotifications=false; string SoundFile = "news.wav"; double Tief,Hoch; //Variablen für Tief/Hochwerte bei letztem Alarm double THV_Coral; //Variablen für Coral und Donchian Channel bool DCRand; //Variable zum Entscheid ob oberer oder unterer Rand des DC zuletzt verschoben wurde datetime OldTime; //Für Alarm 1 Mal int Auswahl; //Auswahlvariable Alarm int b; //Auswahlvariable welcher Rand des Donchianchannels zum Zeitpunkt des WPR-Signals aktiv ist double buf_0[]; //Array zum speichern der Tiefwerte double buf_1[]; //Array zum speichern der Hochwerte double buf_2[]; //Array zum speichern der WPR double buf_3[]; //Array zum speichern der Top-Werte des Donchianchannels double buf_4[]; //Array zum speichern der Low-Werte des Donchianchannels int i,k,x,y; //Variable für Schleifenzähler double WPR; //Variable aus dem WPR int init() { IndicatorBuffers(5); SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID, 1); //Arrow_up SetIndexArrow(0, 233); SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID, 1); //Arrow_down SetIndexArrow(1, 234); SetIndexLabel(0,"Arrow_up"); SetIndexLabel(1,"Arrow_down"); SetIndexBuffer(0, buf_0); SetIndexBuffer(1, buf_1); SetIndexBuffer(2, buf_2); //Buffer für WPR SetIndexBuffer(3, buf_3); //Buffer für Top-Wert des Donchianchannels SetIndexBuffer(4, buf_4); //Buffer für Low-Wert des Donchianchannels return (0); } int deinit() { Comment(""); return (0); } int start() { int Multiplier = 1; if(Digits == 3 || Digits == 5) Multiplier = 10; if(Digits == 6) Multiplier = 100; if(Digits == 7) Multiplier = 1000; //----- THV_Coral = iCustom(Symbol(), 0, "Coral" , 0, 55, 0, 1); //Lage der Coral in der vorherigen Periode for(i=Bars; i>=0; i--) { buf_3[i] = iCustom(Symbol(), 0, "Donchian", 40, 0, i); //Top-Wert des Dochian Channels buf_4[i] = iCustom(Symbol(), 0, "Donchian", 40, 1, i);} //Buttom-Wert des Dochian Channels for(i=Bars; i>=0; i--) { if (High[i]>=buf_3[i+1])DCRand=true; //Wurde der obere Rand des DC durchbrochen wird die Variable DCRand auf true gesetzt else if (Low [i]<=buf_4[i+1])DCRand=false;} //Wurde der untere Rand durchbrochen wird DC Rand auf false gesetzt //----- int counted_bars=IndicatorCounted(); if(counted_bars<0)return(-1); if(counted_bars>0)counted_bars--; i=Bars-counted_bars-1; while(i>0) { WPR=100-MathAbs(iWPR(NULL,0,11,i)); //WPR wird abgefragt und umgerechnet buf_2[i]=WPR; //Speichert WPR in Array (Position i) //----- if(WPR<29) //Abgleich des WPR mit dem Grenzwert 29 { for(k=1 ;buf_2[i+k]>=29 && buf_2[i+k]<=71; k++); //Durchlaufe das Array solange die darin gespeicherten WPR zwischen 29 und 71 liegen. Erhöhe den Zähler bei jedem Durchlauf um den Faktor 1. if(buf_2[i+k]>71) { buf_1[i]=High[i]+2*Point*Multiplier; //Zeichnet Arrow_down Auswahl=2; //Variable für Auswahl des Alarm (siehe unten) if (DCRand==true) b=1; //Abfrage welcher Rand des Donchianchannels zu diesem Zeitpunkt als letztes berührt wurde else if (DCRand==false)b=0; } } else if(WPR>71) //Abgleich des WPR mit dem Grenzwert 71 { for(k=1; buf_2[i+k]>=29 && buf_2[i+k]<=71; k++); //Durchlaufe das Array solange die darin gespeicherten WPR zwischen 29 und 71 liegen. Erhöhe den Zähler bei jedem Durchlauf um den Faktor 1. if(buf_2[i+k]<29) { buf_0[i]=Low[i]-2*Point*Multiplier; //Zeichnet Arrow_up Auswahl=1; //Variable für Auswahl des Alarm (siehe unten) if (DCRand==true) b=1; //Abfrage welcher Rand des Donchianchannels zu diesem Zeipunkt als letztes berührt wurde else if (DCRand==false)b=0; } } i--; } //----- if(OldTime != Time[0]) //Auswahl Alarmabschnitt { if (Close[2]-Open[2]<0 && Close[1]-Open[1]>0 && Auswahl==2 && x==0 && b==1) //Abfrage: Positiver Bar, WPR zeigt negativen Pfeil, Zähler =0, oberer Rand des DC wurde verschoben {doAlerts(Symbol()+" Buy Signal ",SoundFile);x++; y=0; Tief=Low[1];} //Ausgabe Alarm, Zähler eins hochsetzen, Zähler auf Null setzen, Tiefpunkt setzen else if (Close[2]-Open[2]<0 && Close[1]-Open[1]>0 && Auswahl==2 && x==0 && b==0) //Abfrage: wie zuvor mit der Änderung dass der untere Rand des DC verschoben wurde {x=0; y=0;} //Beide Zähler werden auf Null gesetzt else if (Close[2]-Open[2]<0 && Close[1]-Open[1]>0 && Auswahl==2 && x>=1 && Low[1]<Tief) //Abfrage: Positiver Bar, WPR zeigt negativen Pfeil, Zähler>=1, aktuelles Tief ist kleiner vorherigem Tief {doAlerts(Symbol()+" Buy Signal ",SoundFile);x++; y=0; Tief=Low[1];} //Ausgabe Alarm, Zähler eins hochsetzen, Zähler auf Null setzen, Tiefpunkt setzen //----- if (Close[2]-Open[2]>0 && Close[1]-Open[1]<0 && Auswahl==1 && y==0 && b==0) // {doAlerts(Symbol()+" Sell Signal ",SoundFile);y++; x=0; Hoch=High[1];} else if (Close[2]-Open[2]>0 && Close[1]-Open[1]<0 && Auswahl==1 && y==0 && b==1) // {y=0;x=0;} else if (Close[2]-Open[2]>0 && Close[1]-Open[1]<0 && Auswahl==1 && y>=1 && High[1]>Hoch) {doAlerts(Symbol()+" Sell Signal ",SoundFile);y++; x=0; Hoch=High[1];} OldTime=Time[0]; } return (0); } void doAlerts(string message,string soundfile){ //Alarmfunktion if (AlertPopups) Alert(message); if (AlertSounds) PlaySound(soundfile); if (AlertEmails) SendMail(message,message); if (AlertNotifications) SendNotification(message); } |
|
|||
![]()
Anmerkung: Ich habe nicht daran gedacht dass es natürlich keinen Sinn macht etwas zu überprüfen oder sogar nur nach zu schauen wenn man keine Ahnung hat wofür es gut ist bzw was die Aufgabe sein soll. Daher eine kurze Erläuterung zu dem "Problem-Indikator".
Ich denke jeder kennt den Williams %R Indikator. Auf diesem baut mein Indikator auf. Es soll ein Pfeil eingezeichnet werden wenn ein Über bzw Unterverkauftlevel (bei mir die festgelegten Werte (29 &71) erreicht wird. Der eigentliche Alarm erfolgt dann bei dem ersten Bar bzw Renko in Gegenrichtung. Vielleicht findet sich ja doch jemand der mir Helfen kann und dazu bereit ist. Ich erwarte keine kostenlose Arbeit. |
|
|||
![]()
lena,
da es beim kompilieren keinen fehler gibt scheint es programmiertechnisch zu stimmen. logikfehler können trotzdem entstehen! da bei mir ein fehler fürs array2 kommt, muss der fehler davor liegen, es kommen falsche, keine oder zuviele daten im array an. oder irgendwas verändert die array daten zum unguten. da du indikatoren mit shift 0-9 -> array abfragst habe ich dir empfohlen deine vielen if,else,while etc routinen zu vereinfachen und mal strikt "ols school" die indi abzufragen und die ergebnisse zu loggen, dann kann du diese werte mit deinen vielen if,while schleifen vergleichen, kommt ein identischer wert raus, weißt du das deine indi abfragen stimmen. gerade weil du mit icustom externe indis abfragst, könnte das problem auch dort sein oder entstehen, würde sogar empfehlen diese direkt zu integrieren wenn du die möglichkeit hast dann die routinen prüfen die deine ergebnisse in die arrays schicken, abfragen und loggen, somit weißt du ob dein array input stimmt und mit den abfragen die ergebnisse stimmen. indi output muss mit array input stimmen, ausser gewollte manipulation. array output muss mit input 71/29 vergleich stimmen usw.... ps: #property strict aktivieren! bugs können auch bei metatrader vorkommen |
|
|||
![]()
Was meinst Du mit Array mit Shift 0-9 abzufragen?
Ich habe keine Ahnung wie ich die Abfragen noch weiter vereinfachen kann ohne die Funktionsweise zu verändern. Wenn ich Abfragen weglassen könnte würde ich es sehr gerne machen. Ich habe die Werte schon an verschiedenen Stellen im Indikator ausgelesen und geprüft ob diese stimmen. Da ist mir kein Fehler aufgefallen. Woran es nicht liegen kann ist das einbinden des Donchian und der THV_Coral. Denn der Bug ist auch vorhanden wenn ich diesen Teil deaktiviere. Selbst wenn ich den kompletten Bereich des Alarms mit den vielen if Abfragen deaktiviere und die Funktion wirklich ausschließlich darauf beschränke einen Pfeil beim erreichen der Zonen 29 bzw 71 zu setzen taucht das Problem auf. Das Problem muss also definitiv in einer der folgenden Zeilen stecken. Code:
int counted_bars=IndicatorCounted(); if(counted_bars<0)return(-1); if(counted_bars>0)counted_bars--; i=Bars-counted_bars-1; while(i>0) { WPR=100-MathAbs(iWPR(NULL,0,11,i)); //WPR wird abgefragt und umgerechnet buf_2[i]=WPR; //Speichert WPR in Array (Position i) //----- if(WPR<29) //Abgleich des WPR mit dem Grenzwert 29 { for(k=1 ;buf_2[i+k]>=29 && buf_2[i+k]<=71; k++); //Durchlaufe das Array solange die darin gespeicherten WPR zwischen 29 und 71 liegen. Erhöhe den Zähler bei jedem Durchlauf um den Faktor 1. if(buf_2[i+k]>71) { buf_1[i]=High[i]+2*Point*Multiplier; //Zeichnet Arrow_down } } else if(WPR>71) //Abgleich des WPR mit dem Grenzwert 71 { for(k=1; buf_2[i+k]>=29 && buf_2[i+k]<=71; k++); //Durchlaufe das Array solange die darin gespeicherten WPR zwischen 29 und 71 liegen. Erhöhe den Zähler bei jedem Durchlauf um den Faktor 1. if(buf_2[i+k]<29) { buf_0[i]=Low[i]-2*Point*Multiplier; //Zeichnet Arrow_up } } i--; } |
![]() |
Lesezeichen |
Stichworte |
fehler pfeile, mql4, pfeil, pfeile, programmierung, programmierung metatrader |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|