#property description "Der Indikator analysiert die Daten für den letzten Monat und zeichnet alle Kerzen mit den kleinen" #property description "und größen Tick Volumen aus. Für die Bestimmung solcher Kerzen wird die Sortierung" #property description "das Tick Volumen Array erzeugt. Die Kerzen, deren Volumen die erste InpSmallVolume" #property description "der Prozente des Arrays bilden, gelten für die Kleinen. Die Kerzen, deren Tick Volumen " #property description "die letzte InpBigVolume der Prozente des Arrays bilden, gelten für die Größen." //--- der Indikator Einstellungen #property indicator_chart_window #property indicator_buffers 5 #property indicator_plots 1 //--- plot #property indicator_label1 "VolumeFactor" #property indicator_type1 DRAW_COLOR_CANDLES #property indicator_color1 clrDodgerBlue,clrOrange #property indicator_style1 STYLE_SOLID #property indicator_width1 2 //--- vordefinierte Konstante #define INDICATOR_EMPTY_VALUE 0.0 //--- Eingabeparameters input int InpSmallVolume=15; // Das Prozent der kleinen Volumen (<50) input int InpBigVolume=20; // Das Prozent der größen Volumen (<50) //--- die Anfangszeit der Analyse (wird sich verschieben) datetime ExtStartTime; //--- die Indikator Puffers double ExtOpenBuff[]; double ExtHighBuff[]; double ExtLowBuff[]; double ExtCloseBuff[]; double ExtColorBuff[]; //--- die Grenzwerte der Volumen für die Abbildung der Kerzen long ExtLeftBorder=0; long ExtRightBorder=0; //+------------------------------------------------------------------+ //| Erhalten Sie die Grenzwerte für Tick Volumen | //+------------------------------------------------------------------+ bool GetVolumeBorders(void) { //--- Variablen datetime stop_time; // die Abschlusszeit von Kopieren long buff[]; // Der Puffer, wohin wir kopieren werden //--- Abschlusszeit - aktuelle Zeit stop_time=TimeCurrent(); //--- die Anfangszeit - einen Monat früher als die aktuelle ExtStartTime=GetStartTime(stop_time); //--- erhalten Sie die Werte der Tick Volumen ResetLastError(); if(CopyTickVolume(Symbol(),Period(),ExtStartTime,stop_time,buff)==-1) { //--- Es misslang, die Daten zu bekommen, geben Sie false für den Start der Mannschaft auf die Umrechnung zurück PrintFormat("Es misslang, die Werte von Tick Volumen zu bekommen. Fehlercode = %d",GetLastError()); return(false); } //--- berechnen Sie die Größe des Arrays int size=ArraySize(buff); //--- sortieren Sie das Array ArraySort(buff); //--- bestimmen Sie die Werte der linken und der rechten Grenzen für Tick Volumen ExtLeftBorder=buff[size*InpSmallVolume/100]; ExtRightBorder=buff[(size-1)*(100-InpBigVolume)/100]; //--- die erfolgreiche Ausführung return(true); } //+------------------------------------------------------------------+ //| Erhalten Sie dem Datum, einen Monat weniger als der übertragenen | //+------------------------------------------------------------------+ datetime GetStartTime(const datetime stop_time) { //--- konvertieren Sie die Abschlusszeit zu die Variable von die MqlDateTime-Struktur MqlDateTime temp; TimeToStruct(stop_time,temp); //--- erhalten Sie dem Datum, einen Monat weniger if(temp.mon>1) temp.mon-=1; // der aktuelle Monat ist nicht das erste des Jahres, d.h. die Nummer ist weniger als die vorherige else { temp.mon=12; // der aktuelle Monat ist das erste des Jahres, d.h. die Nummer der letzten Monat ist 12 gleich temp.year-=1; // und die Nummer des Jahres ist einer Nummer weniger } //--- die Nummer des tages wird nicht mehr als 28 if(temp.day>28) temp.day=28; //--- geben das bekommene Datum zurück return(StructToTime(temp)); } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- Prüfen Sie, ob die Eingabeparameters den Bedingungen zu Zufriedenheit ausfallen if(InpSmallVolume<0 || InpSmallVolume>=50 || InpBigVolume<0 || InpBigVolume>=50) { Print("Inkorrekt Eingabeparameters"); return(INIT_PARAMETERS_INCORRECT); } //--- Bindung von Array zum Indikator-Puffer SetIndexBuffer(0,ExtOpenBuff); SetIndexBuffer(1,ExtHighBuff); SetIndexBuffer(2,ExtLowBuff); SetIndexBuffer(3,ExtCloseBuff); SetIndexBuffer(4,ExtColorBuff,INDICATOR_COLOR_INDEX); //--- erstellen Sie die Wert, die nicht sichtbar sein werden PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,INDICATOR_EMPTY_VALUE); //--- stellen Sie die Beschriftungen für die Indikator Puffers PlotIndexSetString(0,PLOT_LABEL,"Open;High;Low;Close"); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- prüfen Sie, ob es noch die unbearbeiteten Bars sind if(prev_calculated<rates_total) { //--- bekommen Sie die neue Werte der linken und rechten Grenzen für Volumen if(!GetVolumeBorders()) return(0); } //---Variable zur Berechnung den Anfang des Bars int start=prev_calculated; //--- wen die Indikatorwerte auf vorhergehend Tick schon berechnet waren, so ist auf der letzten Bar gearbeitet if(start>0) start--; //--- stellen Sie die direkte Richtung der Indizierung in Zeitspanne ArraySetAsSeries(time,false); ArraySetAsSeries(open,false); ArraySetAsSeries(high,false); ArraySetAsSeries(low,false); ArraySetAsSeries(close,false); ArraySetAsSeries(tick_volume,false); //--- der Zyklus für Berechnung der Indikatorwerte for(int i=start;i<rates_total;i++) { //--- zeichnen Sie die Kerzen seit dem Anfangsdatum if(ExtStartTime<=time[i]) { //--- wenn der Wert ist nicht weniger als die rechte Grenze, dann zeichnen Sie die Kerze if(tick_volume[i]>=ExtRightBorder) { //--- bekommen Sie die Daten um die Kerze zu zeichnen ExtOpenBuff[i]=open[i]; ExtHighBuff[i]=high[i]; ExtLowBuff[i]=low[i]; ExtCloseBuff[i]=close[i]; //--- die Farbe DodgerBlue ExtColorBuff[i]=0; //--- fahren Sie die Zyklus fort weiter continue; } //--- wenn dir Wert ist nicht mehr als die linke Grenze, dann zeichnen Sie die Kerze if(tick_volume[i]<=ExtLeftBorder) { //--- bekommen Sie die Daten um die Kerze zu zeichnen ExtOpenBuff[i]=open[i]; ExtHighBuff[i]=high[i]; ExtLowBuff[i]=low[i]; ExtCloseBuff[i]=close[i]; //--- die Farbe Orange ExtColorBuff[i]=1; //--- fahren Sie die Zyklus fort weiter continue; } } //--- für die Bars, die nicht in die Berechnung gerieten, stellen Sie der leere Wert ExtOpenBuff[i]=INDICATOR_EMPTY_VALUE; ExtHighBuff[i]=INDICATOR_EMPTY_VALUE; ExtLowBuff[i]=INDICATOR_EMPTY_VALUE; ExtCloseBuff[i]=INDICATOR_EMPTY_VALUE; } //--- den Wert prev_calculated für den nächsten Anruf zurückgeben return(rates_total); } |