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