English Русский 中文 Español 日本語 Português
Die gleichzeitige Anzeige der einigen Indikatoren-Signale von vier Timeframes

Die gleichzeitige Anzeige der einigen Indikatoren-Signale von vier Timeframes

MetaTrader 4Beispiele | 17 Februar 2012, 16:31
718 0
Pavel Chigirev
Pavel Chigirev

Einführung

Beim manuellen Handel, im Unterschied mit einem mechanischen Handel, muss es ständig auf die Werte einiger Indikatoren beachtet werden. Wenn es die Indikatoren zum Beispiel, zwei oder drei gibt, und für den Handel eine Timeframe gewählt ist, so ist es gar keine unkomplizierte Aufgabe. Und wie man sonst so machen soll, wenn es die Indikatoren - fünf oder sechs gibt, und die Handelsstrategie verpflichtet, die Signale auf einigen Timeframes zu berücksichtigen? Außerdem, wenn der Handel über einigen Währungspaars gleichzeitig geführt wird? Die ähnliche Aufgabe wird kompliziert genug, und meistens wird es dabei Fehler gemacht, was als Folge Verluste bringen.

Speziell ist für die Lösung der ähnlichen Aufgaben wurde der Indikator Real_Time_MultiIndicator_v1 erstellt. Dieser Indikator berechnet die Signale der gewählten Indikatoren auf vier Timeframe gleichzeitig und er liefert sie in eine Tabelle im Unterfenster des Charts. In den Klammern nach dem Signal des Indikators wird die Anzahl der letzten Bars von der gegebenen Timeframe gezeigt, auf den dieses Signal demonstriert wird.

Sie können die Parameter der verwendeten Indikatoren ändern, auch Ihre eigenen Indikatoren hinzufügen. Nun reicht es einen Blick auf die Tabelle, wo die Signale der Indikatoren von vier Timeframes gesammelt sind, um die Entscheidung zu treffen.


Der Indikator Real_Time_MultiIndicator_v1

Alle Daten liefert der Indikator in ein getrenntes Unterfenster des Charts. Die Aussicht des Indikators:


In der Spalte INDICATOR werden die Namen der verwendeten Indikatoren gezeigt, und in den Klammern werden ihre Parameter gegeben. In den Spalten M15, M30, H1, H4 werden die Signale des Indikators auf den entsprechenden Timeframes mit dem Hinweis der Anzahl der Bars geliefert, auf den dieses Signal demonstriert wird. Wenn die historischen Daten laden oder fehlen, wird dann für diese entsprechende Timeframe die Nachricht Waiting data gezeigt. Wenn das Terminal zum Internet verbunden ist, werden die notwendigen Daten im Laufe von einigen Sekunden geladen.

Beachten Sie, dass in allen Indikatoren der mittlere Preis (High+Low)/2 verwendet wird, der sich von den standardmäßigen Werten unterscheiden kann. Beim Hinzufügen des Indikators zum Chart oder bei der Veränderung des Maßstabes des Hauptcharts kann sich die Tabelle mit den Daten entweder verengen werden ausbreiten. Keine Panik! Die Tabelle wird die gewohnheitsmäßige Art beim Eingang eines neuen Ticks übernehmen. Wenn Ihr Terminal mit dem Internet nicht verbunden ist, so machen Sie nach dem Wechsel des Maßstabes des Charts das Folgende: ersetzen Sie die Timeframe, zum Beispiel, von Н1 um Н4 und zurück, und die Tabelle wird die gewohnheitsmäßige Art übernehmen.

Für die Verwendung des Indikators muss man die Datei Real_Time_MultiIndicator_v1 laden. mq4 в \der Ordner mit dem Terminal\experts\indicators\ und das Terminal neu starten. Für den Anschluss des Indikators wählen wir im 'Navigator ' den Titel 'die Anwenderindikatoren', dann wählen wir Real_Time_MultiIndicator_v1. Weiter im Menü


