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

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Unerklärlicher Fehler (http://www.expert-advisor.com/forum/showthread.php?t=4733)

Lena 02.02.16 11:07

Unerklärlicher Fehler
 
Liste der Anhänge anzeigen (Anzahl: 2)
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 02.02.16 14:20

Ohne mir die datei anzuschauen,
fällt mir nur ein,
das bei erreichen einer gewissen Stärke es ein Signal gibt.
Sollte diese Stärke anhalten (trotz Barveränderung), werden Signale weiter ausgeben bis diese Stärke-grenze unterschritten wird.

Lena 02.02.16 14:40

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

Lena 03.02.16 09:43

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);
}


Lena 07.02.16 16:19

Habe den Fehler gefunden und gelöst. Falls einer sich damit beschäftigt haben sollte braucht er keine Zeit mehr verschwenden.

asfranz 07.02.16 19:48

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)

Lena 10.02.16 16:25

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);
}

Am Anfang dachte ich noch es kann nicht so schwer sein einen Indikator zu schreiben. Inzwischen bin ich aber nur noch verwirrt, denn egal was ich veränder, es kommt immer der selbe verdammt Fehler. Ich wünschte mir, es würden schon ein Dutzend Fehler beim kompilieren angezeigt. Dann wüsste ich wenigstens wo ich nachsehen muss.

Lena 10.02.16 16:34

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.

pischinger 10.02.16 17:28

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

Lena 10.02.16 18:48

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--; 
  }



Alle Zeitangaben in WEZ +2. Es ist jetzt 01:46 Uhr.

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