Diskussion zum Artikel "Einführung in MQL5: Schreiben eines einfachen Expert Advisor und benutzerdefinierten Indikators" - Seite 2

 
Rosh:

Für Indikatorpuffer heißt es SetIndexBuffer:

Für Expert Advisors sollte es ähnlich sein, siehe

Noch keine Analogie. Bei der Überprüfung dieses Codes

//+------------------------------------------------------------------+
//|Test002.mq5 |
//+------------------------------------------------------------------+
double high[];
int bars;
//+------------------------------------------------------------------+
//| Experteninitialisierungsfunktion|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   bars=Bars(Symbol(),PERIOD_CURRENT);
   ArraySetAsSeries(high,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Experten-Deinitialisierungsfunktion|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Experten-Tick-Funktion|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int copied=CopyHigh(Symbol(),0,0,bars,high);
   return;
  }
//+------------------------------------------------------------------+

habe ich einen Haltepunkt gegenüber dem Return-Operator gesetzt. Der Debugger liefert das folgende Ergebnis: high "dynamic array[8563], S". Ich verstehe, dass S für "Series" steht.

 
Yedelkin:

Die Analogie funktioniert noch nicht. Bei der Überprüfung dieses Codes

setze ich einen Haltepunkt gegenüber dem Return-Operator. Der Debugger erzeugt das folgende Ergebnis: high "dynamic array[8563], S". Ich verstehe, dass S für "Serie" steht.

Warum funktioniert es dann nicht? Im Zweifelsfall setzen Sie eine explizite Prüfung auf Serie mit der Funktion ArrayGetAsSeries:

//+------------------------------------------------------------------+
//|Test_ArraySetAsSeries.mq5 |
|| Copyright Copyright 2010, MetaQuotes Software Corp.
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
double high[];
int bars;
//+------------------------------------------------------------------+
//| Experteninitialisierungsfunktion|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   bars=Bars(Symbol(),PERIOD_CURRENT);
   ArraySetAsSeries(high,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Experten-Tick-Funktion|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int copied=CopyHigh(Symbol(),0,0,bars,high);
   bool IsSeries=ArrayGetAsSeries(high);
   return;
  }
//+------------------------------------------------------------------+

Ergebnis


 
Rosh писал(а) :

Warum es nicht funktioniert. Im Zweifelsfall sollten Sie eine explizite Prüfung auf Serialität mit der Funktion ArrayGetAsSeries durchführen:

Ich möchte Sie daran erinnern, wovon ich spreche. Ich habe gefragt, ob Arrays immer erst nach dem Kopieren indiziert werden sollen. Sie haben sich auf den Hinweis zur Funktion SetIndexBuffer bezogen und gesagt, dass dies auch für EAs gelten sollte. Dieser SetIndexBuffer-Funktionshinweis impliziert, dass"nach der Verknüpfung das dynamische Array buffer[] wie in regulären Arrays indiziert wird, auch wenn das verknüpfte Array so eingestellt ist, dass es wie in Timeseries indiziert wird".

Dementsprechend sah ich eine Analogie für EAs darin, dass nach der Verwendung der Funktionen CopyTime, CopyHigh und CopyLow die empfangenden Arrays ebenfalls wie in regulären Arrays indiziert werden müssen. Um diese Analogie zu testen, habe ich die Funktion ArraySetAsSeries vor der Funktion CopyHigh in der Funktion OnInit() platziert. Aber mein Beispiel und die von Ihnen vorgeschlagene explizite Überprüfung der Serialisierung durch die Funktion ArrayGetAsSeries zeigen, dass sich nach der Verwendung der Funktion CopyHigh die voreingestellte Indizierung (wie bei timeseries) des empfangenden Arrays high[] nicht geändert hat. Dies wiederum deutet darauf hin, dass die von Ihnen erwähnte Analogie mit der Funktion SetIndexBuffer noch nicht beachtet wird, denn sonst hätte die explizite Serialitätsprüfung ergeben müssen, dass IsSeries=false ist.

 

Yedelkin:

Um diese Analogie zu testen, habe ich die Funktion ArraySetAsSeries vor der Funktion CopyHigh in der Funktion OnInit() platziert. Aber mein Beispiel und die von Ihnen vorgeschlagene explizite Überprüfung der Serialisierung durch die Funktion ArrayGetAsSeries zeigen, dass nach der Verwendung der Funktion CopyHigh die voreingestellte Indizierung (wie in timeseries) des empfangenden Arrays high[] nicht geändert wurde.

Eigentlich meinte ich, dass nach dem Festlegen der Serialisierung für das globale Array in OnInit() oder einer anderen Funktion diese Serialisierung nirgendwo anders geändert wird. Die einzige Ausnahme bezieht sich auf die Funktion SetIndexBuffer().

Ich glaube, dass wir in dieser Frage eine Einigung erzielt haben und sie als erledigt betrachten können.

 

Ja, die Frage ist beantwortet worden. Ich danke Ihnen für die Klarstellung!

 

