3. interessanter Punkt der Analyse, was gibt CopyClose() zurück, ich habe es selbst überprüft, wenn es keine .hst-Datei für die angeforderte TF gibt, CopyClose() gibt nie mehr als 2048 zurück - d.h. dies ist der maximale Wert, der heruntergeladen werden kann?
Nr. 2048 ist der Teil der Daten, der vom Server heruntergeladen wird, wenn auf dem Client keine Datei vorhanden ist.
Die nächste wichtige Prüfung ist die Überprüfung des Programmtyps, aus dem die Funktion aufgerufen wird. Es sei daran erinnert, dass es höchst unerwünscht ist, eine Aktualisierungsanforderung für eine Zeitreihe mit demselben Zeitraum zu senden wie der Indikator, der die Aktualisierung aufruft. Dass es unerwünscht ist, Daten aus demselben Zeitraum wie der Indikator anzufordern, liegt daran, dass die Aktualisierung der historischen Daten in demselben Thread erfolgt, in dem auch der Indikator arbeitet. Daher ist die Wahrscheinlichkeit eines Zusammenstoßes hoch. Um dies zu überprüfen, verwenden wir die FunktionMQL5InfoInteger() mit dem ModifikatorMQL5_PROGRAM_TYPE.
es ist nicht geeignet für das Laden von Verlaufsdaten in MT4-Indikatoren, und wie kann ich den gesamten Verlauf durch den Indikator herunterladen, wenn es keine vorbereitete .hst-Datei gibt, d.h. der Indikator initialisiert das Laden des Verlaufs durch sein eigenes Symbol
wie kann ich wissen, dass ich hier die gesamte Historie gleich iBars(Symbol(),PERIOD_CURRENT) "heruntergeladen" habe;
iBars() auch einen falschen Wert zurückgibt? - es gibt noch keine Historie, also gibt es auch kein iBars()
es scheint, dass in MT5 die Geschichte ohne Probleme heruntergeladen wird, müssen Sie nur warten und überprüfen Sie den Status der historischen Daten, aber in MT4?
PS: in kodobase gestern war ich auf der Suche nach einem korrekt funktionierenden Multicurrency-Indikatoren für MT4, aber die Codes sind nicht Gegenstand der Nachahmung, in vielen Beispielen von kodobase, in der Regel gibt es keine Geschichte paging in den Indikator
Прежде чем ценовые данные будут доступны в терминале MetaTrader 5, их необходимо получить и обработать. Для получения данных требуется подключение к торговому серверу MetaTrader 5. Данные поступают с сервера по запросу терминала в виде экономно упакованных блоков минутных баров. Механизм обращения к серверу за данными не зависит от того, каким...
Bei Vierlingen wurde die "Home-Taste gedrückt". Es gibt keinen anderen Weg. Wenn Sie sich schon eine Weile mit dem Thema befassen, sollten Sie sich an den Ausdruck "brick on the keyboard" erinnern
Скайп-чат поддержки продукта: Последние версии библиотек, скриптов и приложений: Сей скрипт продолжение темы закачек котировок обновлением графика. Решил не обновлять старую версию, а выложить заново. Это принципиально новый скрипт. Удалось добиться максимальной надёжности его работы за счёт переноса функций WinAPI в DLL. Скрипт, как и...
Ich weiß, wie man den Verlauf herunterlädt, aber ich weiß nicht, wie ich den Download-Indikator überprüfen kann.
Slawa:
In vierfacher Ausführung "Drücken Sie die Home-Taste". Es gibt keinen anderen Weg. Wenn Sie sich schon lange mit dem Thema befassen, sollten Sie sich an den Ausdruck "brick on the keyboard" erinnern.
Als ich in den letzten Jahren anfing, MQL zu benutzen, lernte ich MQL überhaupt nicht, seit diesem Jahr bin ich wirklich überrascht, dass die Entwickler die Kompatibilität zwischen MT5 und MT4 so weit wie möglich hergestellt und die Leistung von MQL4 verbessert haben - obwohl uns vorher gesagt wurde, dass MT4 als Projekt nicht mehr weiterentwickelt wird, es gibt nur noch Bugs zu beheben
und hier war die Hoffnung, dass ich keine Informationen über das automatische Laden der Historie im MT4-Indikator gefunden habe
Grundsätzlich, wenn Sie garantiert die gesamte Historie in MT4 und ohne zusätzliche Prüfungen herunterladen wollen, dann ist es einfacher, dfix Code zu verwenden - schreiben Sie die bar datetime t=0 in .hst Datei;
Zu meinem großen Bedauern muss ich noch einmal auf das Thema des Erhalts von Senior-TF-Daten im MT4 zurückkommen. Diesmal, weil die hier vorgeschlagenen Techniken nicht funktioniert haben.
Hier ist der von uns verwendete Code:
#property strict#property indicator_chart_window//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+//--- Время открытия текущего часа, дня и неделиdatetime _weekOpenTime = 0;
datetime _hourOpenTime = 0;
datetime _dayOpenTime=0;
//--- Вести лог журналаconstbool inpFileLog=true;
//--- Количество секунд в одном днеconstint SEC_PER_DAY=86400;
//--- Флаг работоспособности индикатораbool _isWorking=true;
//--- Флаг соединения с торговым сервером (для таймера, получаем в OnCalculate())bool _isConnected=false;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- Сбрасываем время открытия текущего часа, дня и недели
_weekOpenTime= 0;
_dayOpenTime = 0;
_hourOpenTime= 0;
//--- Устанавливаем флаг работоспособности
_isWorking=true;
//--- Сбрасываем флаг установки соединения
_isConnected=false;
//--- Запускаем таймерif(!EventSetMillisecondTimer(20))
{
Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": таймер с частотой 20 не установлен!");
//--- Устанавливаем флаг неработоспособности индикатора
_isWorking=false;
}
//--- Запрос данныхSeriesInfoInteger(_Symbol,PERIOD_W1,SERIES_LASTBAR_DATE);
SeriesInfoInteger(_Symbol,PERIOD_D1,SERIES_LASTBAR_DATE);
SeriesInfoInteger(_Symbol,PERIOD_H1,SERIES_LASTBAR_DATE);
//---return( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//--- Выключаем таймерEventKillTimer();
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnTimer()
{
//---if(!_isWorking)
return;
//---if(!_isConnected)
return;
//---Print(__FUNCTION__,": Данные старших ТФ загружены!");
//--- Отключаем таймерEventKillTimer();
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//--- Проверяем связь с серверомif(!IsConnected()) // Если не удалось установить связь с сервером
{
//--- Сбрасываем флаг соединения с сервером
_isConnected=false;
//--- Выходимreturn( 0 );
}
//--- Проверяем первый запуск индикатораif(prev_calculated<=0)
{
//--- Проверяем, записано ли время открытия текущей неделиif(!CheckCurrentWeekOpenTime()) // Если время не записаноreturn(0); // Выходим//--- Проверяем, записано ли время открытия текущего дняif(!CheckCurrentDayOpenTime()) // Если время не записаноreturn(0); // Выходим//--- Проверяем, записано ли время открытия текущего часаif(!CheckCurrentHourOpenTime()) // Если время не записаноreturn(0); // Выходим//--- Устанавливаем флаг соединения с сервером для запуска таймера
_isConnected=true;
}
//---return( rates_total );
}
//+------------------------------------------------------------------+//| Проверяем, записано ли время открытия текущей недели |//+------------------------------------------------------------------+bool CheckCurrentWeekOpenTime()
{
//--- Проверяем, записано ли времяif(_weekOpenTime==0) // Если время не записано
{
//--- Получаем время открытия недельного бараResetLastError();
constdatetime weekBarOpenTime=(datetime)SeriesInfoInteger(_Symbol,PERIOD_W1,SERIES_LASTBAR_DATE);
constint err=GetLastError();
//---if(inpFileLog)
{
Print(__FILE__,": Время открытия недельного бара = "+TimeToString(weekBarOpenTime)+". Ошибка #",err);
}
//--- Проверяем, получено ли время открытия недельного бараif(weekBarOpenTime==0 || err!=0) // Если время бара не получено или история обновляетсяreturn(false); // Возвращаем ложь//--- Запоминаем время открытия текущей недели (время открытия недельного бара - воскресенье)
_weekOpenTime=weekBarOpenTime+SEC_PER_DAY;
//---if(inpFileLog)
{
Print(__FILE__,": Актуальное время открытия текущей недели = "+TimeToString(_weekOpenTime)+". Ошибка #",err);
}
//--- Возвращаем истинуreturn( true );
}
//--- Время открытия недели ранее записано. Возвращаем истинуreturn( true );
}
//+------------------------------------------------------------------+//| Проверяем, записано ли время открытия текущего дня |//+------------------------------------------------------------------+bool CheckCurrentDayOpenTime()
{
//--- Проверяем, записано ли времяif(_dayOpenTime==0) // Если время не записано
{
//--- Получаем время открытия дневного бараResetLastError();
constdatetime tempDayOpenTime=(datetime)SeriesInfoInteger(_Symbol,PERIOD_D1,SERIES_LASTBAR_DATE);
constint err=GetLastError();
//---if(inpFileLog)
{
Print(__FILE__,": Время открытия текущего дня = "+TimeToString(tempDayOpenTime)+". Ошибка #",err);
}
//--- Проверяем, получено ли время открытия дневного бараif(tempDayOpenTime==0 || err!=0) // Если время бара не полученоreturn(false); // Возвращаем ложь//--- Сохраняем в глобальную переменную значение открытия текущего дня
_dayOpenTime=tempDayOpenTime;
//---if(inpFileLog)
{
Print(__FILE__,": Актуальное время открытия текущего дня = "+TimeToString(_dayOpenTime)+". Ошибка #",err);
}
//--- Возвращаем истинуreturn( true );
}
//--- Время открытия дня ранее записано. Возвращаем истинуreturn( true );
}
//+------------------------------------------------------------------+//| Проверяем, записано ли время открытия текущего часа |//+------------------------------------------------------------------+bool CheckCurrentHourOpenTime()
{
//--- Проверяем, записано ли времяif(_hourOpenTime==0) // Если время не записано
{
//--- Получаем время открытия часового бараResetLastError();
constdatetime tempHourOpenTime=(datetime)SeriesInfoInteger(_Symbol,PERIOD_H1,SERIES_LASTBAR_DATE);
constint err=GetLastError();
//---if(inpFileLog)
{
Print(__FILE__,": Время открытия текущего часа = "+TimeToString(tempHourOpenTime)+". Ошибка #",err);
}
//--- Проверяем, получено ли время открытия часового бараif(tempHourOpenTime==0 || err!=0) // Если время бара не полученоreturn(false); // Возвращаем ложь//---
_hourOpenTime=tempHourOpenTime;
//---if(inpFileLog)
{
Print(__FILE__,": Актуальное время открытия текущего часа = "+TimeToString(_hourOpenTime)+". Ошибка #",err);
}
//--- Возвращаем истинуreturn( true );
}
//--- Время открытия часа ранее записано. Возвращаем истинуreturn( true );
}
//+------------------------------------------------------------------+
Es implementiert das Paging von Daten, wie mir geraten wurde:
Darüber wurde bereits mehrfach diskutiert. 12 Seiten zu "Fehler 4066".
Und es wurde Ihnen richtig geraten, die Anfrage in OnInit zu senden und in OnCalculate zu analysieren.
Wozu brauchen Sie einen Millisekunden-Timer? Sie verhindern, dass das Client-Terminal normal gestartet werden kann. Es sind nicht die Windmeldungen, die Ihren Timer stören, es ist Ihr Timer, der alle stört. Noch einmal: Die Indikatoren im MT4-Terminal des Kunden arbeiten im Schnittstellen-Potenzial.
Die Implementierung ist genau so: Die erste Datenabfrage erfolgt in OnInit(). Dann warten wir, bis die Verbindung mit dem Handelsserver hergestellt ist, und in OnCalculate()! erhalten wir die Daten des hohen TF. Das Ergebnis erhalten wir heute beim ersten Start:
2018.10.0409:10:56.266 test_isNewDayInOnCalculate EURGBP.e,M1: OnTimer: Данные старших ТФ загружены!
2018.10.0409:10:56.237 test_isNewDayInOnCalculate EURGBP.e,M1: test_isNewDayInOnCalculate.mq4: Актуальное время открытия текущего часа = 2018.10.0309:00. Ошибка #02018.10.0409:10:56.237 test_isNewDayInOnCalculate EURGBP.e,M1: test_isNewDayInOnCalculate.mq4: Время открытия текущего часа = 2018.10.0309:00. Ошибка #02018.10.0409:10:56.237 test_isNewDayInOnCalculate EURGBP.e,M1: test_isNewDayInOnCalculate.mq4: Актуальное время открытия текущего дня = 2018.10.0300:00. Ошибка #02018.10.0409:10:56.237 test_isNewDayInOnCalculate EURGBP.e,M1: test_isNewDayInOnCalculate.mq4: Время открытия текущего дня = 2018.10.0300:00. Ошибка #02018.10.0409:10:56.237 test_isNewDayInOnCalculate EURGBP.e,M1: test_isNewDayInOnCalculate.mq4: Актуальное время открытия текущей недели = 2018.10.0100:00. Ошибка #02018.10.0409:10:56.237 test_isNewDayInOnCalculate EURGBP.e,M1: test_isNewDayInOnCalculate.mq4: Время открытия недельного бара = 2018.09.3000:00. Ошибка #0
Wie wir aus dem Protokoll ersehen können, haben wir falsche Werte für die Uhrzeit und die Tageszeit erhalten.
Ja, die Entwickler(@Slava) haben vielleicht bemerkt, dass ich nicht alle Ratschläge, die mir gegeben wurden, befolgt habe. Das heißt, ich führe immer noch einen schnellen Timer in OnInit() aus, obwohl mir ursprünglich geraten wurde, einen langsamen Timer auszuführen. In diesem Fall ist es jedoch Absicht. Wenn der schnelle Timer im Schnittstellen-Thread gestartet wird und den Abruf von Daten aus anderen Indikatoren verlangsamen kann, ist dies ein großes Problem. In der Dokumentation wird nicht davor gewarnt, dass ein Programm mit einem schnellen Timer zu einer Art "Virus" werden kann, der andere Programme zum Absturz bringt.
In Anbetracht der obigen Ausführungen bin ich der Meinung, dass wir entweder Beschränkungen für den Millisekunden-Timer einführen oder in der Dokumentation zu EventSetMillisecondTimer() angeben sollten, dass die Funktion nicht in OnInit() gestartet werden kann, damit das Terminal beim Start normal ansteigen kann.
Heute bei der Eröffnung des Tages ist die Situation ähnlich, der Fehler hat sich wiederholt. Testbed: ein Diagramm, drei Indikatoren darauf. Zwei verwenden keine Zeitschaltuhr, der dritte schon. Alle haben beim Laden falsche Daten erhalten. Ich habe jetzt den Indikator, der einen Timer verwendet, aus dem Diagramm entfernt und werde sehen, was passiert.
Jetzt kommt der lustige Teil. Der Code ist ohne Zeitschaltuhren:
#property strict#property indicator_chart_window//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+//--- Время открытия текущего часа, дня и неделиdatetime _weekOpenTime = 0;
datetime _hourOpenTime = 0;
datetime _dayOpenTime=0;
//--- Вести лог журналаconstbool inpFileLog=true;
//--- Количество секунд в одном днеconstint SEC_PER_DAY=86400;
//--- Флаг работоспособности индикатораbool _isWorking=true;
//--- Флаг соединения с торговым сервером (для таймера, получаем в OnCalculate())bool _isConnected=false;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- Сбрасываем время открытия текущего часа, дня и недели
_weekOpenTime= 0;
_dayOpenTime = 0;
_hourOpenTime= 0;
//--- Устанавливаем флаг работоспособности
_isWorking=true;
//--- Сбрасываем флаг установки соединения
_isConnected=false;
//--- Запрос данныхSeriesInfoInteger(_Symbol,PERIOD_W1,SERIES_LASTBAR_DATE);
SeriesInfoInteger(_Symbol,PERIOD_D1,SERIES_LASTBAR_DATE);
SeriesInfoInteger(_Symbol,PERIOD_H1,SERIES_LASTBAR_DATE);
//---return( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//--- Проверяем связь с серверомif(!IsConnected()) // Если не удалось установить связь с сервером
{
//--- Сбрасываем флаг соединения с сервером
_isConnected=false;
//--- Выходимreturn( 0 );
}
//--- Проверяем первый запуск индикатораif(prev_calculated<=0)
{
//--- Проверяем, записано ли время открытия текущей неделиif(!CheckCurrentWeekOpenTime()) // Если время не записаноreturn(0); // Выходим//--- Проверяем, записано ли время открытия текущего дняif(!CheckCurrentDayOpenTime()) // Если время не записаноreturn(0); // Выходим//--- Проверяем, записано ли время открытия текущего часаif(!CheckCurrentHourOpenTime()) // Если время не записаноreturn(0); // Выходим//--- Устанавливаем флаг соединения с сервером для запуска таймера
_isConnected=true;
//---Print(__FUNCTION__,": Данные старших ТФ загружены!");
}
//---return( rates_total );
}
//+------------------------------------------------------------------+//| Проверяем, записано ли время открытия текущей недели |//+------------------------------------------------------------------+bool CheckCurrentWeekOpenTime()
{
//--- Проверяем, записано ли времяif(_weekOpenTime==0) // Если время не записано
{
//--- Получаем время открытия недельного бараResetLastError();
constdatetime weekBarOpenTime=(datetime)SeriesInfoInteger(_Symbol,PERIOD_W1,SERIES_LASTBAR_DATE);
constint err=GetLastError();
//---if(inpFileLog)
{
Print(__FILE__,": Время открытия недельного бара = "+TimeToString(weekBarOpenTime)+". Ошибка #",err);
}
//--- Проверяем, получено ли время открытия недельного бараif(weekBarOpenTime==0 || err!=0) // Если время бара не получено или история обновляетсяreturn(false); // Возвращаем ложь//--- Запоминаем время открытия текущей недели (время открытия недельного бара - воскресенье)
_weekOpenTime=weekBarOpenTime+SEC_PER_DAY;
//---if(inpFileLog)
{
Print(__FILE__,": Актуальное время открытия текущей недели = "+TimeToString(_weekOpenTime)+". Ошибка #",err);
}
//--- Возвращаем истинуreturn( true );
}
//--- Время открытия недели ранее записано. Возвращаем истинуreturn( true );
}
//+------------------------------------------------------------------+//| Проверяем, записано ли время открытия текущего дня |//+------------------------------------------------------------------+bool CheckCurrentDayOpenTime()
{
//--- Проверяем, записано ли времяif(_dayOpenTime==0) // Если время не записано
{
//--- Получаем время открытия дневного бараResetLastError();
constdatetime tempDayOpenTime=(datetime)SeriesInfoInteger(_Symbol,PERIOD_D1,SERIES_LASTBAR_DATE);
constint err=GetLastError();
//---if(inpFileLog)
{
Print(__FILE__,": Время открытия текущего дня = "+TimeToString(tempDayOpenTime)+". Ошибка #",err);
}
//--- Проверяем, получено ли время открытия дневного бараif(tempDayOpenTime==0 || err!=0) // Если время бара не полученоreturn(false); // Возвращаем ложь//--- Сохраняем в глобальную переменную значение открытия текущего дня
_dayOpenTime=tempDayOpenTime;
//---if(inpFileLog)
{
Print(__FILE__,": Актуальное время открытия текущего дня = "+TimeToString(_dayOpenTime)+". Ошибка #",err);
}
//--- Возвращаем истинуreturn( true );
}
//--- Время открытия дня ранее записано. Возвращаем истинуreturn( true );
}
//+------------------------------------------------------------------+//| Проверяем, записано ли время открытия текущего часа |//+------------------------------------------------------------------+bool CheckCurrentHourOpenTime()
{
//--- Проверяем, записано ли времяif(_hourOpenTime==0) // Если время не записано
{
//--- Получаем время открытия часового бараResetLastError();
constdatetime tempHourOpenTime=(datetime)SeriesInfoInteger(_Symbol,PERIOD_H1,SERIES_LASTBAR_DATE);
constint err=GetLastError();
//---if(inpFileLog)
{
Print(__FILE__,": Время открытия текущего часа = "+TimeToString(tempHourOpenTime)+". Ошибка #",err);
}
//--- Проверяем, получено ли время открытия часового бараif(tempHourOpenTime==0 || err!=0) // Если время бара не полученоreturn(false); // Возвращаем ложь//---
_hourOpenTime=tempHourOpenTime;
//---if(inpFileLog)
{
Print(__FILE__,": Актуальное время открытия текущего часа = "+TimeToString(_hourOpenTime)+". Ошибка #",err);
}
//--- Возвращаем истинуreturn( true );
}
//--- Время открытия часа ранее записано. Возвращаем истинуreturn( true );
}
//+------------------------------------------------------------------+
Und Sie können immer noch nicht das gewünschte Ergebnis erzielen. Die Entwickler(@Slava), bitte kommentieren. Es ist unmöglich, korrekte Daten zu erhalten, wenn das Terminal von mehreren höheren TFs geladen wird. Obligatorische Bedingung ist, dass das Terminal mehr als eine Stunde nach dem Abschalten ausgeschaltet sein muss (da wir Daten für einen Stundenbalken erhalten). Und natürlich die Inbetriebnahme von TF in weniger als einer Stunde.
Es stellte sich heraus, dass der Timer nicht beteiligt war.
Alexey, du fragst die Daten der leitenden TFs in der Inite ab. Noch keine Verbindung, wahrscheinlich ist ein Fehler aufgetreten. Versuchen Sie, einen Antrag zu stellen, wenn das erste Häkchen gesetzt wird.
Ich kann es nicht überprüfen, ich bin in der Hütte und habe mein Tablet nicht mitgebracht.
3. interessanter Punkt der Analyse, was gibt CopyClose() zurück, ich habe es selbst überprüft, wenn es keine .hst-Datei für die angeforderte TF gibt, CopyClose() gibt nie mehr als 2048 zurück - d.h. dies ist der maximale Wert, der heruntergeladen werden kann?
Nr. 2048 ist der Teil der Daten, der vom Server heruntergeladen wird, wenn auf dem Client keine Datei vorhanden ist.
Nein. 2048 ist ein Datenpaket, das vom Server heruntergeladen wird, wenn auf dem Client keine Daten vorhanden sind.
Hm, ich mache schon seit langem MQLs, aber es ist immer noch unerwartet für mich
OK, hier ist ein Beispiel aus der Hilfe:https://www.mql5.com/ru/docs/series/timeseries_access
heißt es:
Die nächste wichtige Prüfung ist die Überprüfung des Programmtyps, aus dem die Funktion aufgerufen wird. Es sei daran erinnert, dass es höchst unerwünscht ist, eine Aktualisierungsanforderung für eine Zeitreihe mit demselben Zeitraum zu senden wie der Indikator, der die Aktualisierung aufruft. Dass es unerwünscht ist, Daten aus demselben Zeitraum wie der Indikator anzufordern, liegt daran, dass die Aktualisierung der historischen Daten in demselben Thread erfolgt, in dem auch der Indikator arbeitet. Daher ist die Wahrscheinlichkeit eines Zusammenstoßes hoch. Um dies zu überprüfen, verwenden wir die FunktionMQL5InfoInteger() mit dem ModifikatorMQL5_PROGRAM_TYPE.
z. B. https://www.mql5.com/ru/code/449
es ist nicht geeignet für das Laden von Verlaufsdaten in MT4-Indikatoren, und wie kann ich den gesamten Verlauf durch den Indikator herunterladen, wenn es keine vorbereitete .hst-Datei gibt, d.h. der Indikator initialisiert das Laden des Verlaufs durch sein eigenes Symbol
wie kann ich wissen, dass ich hier die gesamte Historie gleich iBars(Symbol(),PERIOD_CURRENT) "heruntergeladen" habe;
iBars() auch einen falschen Wert zurückgibt? - es gibt noch keine Historie, also gibt es auch kein iBars()
es scheint, dass in MT5 die Geschichte ohne Probleme heruntergeladen wird, müssen Sie nur warten und überprüfen Sie den Status der historischen Daten, aber in MT4?
PS: in kodobase gestern war ich auf der Suche nach einem korrekt funktionierenden Multicurrency-Indikatoren für MT4, aber die Codes sind nicht Gegenstand der Nachahmung, in vielen Beispielen von kodobase, in der Regel gibt es keine Geschichte paging in den Indikator
Bei Vierlingen wurde die "Home-Taste gedrückt". Es gibt keinen anderen Weg. Wenn Sie sich schon eine Weile mit dem Thema befassen, sollten Sie sich an den Ausdruck "brick on the keyboard" erinnern
https://www.mql5.com/ru/code/9968
https://www.mql5.com/ru/code/9153
https://www.mql5.com/ru/code/9888
Sie können meinen kostenlosen Downloader ausprobieren.
Sie können meinen kostenlosen Downloader sehen.
Ich weiß, wie man den Verlauf herunterlädt, aber ich weiß nicht, wie ich den Download-Indikator überprüfen kann.
In vierfacher Ausführung "Drücken Sie die Home-Taste". Es gibt keinen anderen Weg. Wenn Sie sich schon lange mit dem Thema befassen, sollten Sie sich an den Ausdruck "brick on the keyboard" erinnern.
https://www.mql5.com/ru/code/9968
https://www.mql5.com/ru/code/9153
https://www.mql5.com/ru/code/9888
Als ich in den letzten Jahren anfing, MQL zu benutzen, lernte ich MQL überhaupt nicht, seit diesem Jahr bin ich wirklich überrascht, dass die Entwickler die Kompatibilität zwischen MT5 und MT4 so weit wie möglich hergestellt und die Leistung von MQL4 verbessert haben - obwohl uns vorher gesagt wurde, dass MT4 als Projekt nicht mehr weiterentwickelt wird, es gibt nur noch Bugs zu beheben
und hier war die Hoffnung, dass ich keine Informationen über das automatische Laden der Historie im MT4-Indikator gefunden habe
Grundsätzlich, wenn Sie garantiert die gesamte Historie in MT4 und ohne zusätzliche Prüfungen herunterladen wollen, dann ist es einfacher, dfix Code zu verwenden - schreiben Sie die bar datetime t=0 in .hst Datei;
Was schlagen Sie also vor, wie ich mir Ihren Code ansehen soll?
Ich dachte, Sie bräuchten nur den Verlauf, der automatisch geladen wird...
Zu meinem großen Bedauern muss ich noch einmal auf das Thema des Erhalts von Senior-TF-Daten im MT4 zurückkommen. Diesmal, weil die hier vorgeschlagenen Techniken nicht funktioniert haben.
Hier ist der von uns verwendete Code:
Es implementiert das Paging von Daten, wie mir geraten wurde:
Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien
[SERVICESDESK] Fehler beim Abrufen der Zeit der älteren TF im Timer!
Slawa, 2018.09.27 06:20
Darüber wurde bereits mehrfach diskutiert. 12 Seiten zu "Fehler 4066".
Und es wurde Ihnen richtig geraten, die Anfrage in OnInit zu senden und in OnCalculate zu analysieren.
Wozu brauchen Sie einen Millisekunden-Timer? Sie verhindern, dass das Client-Terminal normal gestartet werden kann. Es sind nicht die Windmeldungen, die Ihren Timer stören, es ist Ihr Timer, der alle stört. Noch einmal: Die Indikatoren im MT4-Terminal des Kunden arbeiten im Schnittstellen-Potenzial.
Die Implementierung ist genau so: Die erste Datenabfrage erfolgt in OnInit(). Dann warten wir, bis die Verbindung mit dem Handelsserver hergestellt ist, und in OnCalculate()! erhalten wir die Daten des hohen TF. Das Ergebnis erhalten wir heute beim ersten Start:
Wie wir aus dem Protokoll ersehen können, haben wir falsche Werte für die Uhrzeit und die Tageszeit erhalten.
Ja, die Entwickler(@Slava) haben vielleicht bemerkt, dass ich nicht alle Ratschläge, die mir gegeben wurden, befolgt habe. Das heißt, ich führe immer noch einen schnellen Timer in OnInit() aus, obwohl mir ursprünglich geraten wurde, einen langsamen Timer auszuführen. In diesem Fall ist es jedoch Absicht. Wenn der schnelle Timer im Schnittstellen-Thread gestartet wird und den Abruf von Daten aus anderen Indikatoren verlangsamen kann, ist dies ein großes Problem. In der Dokumentation wird nicht davor gewarnt, dass ein Programm mit einem schnellen Timer zu einer Art "Virus" werden kann, der andere Programme zum Absturz bringt.
In Anbetracht der obigen Ausführungen bin ich der Meinung, dass wir entweder Beschränkungen für den Millisekunden-Timer einführen oder in der Dokumentation zu EventSetMillisecondTimer() angeben sollten, dass die Funktion nicht in OnInit() gestartet werden kann, damit das Terminal beim Start normal ansteigen kann.
Jetzt kommt der lustige Teil. Der Code ist ohne Zeitschaltuhren:
Und Sie können immer noch nicht das gewünschte Ergebnis erzielen. Die Entwickler(@Slava), bitte kommentieren. Es ist unmöglich, korrekte Daten zu erhalten, wenn das Terminal von mehreren höheren TFs geladen wird. Obligatorische Bedingung ist, dass das Terminal mehr als eine Stunde nach dem Abschalten ausgeschaltet sein muss (da wir Daten für einen Stundenbalken erhalten). Und natürlich die Inbetriebnahme von TF in weniger als einer Stunde.
Es stellte sich heraus, dass der Timer nicht beteiligt war.