Sie können die Farbe der Tabelle (TColor) und die Farbe des Textes (TxtColor), sowie die Parameter der verwendeten Indikatoren wählen. Wenn Sie die Parameter der Indikatoren ändern wollen, muss man das Folgende machen: vom rechten Knopf der Maus aufs Hauptchart drücken, und die Option 'die Liste der Indikatoren' auswählen oder, die Tasten Ctrl+I verwenden,


Weiter Real_Time_MultiIndicator_v1 wählen und, auf die Option 'Eigenschaften' drücken. Wenn die Veränderung der Indikatoren-Parameter nicht mühsam war, so wird das Hinzufügen des neuen Indikators einige Bemühungen fordern, sowie das Wissen MQL4 auf dem Anfangsniveau.


Das Hinzufügen des neuen Indikators in die Tabelle

Ich habe absichtlich die letzten drei Zeilen der Tabelle des Indikators nicht ausgefüllt, damit Sie die von Ihnen verwendeten oder geschriebenen Indikatoren hinzufügen konnten. Ich habe mich maximal bemüht, den Algorithmus der Berechnung und der Anzeige der Daten in die Tabelle zu vereinfachen. Außerdem habe ich die kommentieren Stücke des Codes im Anfangsprogramm gelassen, damit jeder, der das Anfangswissen MQL4 verfügt, die Indikatoren in die Tabelle hinzufügen konnte, dabei ins Detail der Arbeit des Algorithmus nicht versinken.

Ich werde unten auf dem Beispiel des Indikators Commodity Channel Index den Algorithmus des Hinzufügens eines neuen Indikators zur Tabelle demonstrieren. Beachten Sie, dass ich die Signale dieses Indikators auf folgender Weise interpretieren werde: die Werte des Indikators 0 – das Signal auf den Verkauf, und umgekehrt. Solche Interpretation unterscheidet sich etwas vom Klassischen, aber ich mache es speziell, um die Erklärung des Algorithmus zu vereinfachen. Nachher können Sie die Signale nach eigenem Ermessen interpretieren.

Wir wählen im 'Navigator ' den Titel 'die Anwenderindikatoren', dann wählen wir 'Ändern'.




Dann werden wir die Änderungen zu den Anfangscode übertragen:

//----Die Parameter der verwendeten Indikatoren
extern string p1 = "Die Parameter SAR";
extern double SAR_Step = 0.01;
extern double SAR_Max = 0.1;
extern string p2 = "Die Parameter MACD";
extern int Fast_EMA = 12;
extern int Slow_EMA = 26;
extern int MACD_SMA = 9;
extern string p3 = "Die Parameter Moving Average";
extern int Fast_MA = 5;
extern int Slow_MA = 10;
extern string p4 = "Die Parameter ADX";
extern int ADX_Period = 14;
//extern string p5 = "Die Parameter des Indikators 1";
//extern string p6 = "Die Parameter des Indikators 2";
//extern string p7 = "Die Parameter des Indikators 3";

In diesem Stück müssen die Kommentaren aus der Zeile mit dem Text "Die Parameter des Indikators 1" weggenommen werden und es muss der Name CCI hinzugefügt werden. Als Ergebnis bekommen wir:

extern string p5 = "Die Parameter CCI";

Nun fügen wir den Parameter des Indikators CCI-Periode hinzu:

extern string p5 = "Die Parameter CCI";
extern int Period_CCI = 14;

Weiter in die Zeile

string name[] = {"Parabolic SAR","MACD","Сrossing MA","ADX","","",""};

Wir geben den Namen des Indikators für die Anzeige in der Tabelle ein:

string name[] = {"Parabolic SAR","MACD","Сrossing MA","ADX","CCI","",""};