Ein paar Fragen.

1.

   if(CopyTime(Symbol(),0,0,i,t)<i || CopyHigh(Symbol(),0,0,i,h)<i || CopyLow(Symbol(),0,0,i,l)<i)
     {
      Print("Die Zeitreihe konnte nicht kopiert werden!");
      return;
     }

Es heißt: "Im Operator if... wird der Return-Operator verwendet, um die Ausführung der Funktion OnTick zu beenden."

Ist OnTick? und nicht von if (....) {...}?

2.

   for(i=0;i<PositionsTotal();i++) {…}

In MQL4 wurde die umgekehrte Suche empfohlen.

for(i= PositionsTotal();i>0;i--) {…}
Was ist besser?

3. Heruntergeladen der Expert Advisor und Indikator (für Opera 10.54 Moderatoren, Probleme mit dem Herunterladen von angehängten Dateien). Alles kompiliert. Gestartet in der Tester auf M5 Auswahl der letzten Monat.

Protokoll

2010.05.15 13:16:02 Core 1 Abgekoppelt

2010.05.15 13:16:01 Kern 1 Protokolldatei "D:\MetaTrader 5\Tester\Agent-127.0.0.0.1-3000\logs\20100515.log" geschrieben

2010.05.15 13:16:01 Core 1 EURUSD,M5: 553908 Ticks (2580 Balken) erzeugt innerhalb von 1431016 ms (Gesamtbalken in der Historie 100352)

2010.05.15 13:16:01 Kern 1 OnTester Ergebnis 0

2010.05.15 12:52:13 Core 1 EURUSD,Daily: Historie beginnt mit 2009.01.02 00:00

2010.05.15 12:52:13 Core 1 EURUSD,Daily: History-Cache reserviert für geschätzte 355 Balken

2010.05.15 12:52:13 Core 1 EURUSD: enthält 484483 M1-Datensätze mit Beginn von 2009.01.02 06:01 bis 2010.05.03 00:00

2010.05.15 12:52:10 Kern 1 Lots=0.100000

2010.05.15 12:52:10 Kern 1 MAper=240

2010.05.15 12:52:10 Kern 1 EndHour=19

2010.05.15 12:52:10 Kern 1 StartStunde=7

2010.05.15 12:52:10 Core 1 EURUSD,M5: Test von Experts\expert.ex5 von 2010.05.01 00:00 bis 2010.05.14 00:00 gestartet mit Eingaben:

