iOsMA

Gibt das Handle des Indikators Moving Average of Oscillator zurück. Oscillator OsMA zeigt Unterschied zwischen den Werten MACD und seiner Signallinie. Hat nur einen Puffer.

int  iOsMA(
   string              symbol,              // Symbolname
   ENUM_TIMEFRAMES     period,              // Periode
   int                 fast_ema_period,     // Periode von Fast Moving Average  
   int                 slow_ema_period,     // Periode von Slow Moving Average
   int                 signal_period,       // Mittelungsperiode der Differenz 
   ENUM_APPLIED_PRICE  applied_price        // Preistyp oder handle
   );

Parameter

symbol

[in]  Symbolname des Instrumentes, dessen Daten für Berechnung des Indikators verwendet werden. NULL bedeutet das laufende Symbol.

period

[in]  Wert der Periode kann einer der Enumerationswerte ENUM_TIMEFRAMES sein, 0 bedeutet das laufende Timeframe.

fast_ema_period

[in]  Mittelungsperiode für Berechnung von Fast Moving Average.

slow_ema_period

[in]  Mittelungsperiode für Berechnung von Slow Moving Average.

signal_period

[in]  Mittelungsperiode für Berechnung von Signallinie.

applied_price

[in]  Der verwendete Preis. Kann eine der Preiskonstanten ENUM_APPLIED_PRICE oder Handle eines anderen Indikators sein.

Rückgabewert

Gibt das Handle des angegebenen technischen Indikators zurück, beim Misserfolg gibt INVALID_HANDLE zurück. Um Computerspeicher aus nicht genutzten Indikatoren zu befreien, wird die Funktion IndicatorRelease() verwendet, zu deren Indikatorhandle passiert wird.

Hinweis

In einigen Systemen wird dieser Oscillator Histogramm MACD genannt.

Beispiel:

//+------------------------------------------------------------------+
//|                                                   Demo_iOsMA.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property description "Der Indikator zeigt, wie Daten erhalten werden sollen"
#property description "Indikator-Puffer für den technischen Indikator iOsMA."
#property description "Symbol und Zeitrahmen, in denen der Indikator berechnet wird,"
#property description "sind durch die Parameter symbol und period angegeben."
#property description "Erstellungsweise des Handles ist durch den 'type' Parameter (Typ der Funktion) angegeben."
#property description "Alle andere Parameter sind wie im normalen Indikator Moving Average of Oscillator."
 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- iOsMA bauen
#property indicator_label1  "iOsMA"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrSilver
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//+------------------------------------------------------------------+
//| Enumeration der Erstellungsweisen des Handles                    |
//+------------------------------------------------------------------+
enum Creation
  {
   Call_iOsMA,             // iOsMA verwenden
   Call_IndicatorCreate    // IndicatorCreate verwenden
  };
//--- Eingabeparameter
input Creation             type=Call_iOsMA;           // Funktionstyp
input int                  fast_ema_period=12;        // Periode der schnellen MA
input int                  slow_ema_period=26;        // Periode der langsamen MA
input int                  signal_period=9;           // Mittelungsperiode der Unterschied
input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE// Preistyp
input string               symbol=" ";                // Symbol
input ENUM_TIMEFRAMES      period=PERIOD_CURRENT;     // Zeitrahmen
//--- Indicator-Puffer
double         iOsMABuffer[];
//--- Eine Variable um Handle des Indikators iAMA zu speichern
int    handle;
//--- Variable für Speicherung
string name=symbol;
//--- Name des Indikators auf dem Chart
string short_name;
//--- die Anzahl der Werte im Indikator Moving Average of Oscillator gespeichert wird
int    bars_calculated=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Bindung von Array zum Indikator-Puffer
   SetIndexBuffer(0,iOsMABuffer,INDICATOR_DATA);
//--- das Symbol, auf das der Indikator gebaut wird, definieren
   name=symbol;
//--- Leerzeichen aus dem linken und rechten löschen
   StringTrimRight(name);
   StringTrimLeft(name);
//--- Wenn nach diesem die Länge des String name ist Null
   if(StringLen(name)==0)
     {
      //--- das Symbol aus dem Chart, auf dem der Indikator läuft, nehmen
      name=_Symbol;
     }
//--- Erstellen ein Handel des Indikators
   if(type==Call_iOsMA)
      handle=iOsMA(name,period,fast_ema_period,slow_ema_period,signal_period,applied_price);
   else
     {
      //--- die Struktur mit Werten von Indikatorparametern ausfüllen     
      MqlParam pars[4];
      //--- Schnelle Periode 
      pars[0].type=TYPE_INT;
      pars[0].integer_value=fast_ema_period;
      //--- Langsame Periode
      pars[1].type=TYPE_INT;
      pars[1].integer_value=slow_ema_period;
//--- Mittelungsperiode der Unterschied zwischen der schnellen und langsamen MA
      pars[2].type=TYPE_INT;
      pars[2].integer_value=signal_period;
      //--- Preistyp
      pars[3].type=TYPE_INT;
      pars[3].integer_value=applied_price;
      handle=IndicatorCreate(name,period,IND_OSMA,4,pars);
     }