weiter im Initialisierungsblock des Indikators

  int init()

    {
     string sn = "Real_Time_MultiIndicator_v1";
     IndicatorShortName(sn);
     SetIndexLabel(0, sn);
     name[0] = name[0] + "(" + DoubleToStr(SAR_Step, 2) + ", " +
               DoubleToStr(SAR_Max, 2) + ")";
     name[1] = name[1] + "(" + DoubleToStr(Fast_EMA, 0) + ", " +
               DoubleToStr(Slow_EMA, 0) + ", " + 
               DoubleToStr(MACD_SMA, 0) + ")";
     name[2] = name[2] + "(" + DoubleToStr(Fast_MA, 0) + ", " +
               DoubleToStr(Slow_MA, 0) + ")";
     name[3] = name[3] + "(" + DoubleToStr(ADX_Period, 0) + ")";
     //name[4] = name[4] + "(" + 
     //          DoubleToStr(der erste Parameter des Indikators 1, 0) +
     //          ", " + DoubleToStr(der zweite Parameter des Indikators 1, 0) + ")";
     //name[5] = name[5] + "(" + 
     //          DoubleToStr(der erste Parameter des Indikators 2, 0) +
     //          ", " + DoubleToStr(der zweite Parameter des Indikators 2, 0) + ")";
     //name[6] = name[6] + "(" + 
     //          DoubleToStr(der erste Parameter des Indikators 3, 0) +
     //          ", " + DoubleToStr(der zweite Parameter des Indikators 3, 0) + ")";
     return(0);
    }

Wir nehmen die Kommentaren aus der Zeile weg

//name[4] = name[4] + "(" + 
//          DoubleToStr(der erste Parameter des Indikators 1, 0) +
//          ", " + DoubleToStr(der zweite Parameter des Indikators 1, 0) + ")";

und geben die folgenden Änderungen ein:

name[4] = name[4] + "(" + DoubleToStr(Period_CCI, 0) + ")";
Wir nehmen dann die Kommentaren aus dem Block weg:

/*
//+------------------------------------------------------------------+
//| Die Funktion 1                                                        |
//+------------------------------------------------------------------+
string die Funktion(int p)
  {
  int ii  = 1;
  if (Die Bedingung für den Indikator - true - sell, false - buy)
    {
      while (Die Bedingung für sell)
          ii++;
      if (Error(p,ii+1) == 1) return("Waiting data");
      return("Sell(" + DoubleToStr(ii, 0) + ")");
    }
  else
    {
      while (Die Bedingung für buy)
          ii++;
      if (Error(p,ii+1) == 1) return("Waiting data");
      return("Buy(" + DoubleToStr(ii, 0) + ")");
    }
  }*/

statt dem Wort 'Funktion' schreiben wir den Namen der Funktion, zum Beispiel, CCI:

string CCI(int p)

Nun schreiben wir statt der Zeile “Die Bedingung für den Indikator - true - sell, false - buy” die Bedingung für das Signal auf den Verkauf für die laufenden (nullwertigen) Bar:

iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < 0

Weiterhin statt der Zeile “die Bedingung sell” schreiben wir die Bedingung für das Signal auf den Kauf und für die Berechnung der Anzahl der gebildeten Bars, auf den dieses Signal demonstriert wird:

while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) < 0)

hier ii - die Verschiebung bezüglich der laufenden Bar. Ähnlich ändern wir die Zeile while (Die Bedingung für buy) um

while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) > 0)

Als Ergebnis bekommen wir:

string CCI(int p)
  {
   int ii = 1;
   if(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < 0)
    {
      while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) < 0)
          ii++;
      if(Error(p, ii + 1) == 1) 
          return("Waiting data");
      return("Sell(" + DoubleToStr(ii, 0) + ")");
    }
  else
    {
      while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) > 0)
          ii++;
      if(Error(p, ii + 1) == 1) 
          return("Waiting data");
      return("Buy(" + DoubleToStr(ii, 0) + ")");
    }
  }

Wenn Sie Signale von der Ebene 100 und-100 berechnen wollen, und den Abstand (-100;100) nicht als das Signal zum Kauf oder Verkauf interpretieren, muss man 0 um den Wert -100 und 100 für sell und buy entsprechend ändern und die nächste Zeile für die Anzeige der Tatsache der Unbestimmtheit in der Tabelle hinzufügen:

