MetaTrader 5 herunterladen

Benachrichtigung und Kommentar für Externe Indikatoren. Multi-Währungs-Analyse durch Externes Scannen

29 April 2016, 14:22
Vladimir
0
238

Einführung

In den vorherigen Artikel haben wie gesehen, wie Informationen von Indikatoren empfangen werden können, die Wingdings-Symbole verwenden, angezeigt in einem Chart als Informationsquelle ("Alert and Comment for External Indicators") und wie man Indikator-basierte Benachrichtigungen erzeugt, in Bezug auf Indikatoren, die Indikator-Puffer zum Speichern von Informationen verwenden ("Benachrichtigung und Kommentar für Externe Indikatoren. Teil Zwei"), während die Informationsausgabe über Farbänderung umgesetzt wird.

Überkreuzung von Indikator-Linien, die in Indikator-Puffern gespeichert werden, stellen einen anderen Weg dar, den Nutzer über das Indikatorverhalten zu informieren.

Wie wir bereits gesehen haben, ist der Empfang von Werten aus Indikator-Puffern in sich nichts kompliziertes, das die Prozessorlast beeinflussen kann. In unserem Indikator, werden wir daher die Möglichkeit der Anzige von Multi-Währungs-Informationen umsetzen.

Wenn die Anzahl der verfügbaren Instrumente groß ist, kämpft der Trader mit erheblicher Belastung der Augen, verursacht durch ständiges Überwachen der Charts. Also wählen Trader oft nur ein paar Symbole und handeln ausschließlich auf diesen.

Es kann sich später herausstellen, dass es eine Möglichkeit zum Ausführen eines Trades gab, oder eine Anzahl an Trades für ein anderen Währungspaar, dessen Chart genau im richtigen Moment nicht auf dem Bildschirm geöffnet war. Aus diesem Grund benötigen wir die Multi-Währungs-Analyse verfügbarer Instrumente.

Daraus basierend, kam mir der Gedanke zur Verwendung einer Indikator-basierten Benachrichtigungsfunktion, als ein Weg Informationen über Änderungen in der Liste der verfügbaren Instrumente schnell anzuzeigen.



Die Benachrichtigung basiert auf einem Multi-Währungen Indikator

Werfen wir zunächst einen Blick auf den Block zur Datenverarbeitung, der Informationen aus den Indikator-Puffern externer Indikatoren erhält.

double buffer1, buffer2, buffer12, buffer22;
// Analyze the first and second bars in the charts
            buffer1  = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff1, 1);
            buffer12 = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff1, 2);
            buffer2  = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff2, 1);
            buffer22 = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff2, 2);
            if(buffer12<=buffer22&&buffer1>buffer2)
               {
                  Alert (text+"UP"); // There is a crossover
                  send_email (text+"UP");
                  return (1);
               }
            if(buffer12>=buffer22&&buffer1<buffer2)
               {
                  Alert (text+"DN"); // There is a crossover
                  send_email (text+"DN");
                  return (1);
               } 
            return (0);

Wie wir sehen, ist hier alles einfach. Wir sind einer ähnlichen Logik im vorherigen Artikel begegnet. Letztes Mal verwendeten wir die Änderung in der Farbe der angezeigten Puffer, Während wir hier Positionswerte dieser Puffer relativ zueinander verwenden.

Die erforderliche Verarbeitung wird als separater Block umgesetzt. Die Multi-Währungs- und Multi-Zeitrahmen-Analyse wird die wiederholte Anwendung dieses Verfahrens erfordern.

Die Liste der verfügbaren Instrumente wird in einer externen Datei gespeichert, was es ermöglicht den Vorgang zum vornehmen von Änderungen zu vereinfachen, für den Fall, dass irgendwelche Modifikationen in der Zukunft erforderlich sind. Mit diesem Ansatz, um die Liste der verfügbaren Instrumente zu ändern, kann der Nutzer sie unabhängig neu erstellen oder Änderungen vornehmen, ohne den Programmcode des Indikators ändern zu müssen.

Am Ende des Artikels werden Sie sehen, wie Sie eine benutzerdefinierte Datei der verfügbaren Instrumente erstellen.

Ein Unterprogramm zum Lesen der Dateidaten wird im Folgenden bereitgestellt.

