Einzelnen Beitrag anzeigen
  #7 (permalink)  
Alt 10.02.16
Lena Lena ist offline
Mitglied
 
Registriert seit: Feb 2016
Beiträge: 105
Lena befindet sich auf einem aufstrebenden Ast
Standard

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.