//--- Wenn Handle konnte nicht erstellt werden
   if(handle==INVALID_HANDLE)
     {
      //--- darüber schreiben und Nummer des Fehlers anzeigen
      PrintFormat("Handle des Indikators iOsMA für das Paar %s/%s konnte nicht erstellt werden. Fehlercode ist %d",
                  name,
                  EnumToString(period),
                  GetLastError());
      //--- Arbeit des Indikators ist früher geendet
      return(INIT_FAILED);
     }
//--- Das Paar, Symbol/Zeitrahmen, auf deren Moving Average of Oscillator berechnet war, zeigen
   short_name=StringFormat("iOsMA(%s/%s,%d,%d,%d,%s)",name,EnumToString(period),
                           fast_ema_period,slow_ema_period,signal_period,EnumToString(applied_price));
   IndicatorSetString(INDICATOR_SHORTNAME,short_name);
//--- normale Initialisierung des Indikators    
   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[])
  {
//--- Anzahl der Werte des Indikators iOsMA zu kopieren
   int values_to_copy;
//--- Anzahl der berechneten Werte im Indikator finden
   int calculated=BarsCalculated(handle);
   if(calculated<=0)
     {
      PrintFormat("BarsCalculated() hat %d zurückgegeben, Fehlercode ist %d",calculated,GetLastError());
      return(0);
     }
//--- wenn dies der erste Start der Berechnung des Indikators ist oder die Anzahl der Werte im Indikator iOsMA geändert hat
//--- oder wenn Sie brauchen den Indikator für zwei oder mehr Balken (was bedeutet, dass etwas in der Geschichte verändert hat) zu berechnen
   if(prev_calculated==0 || calculated!=bars_calculated || rates_total>prev_calculated+1)
     {
      //--- wenn Array iOsMABuffer größer als die Anzahl der Werte in iOsMA auf symbol/period ist, dann kopieren wir nicht alles
      //--- sonst kopieren wir weniger als Größe der Indikator-Puffer
      if(calculated>rates_total) values_to_copy=rates_total;
      else                       values_to_copy=calculated;
     }
   else
     {
      //--- dann ist unser Indikator nicht das erste Mal berechnet, und seit dem letzten Aufruf von OnCalculate())
      //--- nicht mehr als ein Balken für die Berechnung hinzugefügt war
      values_to_copy=(rates_total-prev_calculated)+1;
     }
//--- Die Arrays mit den Werten aus dem Indikator iOsMA ausfüllen
//--- Wenn FillArrayFromBuffer false zurückgegeben hat, dann die Daten nicht bereit sind - das Werk vollenden
   if(!FillArrayFromBuffer(iOsMABuffer,handle,values_to_copy)) return(0);
//--- Nachricht bilden
   string comm=StringFormat("%s ==> Aktualisierte Werte im Indikator %s: %d",
                            TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS),
                            short_name,
                            values_to_copy);
//--- Hilfsnachrichtung auf dem Chart anzeigen
   Comment(comm);
//--- die Anzahl der Werte im Indikator Moving Average of Oscillator speichern
   bars_calculated=calculated;
//--- den Wert prev_calculated für den nächsten Anruf zurückgeben
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Indikator-Puffer aus dem Indikator iOsMA ausfüllen               |
//+------------------------------------------------------------------+
bool FillArrayFromBuffer(double &ama_buffer[],  // Indikator-Puffer der Werte von OsMA
                         int ind_handle,        // Handle des Indikators iOsMA
                         int amount             // Anzahl der Werte, die kopiert werden
                         )
  {
//--- Fehlercode rücksetzen
   ResetLastError();
//--- Teil des Arrays iOsMABuffer mit Werten auf Indikator-Puffer mit Index 0 ausfüllen
   if(CopyBuffer(ind_handle,0,0,amount,ama_buffer)<0)
     {
      //--- wenn die Kopie fehlschlägt, Fehlercode anzeigen
      PrintFormat("Daten konnte nicht aus dem Indikator iOsMA kopiert werden, Fehlercode ist %d",GetLastError());
      //--- Beenden mit Null-Ergebnis - dies bedeutet, dass der Indikator nicht berechnet wird
      return(false);
     }
//--- Alles gelang
   return(true);
  }
//+------------------------------------------------------------------+
//| Indicator deinitialization function                              |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(handle!=INVALID_HANDLE)
      IndicatorRelease(handle);
//--- Das Chart nach der Löschung des Indikators leeren
   Comment("");
  }