//+------------------------------------------------------------------+
//|                                           SymbolList_fromSet.mq4 |
//|                                      Copyright © 2006, komposter |
//|                                      mailto:komposterius@mail.ru |
//+------------------------------------------------------------------+
void LoadFileToSymbol()
   {
      {
              int file_handle = FileOpen(SetFile_name + ".set", FILE_READ);
              //---- If an error occurred
              if(file_handle < 0)
                {
                         Print("Error No.", GetLastError(), " when opening the file!!!");
                         return(-1);
                }
              int SymbolsCount = 0;
              while(true)
                {
                         Symbols[SymbolsCount] = FileReadString(file_handle);
                         //---- If you have reached the end of the file, stop
                         if(GetLastError() == 4099) 
                             break;
                         if(FileIsEnding(file_handle)) 
                             break;
                         SymbolsCount ++;
                         ArrayResize(Symbols, SymbolsCount + 1);
                }
              FileClose(file_handle);
      }
   
   }  
//--------------------------------------------------------------+

Jetzt, nach dem Vorbereiten des Array von Instrumenten, müssen wir nur die Verarbeitung der Multi-Zeitrahmen umsetzen.

Wir beginnen die Berechnungen mit dem aktuellen Zeitrahmen.

// Analyze the array of symbols (Calculations on the current and all lower time frames)
         for (int i=0; i<ArraySize(Symbols); i++)
            {  Total = 0;
               switch (Period())
                  {
                     case 43200: Total = Total +  process ( Symbols[i], 43200);
                     case 10080: Total = Total +  process ( Symbols[i], 10080);
                     case  1440: Total = Total +  process ( Symbols[i],  1440);
                     case   240: Total = Total +  process ( Symbols[i],   240);
                     case    60: Total = Total +  process ( Symbols[i],    60);
                     case    30: Total = Total +  process ( Symbols[i],    30);
                     case    15: Total = Total +  process ( Symbols[i],    15);
                     case     5: Total = Total +  process ( Symbols[i],     5);
//                     case     1: Total = Total +  process ( Symbols[i],     1);
                  }

Die Berechnungen werden von dem aktuellen Zeitrahmen zu dem niedrigsten Zeitrahmen gemacht. Wenn die Berechnung der Benachrichtigung also bei dem Tages-Zeitrahmen beginnen soll, muss das Chart mit dem angehangenen Indikator auf dem Tages-Zeitrahmen geöffnet sein. Wenn Sie das Signal beginnend ab dem stündlichen Zeitrahmen benötigen, muss der Zeitrahmen des Charts 1-Stunde sein, und so weiter. Der Indikator wird nur auf jeden neuen Balken neu berechnet.

Ein solcher Ansatz versetzt den Nutzer in die Lage Neuberechnungen des Indikators in einer komfortableren Art und Weise zu handhaben: Sie ändern einfach den arbeitenden Zeitrahmen, ohne zusätzliche Parameter hinzuzufügen und Berechnungsfunktionen zum Code.

Der String für die Arbeit mit dem Minuten-Zeitrahmen ist auskommentiert. Der Kommentar muss entfernt werden, wenn Sie den Indikator auf dem Minuten-Zeitrahmen verwenden möchten.

//                     case     1: Total = Total +  AlertComment ( Symbols[i],     1);

Der an den Artikel angehangene 2MA_forAlert.mq4 Indikator wird als die Datenquelle für unseren Indikator verwendet. 2MA_forAlert ist ein einfacher Indikator, der zwei MA-Linien anzeigt. Sie können auch jeden anderen Indikator verwenden, der zwei Puffer (zwei Linien) hat, z.B. Stochastik, MACD, usw.

Dies ist es, wie die Terminal-Benachrichtigung aussieht, wenn verschiedene Indikatoren verwendet werden:

Die Puffer, in denen die Linien-Werte gespeichert werden, können eine unterschiedliche Reihenfolge haben. Zum Beispiel:

0 - Hauptlinie

1 - Signallinie

oder

0 - Signallinie

1 - Hauptlinie

Also, wenn Sie den externen Indikator verwenden, sollten Sie selbst die Reihenfolge bestimmen, in der die Linien verwendet werden. Im Falle einer inkorrekten Benachrichtigung müssen die Eingabeparameter geändert werden.

extern int       ExtBuff1      = 0;
extern int       ExtBuff2      = 1;

Alle 8 verfügbaren Puffer (Nummern 0 bis 7) können als Parameter verwendet werden.

Um zu sehen, dass der Indikator die externe Datei mit einer Liste an Instrumenten verwendet, werde ich Ihnen zeigen, wie Sie in dem Terminal erzeugt werden kann.

Zuerst erstellen wir alle notwendigen Instrumente in dem Datenfenster, und zu diesem Zweck werden wir:

1. Öffnen Sie alle verfügbaren Instrumente.

2. Belassen Sie nur diejenigen von ihnen, die Signale erhalten werden.

Es sollten so viele Instrumente sein, wie für das Trading benötigt werden.

3. Dann machen Sie einen Rechtsklick auf dem Marktübersicht-Fenster um die Datei zu speichern.

4. Die Datei sollte in dem Ordnergespeichert werden, der die Expert Advisor Dateien von MetaTrader enthält.

Die Datei kann jeden Namen erhalten, aber die .set Dateierweiterung kann verändert werden. Das in dem Artikel bereitgestellte Beispiel verwendet die forexall.set Datei.

extern string    SetFile_name  = "forexall"; // File that contains symbols of user instruments


Nach dem Erzeugen der Datei, müssen Sie die Charts für jedes Symbol eins nach dem anderen öffnen, damit das Terminal die Historie lädt. Ansonsten kann eines der Instrumente aus der Verarbeitung herausfallen.

Wenn Sie die Datei in dem Standardordner \experts\ symbolsets gespeichert haben, stellen Sie sicher, dass Sie ihn in den MetaTrader \experts\files Ordner kopieren, da dies der einzige Ordner ist, von dem der Indikator die Datei öffnen kann (MetaTrader Einschränkungen). In dem Indikator sollten Sie ferner den Namen der Datei eingeben, die zum Lesen der in ihr enthaltenen Instrumente verarbeitet wird.

Sie haben außerdem die Möglichkeit Informationen über den Multi-Währungsscanner-Betrieb per E-Mail zu erhalten. Setzen Sie einfach den entsprechenden Parameterwert auf true und erhalten Sie Signale per E-Mail.

extern bool      Signal_email  = false;

Es gibt Nutzer, die mit der Code-Entwicklung weiter fortfahren durch die Umsetzung einer Umleitung, um Signale via SMS auf ihr Mobiltelefon zu erhalten. Jeder Ansatz ist anders.

Alle Indikatoren sollten sich in dem MetaTrader \experts\indicators Ordner befinden.



Fazit

Dieser Ansatz ermöglicht es Ihnen Benachrichtigung-Funktionen zu verwenden, um Ihren eigenen Informationsraum von verschiedenen Modulen aufzubauen, ohne Programmieren lernen zu müssen oder einen Fachmann zu suchen, der Ihe Idee in ein Programm umsetzen kann. Die Hauptsache ist für uns, aktuelle Informationen zu erhalten.

Abschließend stelle ich den vollständigen Code des Alert Indikator bereit.

//+------------------------------------------------------------------+
//|                                                    Alert_MT4.mq4 |
//|                                      Copyright ɠ2009, Fibook.ru |
//|                                             http://www.fibook.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright ɠ2009, Fibook.ru"
#property link      "http://www.fibook.ru"

#property indicator_chart_window

extern string    SetFile_name="forexall"; // File that contains symbols of user instruments
extern string    nameIndicator = "input indicator name";
extern int       ExtBuff1      = 0;
extern int       ExtBuff2      = 1;
extern string    UserText      = "Cross";
extern bool      Signal_email  = false;

string Symbols[1],text;
int expBars=0;
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
// If there is no new bar, exit
   if(!isNewBar()) return;
   int Total;
//---- Check for input parameter errors
   if(ControlError()==false) return;
//---- Load symbols from the file to the Symbols array
   LoadFileToSymbol();
//----

// Analyze the array of symbols (Calculations on the current and all lower time frames)
   for(int i=0;i<ArraySize(Symbols);i++)
     {
      Total=0;
      switch(Period())
        {
         case 43200: Total = Total +  process ( Symbols[i], 43200);
         case 10080: Total = Total +  process ( Symbols[i], 10080);
         case  1440: Total = Total +  process ( Symbols[i],  1440);
         case   240: Total = Total +  process ( Symbols[i],   240);
         case    60: Total = Total +  process ( Symbols[i],    60);
         case    30: Total = Total +  process ( Symbols[i],    30);
         case    15: Total = Total +  process ( Symbols[i],    15);
         case     5: Total = Total +  process ( Symbols[i],     5);
         //                     case     1: Total = Total +  process ( Symbols[i],     1);
        }
      if(Total>1)
        {
         text=StringConcatenate(" Warning!!!      ",Symbols[i]," have ",UserText," for ",Total," TF");
         Alert(text);
         send_email(text);
        }
     }

//----
   return(0);
  }
