Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1188

 
Ivan_Invanov:
Nach Ihrer Antwort zu urteilen, verstehen Sie nicht wirklich, wie das Programm funktioniert. Es scheint also eine dumme Frage zu sein. Genau wie der vorherige Kommentator meint, dass es aufhört. Aus meiner Erfahrung mit der Programmierung in anderen Sprachen denke ich, dass es seinen Rumpf in einer Schleife ausführt, und wenn ein Ereignis eintritt, taucht es in dieses ein. Wenn das Programm seinen Körper in einer Schleife ausführt, erklärt das, warum das Programm so geschrieben ist.

Wenn ein "New Tick"-Ereignis eintritt, wird das Programm im OnTick()-Handler gestartet, bis zum Ende ausgeführt und gestoppt. Mit der Ankunft einer neuen Zecke beginnt alles wieder von vorne. Wenn während der Programmausführung ein neuer Tick eingetreten ist und das Programm die Verarbeitung des vorherigen Ticks noch nicht abgeschlossen hat (es läuft noch), dann wird dieser Tick übersprungen.

Programme in MQL werden nicht in Schleifen ausgeführt. Sie haben drei Einstiegspunkte - OnInit(), OnDeinit() und OnTick().

Beim Start wird OnInit() ausgeführt, dann, wenn ein Tick empfangen wird - OnTick(), wenn die Operation beendet ist - OnDeinit().

Es gibt auch andere Handler. Aber es ist besser, die Hilfe zu öffnen, als jemanden zu bitten, es hier zu duplizieren.

Документация по MQL5: Программы MQL5
Документация по MQL5: Программы MQL5
  • www.mql5.com
Для того чтобы mql5-программа могла работать, она должна быть скомпилирована (кнопка "Компилировать" или клавиша F7). Компиляция должна пройти без ошибок (допускаются предупреждения, которые необходимо проанализировать). При этом в соответствующей директории Эксперты, пользовательские индикаторы и скрипты прикрепляются к одному из открытых...
 

Hallo. Bei der Arbeit an meinem Indikator habe ich einen Fehler beim Neustart des Terminals gefunden. Auf der Grundlage dieses Fehlers habe ich einen kleinen Quellcode erstellt, um ihn zu testen:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

class Loader {
private:
  string symbol;
  ENUM_TIMEFRAMES timeframe;

public:  
  Loader(): symbol(Symbol()), timeframe(Period()) 
  {
    Print(__FUNCTION__ + " symbol: " + symbol + " timeframe: " + EnumToString(timeframe));
    ResetLastError();
    Print(__FUNCTION__ + " bars: " + (string)iBars(symbol, timeframe)); // Данный вызов iBars() даёт 0 при перезапуске терминала
    Print(__FUNCTION__ + " Error: " + (string)GetLastError());
    Print(__FUNCTION__ + " bars (2): " + (string)iBars(Symbol(), Period())); // Этот же вызов iBars() работает нормально
  }
};

Loader * loader;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit() {
//--- indicator buffers mapping
  loader = new Loader();
//---
  return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
  delete loader;
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[]
) {
  return(rates_total);
}

Wenn dieses Beispiel auf ein Diagramm geworfen wird (oder es ist der erste Terminalstart nach dem Systemstart), funktioniert alles einwandfrei. Im Protokoll steht Folgendes:

2020.06.24 21:05:50.773 Loader::Loader symbol: EURUSD timeframe: PERIOD_H1

2020.06.24 21:05:50.773 Lader::Laderiegel: 140433

2020.06.24 21:05:50.773 Loader::Loader Fehler: 0

2020.06.24 21:05:50.773 Loader::Loader Bars (2): 140433


Aber wenn ich das Terminal mit diesem Indikator neu starte, erhalte ich einen Fehler:

2020.06.24 21:07:34.963 Loader::Loader Symbol: EURUSD Zeitrahmen: PERIOD_H1

2020.06.24 21:07:34.963 Loader::Loader Bars: 0

2020.06.24 21:07:34.963 Loader::Loader Fehler: 4401

2020.06.24 21:07:34.964 Loader::Loader Bars (2): 140433

Symbol und Zeitrahmen initialisiert ok

2020.06.24 21:07:34.963 Loader::Loader Symbol: EURUSD Zeitrahmen: PERIOD_H1

Aber iBars(Symbol, Zeitrahmen) gibt 0 aus irgendeinem Grund

2020.06.24 21:07:34.963 Loader::Loader Bars: 0

In diesem Fall erscheint der Fehler 4401.

Aber iBars(Symbol(), Period()) funktioniert gut.

2020.06.24 21:07:34.964 Loader::Loader Bars (2): 140433

Mindestens symbol = Symbol() und timeframe = Period() laut Logmeldungen (auch während der Verzögerung, wenn das Terminal neu startet). Wie kann iBars(Symbol, Timeframe), mit absolut korrektem Symbol und Timeframe, Null ergeben, während iBars(Symbol(), Period()) gut funktioniert, wenn die Parameter in den Funktionen laut Protokoll gleich sind?

