#property description "Skript auf der RSI Indikator wird im Chart Fenster angezeigt" #property description "die Daten wie oft der Markt in eine überkauft" #property description "und überverkauft Zonen in den angegebenen Zeitraum war." //--- Beim Starten des Skripts zeigen Sie den Fenster mit den Eingabeparametern an #property script_show_inputs //--- Eingabeparameters input int InpMAPeriod=14; // Periode des gleitenden Durchschnitts input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Preistyp input double InpOversoldValue=30.0; // Überverkauft Ebene input double InpOverboughtValue=70.0; // Überkauft Ebene input datetime InpDateStart=D'2012.01.01 00:00'; // Das Anfangsdatum der Analyse input datetime InpDateFinish=D'2013.01.01 00:00'; // das Abschlußdatum der Analyse //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ void OnStart() { double rsi_buff[]; // das Array der Indikatorwerte int size=0; // die Größe des Arrays //--- erhalten Sie die Handle des RSI Indikators ResetLastError(); int rsi_handle=iRSI(Symbol(),Period(),InpMAPeriod,InpAppliedPrice); if(rsi_handle==INVALID_HANDLE) { //--- Es misslang, Handle des Indikators zu bekommen PrintFormat("Fehler beim Erhalten die Handle des Indikators. Fehlercode = %d",GetLastError()); return; } //--- Wir befinden uns im Zyklus, bis der Indikator alle Werten berechnen wird while(BarsCalculated(rsi_handle)==-1) { //--- Wir gehen hinaus, wenn der Benutzer die Arbeit des Skripts zwangsläufig beendet hat if(IsStopped()) return; //--- die Verzögerungszeit, damit der Indikator geschafft, seine Werte zu berechnen Sleep(10); } //--- kopieren Sie die Indikatorwerte für eine angegebene Period ResetLastError(); if(CopyBuffer(rsi_handle,0,InpDateStart,InpDateFinish,rsi_buff)==-1) { PrintFormat("Es misslang, die Indikatorwerte zu kopieren. Fehlercode = %d",GetLastError()); return; } //--- erhalten Sie die Größe des Arrays size=ArraySize(rsi_buff); //--- sortieren Sie das Array ArraySort(rsi_buff); //--- erkennen Sie welches Prozent der Zeit sich den Markt in der überverkauft Zone befand double ovs=(double)ArrayBsearch(rsi_buff,InpOversoldValue)*100/(double)size; //--- erkennen Sie welches Prozent der Zeit sich den Markt in der überkauft Zone befand double ovb=(double)(size-ArrayBsearch(rsi_buff,InpOverboughtValue))*100/(double)size; //--- bilden Sie die Zeilen für die Schlussfolgerung der Daten string str="Seit "+TimeToString(InpDateStart,TIME_DATE)+" bis " +TimeToString(InpDateFinish,TIME_DATE)+" der Markt ist in:"; string str_ovb="den überkauft Zone "+DoubleToString(ovb,2)+"% Zeit"; string str_ovs="den überverkauft Zone "+DoubleToString(ovs,2)+"% Zeit"; //--- zeigen Sie die Daten in der Chart CreateLabel("top",5,60,str,clrDodgerBlue); CreateLabel("overbought",5,35,str_ovb,clrDodgerBlue); CreateLabel("oversold",5,10,str_ovs,clrDodgerBlue); //--- zeichnen Sie die Chart ChartRedraw(0); //--- die Verzögerung Sleep(10000); } //+------------------------------------------------------------------+ //| Zeigt den Kommentar in der unteren linken Ecke der Chart | //+------------------------------------------------------------------+ void CreateLabel(const string name,const int x,const int y, const string str,const color clr) { //--- Label erstellen ObjectCreate(0,name,OBJ_LABEL,0,0,0); //--- Bindung von Label zu dem linken unteren Ecke ObjectSetInteger(0,name,OBJPROP_CORNER,CORNER_LEFT_LOWER); //--- ändern Sie die Position der Ankerpunkt ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_LEFT_LOWER); //--- die Länge der X-Achse von der Ankerpunkt ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x); //--- die Länge der Y-Achse von der Ankerpunkt ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y); //--- der Text-Label ObjectSetString(0,name,OBJPROP_TEXT,str); //--- die Textfarbe ObjectSetInteger(0,name,OBJPROP_COLOR,clr); //--- die Textgröße ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12); } |