if(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) > -100) && 
   iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < 100))
    return("N/A");

Als Ergebnis bekommen wir:

 string CCI(int p)
   {
    int ii = 1;
    if((iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) > -100) && 
       (iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < 100) )
        return("N/A");
    if(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, 0) < -100)
      {
        while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) < -100)
            ii++;
        if(Error(p, ii + 1) == 1) 
            return("Waiting data");
        return("Sell(" + DoubleToStr(ii, 0) + ")");
      }
    else
      {
        while(iCCI(NULL, p, Period_CCI, PRICE_MEDIAN, ii) > 100)
            ii++;
        if(Error(p, ii + 1) == 1) 
            return("Waiting data");
        return("Buy(" + DoubleToStr(ii, 0) + ")");
      }
   }
Jetzt müssen die Ergebnisse der Berechnung in die Tabelle geliefert werden. Dafür machen wir das Folgende: wir finden im Texte des Programms einen Teil des Codes
/*//----------die fünfte Zeile   
  for (i = 1; i <= 4; i++)
     {
       ObjectDelete("6" + DoubleToStr(i, 0));
       ObjectCreate("6" + DoubleToStr(i, 0), OBJ_TEXT, 
                           WindowFind("Real_Time_MultiIndicator_v1"), textT[i+1], textC[6]);
       ObjectSetText("6" + DoubleToStr(i, 0), die Funktion(per[i-1]), 13, "Tahoma", TxtColor);
    }*/
und wir nehmen von ihr die Kommentaren weg. Da die Koordinaten für die Anzeige des Textes berechnet sind, ermöglicht es die Auffüllung der Tabelle unter Verwendung der Loop. Es ist genügend, die Funktion zu bezeichnen, die die Ergebnisse rechnet. Danach statt dem Wort 'Funktion' schreiben wir den Namen unserer Funktion. Als Ergebnis bekommen wir:

 //----------die fünfte Zeile   
 for (i=1;i<=4;i++)
   {
     ObjectDelete("6" + DoubleToStr(i, 0));
     ObjectCreate("6" + DoubleToStr(i, 0), OBJ_TEXT,
                  WindowFind("Real_Time_MultiIndicator_v1"),
                  textT[i+1], textC[5]);
     ObjectSetText("6" + DoubleToStr(i, 0), CCI(per[i-1]), 13, 
                   "Tahoma", TxtColor);
   }

Jetzt drücken wir auf den Knopf 'kompilieren'. Wir gehen ins Terminal und verbinden den Indikator zum Chart. Als Ergebnis bekommen wir:


Wenn Sie Timeframes ändern wollen, auf den die Werte der Indikatoren berechnet werden, so muss das Folgende machen.

In der Zeile:

int per[] = {15,30,60,240};

muss man die Anzahl der Minuten für die ausgewählten Timeframe eingeben, zum Beispiel:

int per[] = {5,30,60,240};
und in der Zeile:
string nameS[] = {"INDICATOR","M15","M30","H1","H4"}
muss man seinen Namen eingeben:
string nameS[] = {"INDICATOR","M5","M30","H1","H4"};

und kompilieren. Als Ergebnis bekommen wir:


Die Fehlerbehebung der Parameter auf der History