Запуск платформы - Для продвинутых пользователей - Справка по MetaTrader 5
Запуск платформы - Для продвинутых пользователей - Справка по MetaTrader 5
  • www.metatrader5.com
По завершении установки в меню "Пуск" создается группа программ торговой платформы, а на рабочем столе дополнительно помещается ярлык программы. Используйте их для запуска. Нельзя запускать одновременно две копии платформы из одной директории. Чтобы одновременно запустить несколько копий, установите соответствующее количество программ в разные...
Dateien:
Test.mq5  7 kb
 
Wer kennt den Moderator dieses Threads?
 

Wie eröffne ich ein MT4-Demokonto bei MetaQuotes Demo? Früher funktionierte es ohne Probleme, jetzt steht auf der letzten Seite des Dialogs: Registrierung, Bitte etwas warten, und in diesem Zustand bleibt er unendlich lange inaktiv, Felder mit Login und Passwort bleiben leer. Keine Meldungen im Protokoll. Ich habe sowohl "Demo" als auch "Real" und verschiedene Arten von Konten ausprobiert.

UPD Ich habe eine Broker-Demo ausprobiert - das Gleiche.

 
Artyom Trishkin:

Wenn ein "New Tick"-Ereignis eintritt, wird das Programm im OnTick()-Handler gestartet, bis zum Ende ausgeführt und gestoppt. Mit der Ankunft einer neuen Zecke beginnt alles wieder von vorne. Wenn während der Programmausführung ein neuer Tick eingetreten ist und das Programm die Verarbeitung des vorherigen Ticks noch nicht abgeschlossen hat (es läuft noch), dann wird dieser Tick übersprungen.

Programme in MQL werden nicht in Schleifen ausgeführt. Sie haben drei Einstiegspunkte - OnInit(), OnDeinit() und OnTick().

Beim Start wird OnInit() ausgeführt, dann, wenn ein Tick empfangen wird - OnTick(), wenn die Operation beendet ist - OnDeinit().

Es gibt auch andere Handler. Aber es ist besser, die Hilfe zu öffnen, als jemanden zu bitten, es hier zu duplizieren.

Ich danke Ihnen. Ja, das verstehe ich, aber die Funktion ist im Hauptteil des Programms geschrieben. Vielleicht habe ich nicht bemerkt, dass es irgendwo genannt wurde.
 
Ivan_Invanov:
Ich danke Ihnen. Ja, das verstehe ich, aber die Funktion ist im Hauptteil des Programms geschrieben. Vielleicht habe ich nicht bemerkt, dass es irgendwo genannt wurde.

Wie können wir sehen, wovon Sie sprechen? Geben Sie uns ein Beispiel.

 
Artyom Trishkin:

Wie können wir sehen, wovon Sie sprechen? Geben Sie uns ein Beispiel.

Nochmals vielen Dank, ja, ich habe den Aufruf nicht bemerkt, ich habe ihn jetzt nachgeschlagen, und er wurde von der Funktion aufgerufen, die den Handel eröffnet.
 
Ivan_Invanov:
Ich danke Ihnen. Ja, ich verstehe es, aber die Funktion ist im Hauptteil des Programms geschrieben. Vielleicht habe ich irgendwo einen Aufruf dazu verpasst.

In mql4 werden Funktionen in beliebiger Reihenfolge geschrieben, oben und unten spielt keine Rolle, es kann früher oder später funktionieren. So etwas gibt es in C++ nicht, wo alle Funktionen nur in der Reihenfolge des Schreibens funktionieren können, und wenn man sie aufrufen will, muss sie vor dem Ort des Aufrufs definiert werden, sonst stürzt das Programm ab. Der Mann hat mir gezeigt, wie man Funktionen in unterschiedlicher Reihenfolge schreibt, aber ich weiß nicht mehr, wie man das in C++ macht.

 
Ivan_Invanov:

Grüße. Bitte helfen Sie mir weiter. Ich habe folgende Frage. Verstehe ich das richtig? Das Programm wird vom Anfang bis zum Ende ausgeführt, hält aber an, wenn ein Ereignis eintritt, z. B. ein Tick, die Ontick-Funktion beginnt mit der Ausführung, beendet dann ihre Ausführung und das Programm wird wieder von Anfang an ausgeführt? Diese Frage bezieht sich auf Folgendes: Wo schreibe ich zum Beispiel die Größe des Handelsloses, im Programmkörper oder in der Ontick-Funktion?

Ich schaue mir den offiziellen Bot an, der ein Beispiel im Terminal ist, dort wird viel Berechnung im Programmkörper durchgeführt, und ich verstehe nicht, warum das so ist.

Mein Los wird wie folgt berechnet

#property link      "http://www.mql5.com"
input double CheckLots = 0.01;
input int    Persent   = 5;
   double Lots=NormalizeDouble(AccountBalance()*CheckLots/1000-0.005,2);  

es steht am Anfang des Expert Advisors... und ich habe es ganz ans Ende des Codes gesetzt

Wenn die OnTick-Funktion die Variable Lots aufruft, wird sie von EA gefunden und neu berechnet.

 

@Artyom Trishkin

Sind Sie ein Moderator in diesem Thema?