MetaTrader 5 herunterladen

MathSrand

Stellt Anfangsposition für Generieren einer Folge der pseudozufälligen Ganzzahlen.

void  MathSrand(
   int  seed      // initialisierende Zahl
   );

Parameter

seed

[in]  Anfangszahl für die Reihe der zufälligen Zahlen.

Rückgabewert

Keinen Rückgabewert.

Hinweis

Funktion MathRand() wird für Erzeugen einer Folge von Pseudo-Zufallszahlen verwendet. Aufruf von MathSrand() mit einer bestimmten Initialisierungszahl ermöglicht es, immer die gleiche Folge von Pseudozufallszahlen zu erhalten.

Zum garantierten Erhalt der nicht wiederkehrenden Abfolge verwenden Sie den Aufruf von MathSrand(GetTickCount()), da der Wert von GetTickCount() sich ab dem Zeitpunkt des Starts des Betriebssystems erhöht und nicht innerhalb von 49 Tage wiederholt, bis der eingebaute Zähler von Millisekunden überläuft. Verwenden von MathSrand(TimeCurrent()) ist nicht geeignet, weil die Funktion TimeCurrent() gibt die Zeit der letzte Tick zurück, die für eine lange Zeit unverändert sein kann, zum Beispiel am Wochenende.

Die Initialisierung des Zufallsgenerators mit MathSrand() für Indikatoren und Expert Advisors wird am besten in der OnInit()-Handler getan; es spart Ihnen den folgenden mehrere Neustarts der Generator in OnTick() und OnCalculate()..

Anstelle der Funktion MathSrand(), srand()-Funktion verwendet werden kann.

Beispiel:

#property description "Der Indikator zeigt den zentralen Grenzwertsatz, der besagt:"
#property description "Die Summe von einer ausreichend großen Anzahl von schwach abhängigen Zufallswerte, "
#property description "mit annähernd gleicher Größe (keiner der Summanden dominiert,"
#property description "oder macht einen entscheidenden Beitrag zu der Summe), hat eine Verteilung die nah zu normal ist."
 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- Eigenschaften der graphischen Konstruktion
#property indicator_label1  "Label"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrRoyalBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  5
//--- Variable input
input int      sample_number=10;
//--- Ein Indikator-Puffer für die Erstellung der Verteilung
double         LabelBuffer[];
//--- Zähler von Ticks
double         ticks_counter;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- Bindung des Indikator-Puffers mit dem Array
   SetIndexBuffer(0,LabelBuffer,INDICATOR_DATA);
//--- Den Indikator-Puffer aus der Gegenwart in die Vergangenheit umwenden
   ArraySetAsSeries(LabelBuffer,true);
//--- Den Zufallszahlengenerator initialisieren
   MathSrand(GetTickCount());
//--- Den Zähler von ticks initialisieren
   ticks_counter=0;
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//--- Mit dem Null-Zähler setzen wir den Indikator-Puffer zurück
   if(ticks_counter==0) ArrayInitialize(LabelBuffer,0);
//--- Den Zähler erhöhen
   ticks_counter++;
//--- Wir sollten in regelmäßigen Abständen den Zähler von Ticks zurücksetzen, um die Verteilung wiederzubeleben
   if(ticks_counter>100)
     {
      Print("Wir haben die Indikator-Werte zurückgesetzt, beginnen wir Füllen von den Zellen erneut");
      ticks_counter=0;
     }
//--- Bekommen Wir einen Auszug von Zufallswerten als die Summe der drei Zahlen von 0 bis 7
   for(int i=0;i<sample_number;i++)
     {
      //--- Berechnung des Index der Zelle, wo die Zufallszahl fällt als die Summe der drei anderen Zahlen
      int rand_index=0;
      //--- Bekommen wir drei Zufallszahlen von 0 bis 7
      for(int k=0;k<3;k++)
        {
         //--- Ein Rest der Division durch 7 wird ein Wert von 0 bis 6 zurückgeben
         rand_index+=MathRand()%7;
        }
      //--- Erhöhen wir den Wert in der Zelle Nummer rand_index um 1
      LabelBuffer[rand_index]++;
     }
//--- Verlassen wir den Handler OnCalculate()
   return(rates_total);
  }