Die Ausführung dauerte sehr lange und es wurde kein einziger Handel eröffnet. Der automatische Handel ist erlaubt. Es gibt keine Meldungen im Log ((( (edit wahrscheinlich weiß ich noch nicht, wie ich sie finden kann). Indikator und Expert Advisor sind da, wo sie sein sollten. Windows XP, MT (build 274).

4. Ich habe den Debugging-Modus ausprobiert, er funktioniert nicht. Wahrscheinlich wegen des Samstags. Keine Anführungszeichen. Ich habe den Haltepunkt auf die gleiche Weise wie im Artikel gemacht. Wenn ich richtig liege, ist es schade, dass man nur an Werktagen debuggen kann. Für die Fehlersuche wäre es schön, wenn man seine eigene Datei mit den notwendigen Daten hochladen könnte und (oder) mit einigen typischen Daten (lassen Sie es ein Stück Geschichte für einen Tag sein), es wird für die Fehlersuche ausreichen.

5. wenn jemand die Kopierfunktion erforscht hat... bitte teilen Sie Informationen darüber mit, wie es funktioniert, wenn es fehlende Balken gibt. Obwohl es wahrscheinlich besser wäre, einen Artikel zu bestellen.

 
Prival:

Ein paar Fragen.

1. Es heißt: "Im Operator if... wird der Return-Operator verwendet, um die Ausführung der Funktion OnTick zu beenden."

Ist OnTick? und nicht von if (....) {...}?

Aus der Beschreibung des Return-Operators return:

Оператор return прекращает выполнение текущей функции и возвращает управление 
вызвавшей программе. Результат вычисления выражения возвращается вызываемой 
функции. Выражение может содержать оператор присваивания.

Die aktuelle Funktion für die Return-Anweisung in diesem Beispiel ist OnTick().

Vorrangig:

4. Habe es im Debug-Modus versucht, es geht nicht. Wahrscheinlich wegen des Samstags. Keine Anführungszeichen. Ich habe den Haltepunkt auf die gleiche Weise wie im Artikel gemacht. Wenn ich recht habe, ist es schade, es stellt sich heraus, dass man nur an einem Werktag debuggen kann. Es wäre schön, wenn man für die Fehlersuche eine eigene Datei mit den erforderlichen Daten und (oder) mit einigen typischen Daten (z.B. ein Stück Geschichte für einen Tag) hochladen könnte, das würde für die Fehlersuche ausreichen.

Auf der Website wurden bereits ähnliche Fragen zur Fehlersuche diskutiert. Wenn Sie daran interessiert sind, verwenden Sie die Suchfunktion und suchen Sie nach dem Wort "Debugging".

 

Nach dem Laden des automatischen Updates (Build 275) begann der Compiler, Warnungen in Zeilen zu erzeugen, in denen Bedingungen des folgenden Typs geprüft werden

if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
Die Warnungen sind von der gleichen Art:
implicit enum conversion Perito02-04 temp3.mq5 1233 45
Fragen: Ist die korrekte Funktionsweise des Compilers mit dem Auftreten dieser Warnungen in der angegebenen Situation verbunden? Von welcher "Umwandlung" ist die Rede?
 
Yedelkin :

Nach dem Laden des automatischen Updates (Build 275) begann der Compiler, Warnungen in den Zeilen zu erzeugen, in denen die Bedingungen des Typs überprüft werden

Die Warnungen sind vom gleichen Typ: Fragen: Ist die korrekte Arbeit des Compilers mit dem Auftreten dieser Warnungen in der angegebenen Situation verbunden? Von welcher "Umwandlung" ist die Rede?

Die Warnung wurde eingeführt, damit die Programmierer aufpassen und ihren Code zweimal überprüfen.

Sie können die Warnungen loswerden, indem Sie das Funktionsergebnis explizit in einen Enumerator oder Enumerator in int umwandeln.

 
Prival:

Ein paar Fragen.

1. Es heißt: "Im Operator if... wird der Return-Operator verwendet, um die Ausführung der Funktion OnTick zu beenden."

Ist OnTick? und nicht von if (....) {...}?

Wenn mindestens eine der Bedingungen im Operator

if(CopyTime(Symbol(),0,0,i,t)<i || CopyHigh(Symbol(),0,0,i,h)<i || CopyLow(Symbol(),0,0,i,l)<i)

mindestens eine der Bedingungen erfüllt ist, d.h. mindestens eines der Arrays nicht vollständig kopiert werden konnte (es sind nicht genügend historische Daten vorhanden oder es ist ein Fehler aufgetreten) - wird die OnTick-Funktion beendet, da ohne diese Daten keine weiteren Berechnungen möglich sind.

2. In MQL4 wurde die umgekehrte Aufzählung empfohlen.

Was ist besser?

Varianten

for(i=0;i<PositionsTotal();i++)

и

for(i=PositionsTotal()-1;i>=0;i--)

sind gleichwertig, aber die erste Variante ist in der Textform kürzer, daher wurde sie verwendet.

3. Herunterladen der Expert Advisor und Indikator (für Moderatoren Opera 10.54 Probleme mit dem Herunterladen von angehängten Dateien). Alles kompiliert. Ich habe es im Tester auf M5 ausgeführt und den letzten Monat ausgewählt.

Es dauerte eine sehr lange Zeit, um auszuführen und nicht einen einzigen Handel zu öffnen. Automatischer Handel ist erlaubt. Es gibt keine Meldungen im Protokoll ((( (ich weiß wahrscheinlich nicht, wie ich sie finden kann). Indikator und Expert Advisor befinden sich dort, wo sie sein sollten. Windows XP, MT (Build 274).

4. Habe es im Debugging-Modus versucht, es geht nicht. Wahrscheinlich wegen des Samstags. Keine Anführungszeichen. Ich habe den Haltepunkt auf die gleiche Weise wie im Artikel gemacht. Wenn ich recht habe, ist es schade, es stellt sich heraus, dass man nur an einem Werktag debuggen kann. Für die Fehlersuche wäre es schön, wenn man seine eigene Datei mit den notwendigen Daten hochladen könnte und (oder) mit einigen typischen Daten (lassen Sie es ein Stück Geschichte für einen Tag sein), es wird genug für die Fehlersuche sein.

5. wenn jemand die Kopierfunktion erforscht hat... bitte teilen Sie Informationen darüber mit, wie es funktioniert, wenn es fehlende Balken gibt. Obwohl es wahrscheinlich besser wäre, einen Artikel zu bestellen.

Um ehrlich zu sein, funktioniert mein Tester auch nicht sehr gut: Das Testen dauert viel länger als das Testen eines ähnlichen EA in MQL4; Trades werden nur in den ersten ein oder zwei Tagen des Testintervalls geöffnet (dies wird beim Testen verschiedener Expert Advisors beobachtet).

Die Funktionen OnTick und OnCalculate werden gestartet, wenn ein neuer Kurs empfangen wird, so dass für ihre Fehlersuche der Empfang von Kursen erforderlich ist (am Wochenende funktioniert es nicht). Ansonsten funktioniert der Debugger normal (probieren Sie es aus, fragen Sie mich, wenn Sie etwas brauchen).

Bezüglich der Arrays-Zeitreihen: - die Richtung der Arrays kann jederzeit in beide Richtungen geändert werden, die Position der Arrays im Speicher ändert sich nicht, nur die Indizierung ändert sich (von 0,1,2,...,last to last,...,2,1,0) .