//+------------------------------------------------------------------+

int process(string Sym_,int TF)
  {
   text=StringConcatenate(Sym_," ",TF," indicator ",nameIndicator," Crossing line ");
   double buffer1,buffer2,buffer12,buffer22;
// Analyze the first and second bars in the charts
   buffer1  = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff1, 1);
   buffer12 = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff1, 2);
   buffer2  = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff2, 1);
   buffer22 = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff2, 2);
   if(buffer12<=buffer22 && buffer1>buffer2)
     {
      Alert(text+"UP"); // There is a crossover
      send_email(text+"UP");
      return(1);
     }
   if(buffer12>=buffer22 && buffer1<buffer2)
     {
      Alert(text+"DN"); // There is a crossover
      send_email(text+"DN");
      return(1);
     }
   return(0);

  }
//+------------------------------------------------------------------+
//|                                           SymbolList_fromSet.mq4 |
//|                                      Copyright ɠ2006, komposter |
//|                                      mailto:komposterius@mail.ru |
//+------------------------------------------------------------------+

void LoadFileToSymbol()
  {
     {
      int file_handle=FileOpen(SetFile_name+".set",FILE_READ);
      //---- If an error occurred
      if(file_handle<0)
        {
         Print("Error No.",GetLastError()," when opening the file!!!");
         return(-1);
        }
      int SymbolsCount=0;
      while(true)
        {
         Symbols[SymbolsCount]=FileReadString(file_handle);
         //---- If you have reached the end of the file, stop
         if(GetLastError()==4099)
            break;
         if(FileIsEnding(file_handle))
            break;
         SymbolsCount++;
         ArrayResize(Symbols,SymbolsCount+1);
        }
      FileClose(file_handle);
     }

  }