Den hier beschriebenen Indikator kann man nur im Modus der Online-Zeit verwenden. Es hängt damit zusammen, dass die normalen Werte des Indikators beim Test im Modus der Visualisierung nur auf der laufenden testenden Timeframe gezeigt werden. Es sind die Besonderheiten des Terminalen und Testers. Wenn Sie die Parameter der Indikatoren auswählen wollen oder Ihre eigene Strategie bei der Visualisierung des Tests auf der History prüfen wollen, so biete ich an, Real_Time_MultiExpert_v1 zu verwenden. Die Funktionen, die Real_Time_MultiIndicator_v1 und Real_Time_MultiExpert_v1 aufführen, sind gleich. Der Anfangskode dieser Programme ist tatsächlich identisch, deshalb geht die Änderung des Codes des Experten nach dem gleichen Algorithmus, genauso wie die Änderung in den Code des Indikators. Für die Verwendung des Experten muss man die Datei Real_Time_MultiExpert_v1.mq4 in den Ordner des Terminalen \experts\ laden, und Real_Time_MultiIndicator_v2.mq4 in den \Ordner mit dem Terminal \experts\indicators\ mq4 в \der Ordner mit dem Terminal\experts\indicators\ und das Terminal neu starten..

Für die Verwendung Real_Time_MultiExpert_v1 muss man das Muster unter dem Namen Real_Time_MultiExpert_v1 mit dem Hinzufügen zum Chart des Indikators Real_Time_MultiIndicator_v2 erstellen. Die Aufgabe des Indikators Real_Time_MultiIndicator_v2 besteht in der Erstellung des Unterfensters unter dem Chart mit dem notwendigen Maßstab. Dann wählen Sie im Feld des Testers 'EA' Real_Time_MultiExpert_v1 aus, und im Feld 'das Modell' wünschenswert den Punkt 'Aller Ticks' sonst werden sich die Messwerte des EAs auf der laufenden (nullwertigen) Bar von der Wirklichkeit unterscheiden, aber insgesamt werden die Messwerte rechtmäßig sein.


Vergessen Sie nicht, den Knopf der automatischen Verschiebung des Charts zu drücken:

Weiter wählen wir den Punkt "Visualisierung" und drücken den Knopf "Start".

Im Fenster Real_Time_MultiIndicator_v2 wird die Tabelle mit den Signalen der Indikatoren dargestellt. Die Timeframe für den Test kann jede gewählt werden, da die Werte der Indikatoren von ihr nicht abhängig sind. Es gibt keinen prinzipiellen Unterschied zwischen dem hier beschriebenen Experten und dem Indikator, deswegen das, was Sie verwenden werden, - die Geschmackssache. Von meiner Sicht, im Modus der Online-Zeit ist es viel bequemer, den Indikator zu verwenden.


Fazit

Im vorliegenden Artikel ist eine der Art der Sammlung und Ordnung der wichtigen Informationen über den Zustand des Marktes betrachtet worden, und zwar - der Signalen einiger Indikatoren von vier Timeframes. Jedoch kann die ähnliche Methode für die Lösung des breiten Spektrums der Aufgaben verwendet werden. Mit Hilfe der beschriebenen Programme kann man die notwendigen Parameter der verwendeten Indikatoren beim Test auf der History der Notierungen auswählen. Der beschriebene Indikator ist für die Verwendung beim manuellen Handel vorgesehen.

Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/ru/articles/1461

Schlafen oder nicht schlafen? Schlafen oder nicht schlafen?
Eine alternative Nutzung der Sleep() Funktion bei der Realisierung von Pausen zwischen den Aktionen des Expert Advisors wird vorgeschlagen. Dieser Ansatz, wenn er berücksichtigt wird, ermöglicht eine intelligente Nutzung der Maschinenzeit.
Die Individualpsychologie eines Traders Die Individualpsychologie eines Traders
Das Verhalten des Traders auf dem Finanzmarkt. Die persönliche Sammlung des Autors aus dem Buch von A. Elder "Trading for a Living".
Besonderheiten von Expert Advisors Besonderheiten von Expert Advisors
Expert Advisors im Handelssystem MetaTrader 4 schreiben und testen
Das Start des Client-Terminalen MetaTrader 4 auf dem Linux-desktop Das Start des Client-Terminalen MetaTrader 4 auf dem Linux-desktop
Es wurde Schritt um Schritt die Vorbereitung des Linux-desktops mit der Verwendung des nicht-Emulators wine beschrieben, um den Client-Terminal MetaTrader 4 auf ihm zu starten.