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