Diskussion zum Artikel "Eine neue Schiene: Benutzerdefinierte Indikatoren in MQL5"

 

Neuer Artikel Eine neue Schiene: Benutzerdefinierte Indikatoren in MQL5 :

Ich werde nicht alle neuen Möglichkeiten und Funktionen des neuen Terminals und der Sprache aufzählen. Sie sind zahlreich und einige der Neuheiten sind eine Diskussion in einem eigenen Beitrag wert. Auch gibt es hier keinen Code, der mit objektorientierter Programmierung geschrieben wurde. Das Thema ist zu wichtig, um es nur im Kontext zusätzlicher Vorteile für Entwickler zu erwähnen. In diesem Beitrag gehen wir auf Indikatoren, ihre Struktur, Zeichnung, Typen und Programmierdetails im Vergleich zu MQL4 ein. Ich hoffe, dass dieser Beitrag für Einsteiger und erfahrene Entwickler hilfreich sein wird. Vielleicht entdeckt auch jemand etwas Neues.

Autor: Комбинатор

 

Jetzt verstehe ich etwas nicht, muss ich 2 Puffer für sie machen, um High & Low einer anderen Periode im Indikator zu haben????


und in dem Artikel

CopyHigh


warum die Funktionen nicht richtig funktionieren, z.B:

//+------------------------------------------------------------------+
//| Erhalte High für eine gegebene Bar-Nummer|
//+------------------------------------------------------------------+
doubleiHigh(stringsymbol,ENUM_TIMEFRAMES timeframe,int index)
{
double high=0;
ArraySetAsSeries(High,true);
intkopiert=CopyHigh(Symbol,Zeitrahmen,0,Bars(Symbol,Zeitrahmen),High);
if(kopiert>0 && index<kopiert) high=High[index];
return(high);
}

 

Was bedeutet "falsch"? Sie sollten konkrete Beispiele anführen, anstatt allgemeine Aussagen wie "alles ist schlecht" zu machen.

Versuchen Sie, das Beispiel aus dem Abschnitt CopyHigh() auszuführen:

//+------------------------------------------------------------------+
//|HighAndLow.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. | |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

#property description "Beispiel für die Ausgabe von High[i]- und Low[i]-Werten"
#property description "für nach dem Zufallsprinzip ausgewählte Stäbe".

double High[],Low[];
//+------------------------------------------------------------------+
//|| Tiefstwert für eine bestimmte Taktnummer ermitteln
//+------------------------------------------------------------------+
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+
//| Hoch für eine bestimmte Taktnummer erhalten
//+------------------------------------------------------------------+
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+
//| Experten-Tick-Funktion|
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Hoch- und Tiefstwerte für den Balken mit Index bei jedem Tick anzeigen,
//--- gleich der Sekunde der Ankunft des Ticks
   datetime t=TimeCurrent();
   int sec=t%60;
   printf("High[%d] =%G  Low[%d] =%G",
          sec,iHigh(Symbol(),0,sec),
          sec,iLow(Symbol(),0,sec));
  }
//+------------------------------------------------------------------+

Das ist das, was ich bekommen habe, es zeigt alles richtig an.



 
Rosh   :

Was bedeutet "falsch"? Sie sollten konkrete Beispiele anführen, anstatt allgemeine Aussagen wie "alles ist schlecht" zu machen.

Versuchen Sie, das Beispiel aus dem Abschnitt CopyHigh() auszuführen:

Das ist das, was ich bekommen habe, es zeigt alles korrekt an.




Ich entschuldige mich für die Unkonkretheit der Behauptungen.

Ich habe den Eindruck, dass wenn eine Funktion geschrieben wird, impliziert wird, dass sie unter verschiedenen Parametern funktioniert. Ansonsten machen sie einfach keinen Sinn.

Fügen wir den TimeFrame-Parameter hinzu. Und testen wir das Programm mit einem anderen Parameter, z. B. gleich dem aktuellen, d. h. setzen wir ihn z. B. auf PERIOD_D1 in einem Tagesdiagramm.


//+------------------------------------------------------------------+
//|HighAndLow.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. | |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#property description "Beispiel für die Ausgabe von High[i]- und Low[i]-Werten"
#property description "für nach dem Zufallsprinzip ausgewählte Stäbe".

double High[],Low[];
input ENUM_TIMEFRAMES TimeFrame;
//+------------------------------------------------------------------+
//|| Tiefstwert für eine bestimmte Taktnummer ermitteln
//+------------------------------------------------------------------+
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+
//| Hoch für eine bestimmte Taktnummer erhalten
//+------------------------------------------------------------------+
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+
//| Experten-Tick-Funktion|
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Hoch- und Tiefstwerte für den Balken mit Index bei jedem Tick anzeigen,
//--- gleich der Sekunde der Ankunft des Ticks
   datetime t=TimeCurrent();
   int sec=t%60;
   printf("High[%d] =%G  Low[%d] =%G",
          sec,iHigh(Symbol(),TimeFrame,sec),
          sec,iLow(Symbol(),TimeFrame,sec));
  }