//--------------------------------------------------------------+
void send_email(string text)
  {
   if(Signal_email==true) SendMail("Alert ",text);
  }
//--------------------------------------------------------------+
bool ControlError()
  {
// Check whether the indicator name has been entered
   if(nameIndicator=="input indicator name")
     {
      Alert("Enter the indicator name ");
      return(false);
     }
// Check whether the file containing the symbols exists
   int handle;
   handle=FileOpen(SetFile_name+".set",FILE_CSV|FILE_READ,';');
   if(handle<1)
     {
      Alert("The ",SetFile_name,".set file could not be found, last error ",GetLastError());
      return(false);
     }
// Check if there is any error in the assignment of input variables of the analyzed indicator buffers
   if(ExtBuff1>7 || ExtBuff2>7)
     {
      Alert("Incorrect parameters of the ExtBuff1 or ExtBuff2 buffer");
      return(false);
     }
   if(ExtBuff1==ExtBuff2)
     {
      Alert("Error: ExtBuff1 and ExtBuff2 cannot be equal");
      return(false);
     }

   return(true);
  }
/*----------------------------------------------------------------------+
 |The function will return true if the new bar appears, otherwise false |
 +---------------------------------------------------------------------*/
bool isNewBar()
  {
   bool res=false;
   if(expBars!=Bars)
     {
      expBars=Bars;
      res=true;
     }
   return(res);
  }
//+------------------------------------------------------------------+

Übersetzt aus dem Russischen von MetaQuotes Software Corp.
Originalartikel: https://www.mql5.com/ru/articles/1371

Beigefügte Dateien |
2MA_forAlert.mq4 (2.72 KB)
Alert_MT4.mq4 (6.31 KB)
RSS News Feeds lesen mit Mitteln von MQL4 RSS News Feeds lesen mit Mitteln von MQL4

Dieser Artikel befasst sich mit einem Beispiel des Lesens von RDD-Markup durch Mittel von MQL4 mit den Funktionen zur HTML-Tag Analyse. Wir werden versuchen ein Arbeitsstück anzufertigen, das in einen News-Indikator oder einfach in einen RSS-Reader in MQL4 Sprache geändert werden kann.

LibMatrix: Bibliothek der Matrix Algebra (Teil Eins) LibMatrix: Bibliothek der Matrix Algebra (Teil Eins)

Der Autor macht die Leser vertraut mit einer einfachen Bibliothek der Matrix Algebra und stellt Beschreibungen und Besonderheiten der wichtigsten Funktionen bereit.

Benachrichtigung und Kommentar für Externe Indikatoren (Teil Zwei) Benachrichtigung und Kommentar für Externe Indikatoren (Teil Zwei)

Seit ich den Artikel "Benachrichtigung und Kommentar für Externe Indikatoren" veröffentlicht habe, empfing ich viele Bitten und Anfragen bezüglich der Möglichkeit der Entwicklung eines externen Informanten, dessen Betrieb auf Indikatorlinien basiert. Nachdem die Fragen analysiert waren, habe ich beschlossen mit dem Thema fortzufahren. Der Erhalt von in den Indikator-Puffern gespeicherten Daten stellte sich als ein weiterer Interessenbereich der Nutzer heraus.

Wie Zuverlässig ist Nacht-Trading? Wie Zuverlässig ist Nacht-Trading?

Der Artikel behandelt die Besonderheiten des flachen Nacht-Trading auf Cross-Währungspaare. Er erklärt wo Sie Gewinne erwarten können, und warum große Verluste nicht unwahrscheinlich sind. Außerdem beinhaltet der Artikel auch ein Beispiel des für Nacht-Trading entwickelten Expert Advisor und spricht über die praktische Anwendung dieser Strategie.