//+------------------------------------------------------------------+
 
zfs   :


Ich entschuldige mich für die Ungenauigkeit der Aussagen.

Ich habe den Eindruck, dass man, wenn man eine Funktion schreibt, davon ausgeht, dass sie mit verschiedenen Parametern funktioniert. Andernfalls machen sie einfach keinen Sinn.

Fügen wir den TimeFrame-Parameter hinzu. Und testen wir das Programm mit einem anderen Parameter, der z.B. gleich dem aktuellen ist, d.h. setzen wir ihn z.B. gleich PERIOD_D1 auf einem Daily Chart.



Ich habe Ihre Variante geprüft - sie funktioniert ebenfalls korrekt. Ich habe es als Skript auf dem D1-Zeitrahmen mit den Parametern H1 und D1 ausgeführt. Die Werte waren korrekt (ich habe die letzten drei Bars überprüft)

Dateien:
 
Rosh   :


Ich habe Ihre Variante überprüft - sie funktioniert auch korrekt. Ich habe es als Skript auf dem D1-Zeitrahmen mit den Parametern H1 und D1 ausgeführt. Die Werte waren korrekt (ich habe die letzten drei Bars überprüft)



Ja, es funktioniert gut. Offenbar ist es mein Fehler, ich meine die Richtung der Arrays. Aber warum ich beim Testen andere Daten erhalten habe, bleibt ein Geheimnis für mich. Ich danke Ihnen für Ihre Aufmerksamkeit. Wenn man etwas Neues anfängt, hat man immer Zweifel.
 

Ich habe gerade angefangen zu lernen. Ich habe es heruntergeladen und in den Ordner D:/\MetaTrader 5/ MQL5/Indikatoren gelegt.

Ich habe es kompiliert und auf den Chart gelegt, aber einige Indikatoren zeigen nichts an ((.

Sollte das so sein, oder habe ich etwas falsch gemacht?

Die Indikatoren CrossMa.mq5, Toned_WPR.mq5 und HistogramSample.mq5 werden nicht angezeigt.

die anderen funktionieren

 
Rosh:

Was bedeutet "falsch"? Sie sollten konkrete Beispiele anführen, anstatt allgemeine Aussagen wie "alles ist schlecht" zu machen.

Versuchen Sie, das Beispiel aus dem Abschnitt CopyHigh() auszuführen:

Das ist, was ich bekommen habe, es zeigt alles korrekt an.



Kopieren Sie das gesamte Array der Daten?

Ich denke, es ist sehr unwirtschaftlich, 1 Element zu kopieren.

 

Prival:

Soll das so sein, oder habe ich etwas falsch gemacht?

Hallo, Sergei. Dieser Artikel wurde in der Hitze des Gefechts geschrieben, für die allerersten öffentlichen Builds. Seitdem hat sich viel geändert, vielleicht müssen einige Indikatoren verbessert werden.

Ich werde ihn überarbeiten, sobald ich Zeit habe.

 
Die beigefügten Quellcodedateien und die Quellcodeeinschübe im HTML-Code sind jetzt vollständig ins Portugiesische übersetzt, um Ihnen die Arbeit zu erleichtern.
MQL5.community - User Memo
MQL5.community - User Memo
  • 2010.02.25
  • MetaQuotes Software Corp.
  • www.mql5.com
You have just registered and most likely you have questions such as, "How do I insert a picture to my a message?" "How do I format my MQL5 source code?" "Where are my personal messages kept?" You may have many other questions. In this article, we have prepared some hands-on tips that will help you get accustomed in MQL5.community and take full advantage of its available features.
 
Hallo und vielen Dank für diesen tollen Artikel, eine Frage :
Haben Sie noch nie eine Anomalie erlebt, bei der, wenn Sie mehr als einen INDICATOR_DATA-gekennzeichneten Puffer in Ihrem iCustom abgeleiteten Klassencode definieren, Sie immer eine schlechte -1 erhalten, wenn Sie versuchen, Daten (mit CopyBuffer/GetData) von allen INDICATOR_DATA-gekennzeichneten Puffern außer dem ersten abzurufen?

Ich konnte dieses Problem beheben, indem ich nur einen Puffer mit dem Flag INDICATOR_DATA definierte und alle anderen in INDICATOR_CALCULATIONS verschob. Auf diese Weise geben CopyBuffer/GetData die richtigen kopierten Elemente in die Ziel-Arrays zurück.