[WARNUNG GESCHLOSSEN!] Alle Fragen von Neulingen, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen. - Seite 426

 
ikatsko >>:

Здравствуйте! Как бы организовать в тестере стратегий оптимизацию (или тестирование) на промежутке времени, определенном не датами, а количеством последних баров? Попытка установки в советнике ограничителя времени работы, который определяется заданным количеством баров и основывается на TimeCurrent(), ничего не дала.


Хотя:

datetime TimeCurrent( )

Возвращает последнее известное время сервера (время прихода последней котировки) в виде количества секунд, прошедших после 00:00 1 января 1970 года.

Замечание: при тестировании последнее известное время сервера моделируется


Получается, что время, на котором работает оптимизатор, задается только в окне тестера фразой "Использовать дату:". Может кто знает какую-нибудь хитрость?

Meinen Sie, dass Sie die Handelszeiten innerhalb eines Tages festlegen können?

Wenn ja

//begin
extern string     Торгуемый_диапазон  =  "В часах";
extern int        начало=8;
extern int        окончание=20;


//B start

if(Hour()>= начало&&Hour()< окончание)//если час больше или = 8, а так же если час меньше 20, торгуем
{
//условия
}
 
costy_ >>:

Вы имеете ввиду задавать время торгов внутри дня?

Если так то


Ich möchte die Parameter eines EAs auf kurzen Timeframes für einen kleinen Zeitraum nahe der aktuellen Zeit optimieren. Mit dem Strategy Tester hingegen können Sie das Datum festlegen, an dem der Optimierungsprozess beginnt und endet. Wenn die TF 15 Minuten beträgt (zum Beispiel), dann gibt es an einem Tag (und das ist das Minimum, das der Tester einstellen kann) 96 Balken. Und ich denke, es ist eine Menge. Ich möchte, dass diese TF auf die letzten 2 Stunden optimiert wird, d.h. zum Beispiel auf 8 Balken.


Ich habe ein solches Fragment in den EA eingefügt:

extern int History=100; //Historie in Takten, mit der der Expert Advisor arbeitet
StartDateTime=TimeCurrent()-History*Period()*60;
if(TimeCurrent()<StartDateTime) // Die Startzeit ist noch nicht gekommen
{
Alert("Die Startzeit ist nicht gekommen. EA hat nicht funktioniert.",": ",Symb,", ",Zeitraum());
return; // Beenden von start()

}

Ich habe erwartet, dass der EA im Strategietester nicht vor StartDateTime funktioniert. Aber nein!

 
ikatsko >>:

Я хотел бы оптимизировать параметры советника на коротких таймфреймах на малом промежутке времени поближе к текущему времени. Тестер же стратегий позволяет установить дату на которой начинается и на которой заканчивается процесс оптимизации. Когда же ТФ равен 15 минутам (например), то в сутках (а это минимум который позволяет установить тестер) будет 96 баров. А это по моему много. Хотелось бы для этого ТФ пооптимизировать на последних 2-х часах т.е. на 8-ми например барах.

//begin
extern string     Торгуемый_диапазон  =  "В часах";
extern int        начало=22;
extern int        окончание=0;


//B start

if(Hour()>= начало&&Hour()< окончание)//на интервале  меж 22:00 - 00:00
{
//условия
}

int Stunde( )
Gibt die aktuelle Stunde (0,1,2,...23) der letzten bekannten Serverzeit beim Programmstart zurück (dieser Wert ändert sich während der Programmausführung nicht).

Hinweis: Beim Testen wird die letzte bekannte Serverzeit simuliert.


Der Tester unterstützt M1 TF, bindet es nicht an Balken, sondern an Zeit, vielleicht braucht ihr das auch.

 
costy_ >>:

int Hour( )
Возвращает текущий час (0,1,2,..23) последнего известного серверного времени на момент старта программы (в процессе выполнения программы это значение не меняется).

Замечание: при тестировании последнее известное время сервера моделируется.


Тестер поддерживает ТФ М1, не привязывайтесь к барам, привязывайтесь ко времени, возможно это тоже нужно.

Der Satz: Beim Testen wird die letzte bekannte Serverzeit simuliert ist vorhanden und in TimeCurrent( ) funktioniert es jedoch nicht. Ihre Variante ist gut, aber wir müssen prüfen, ob sie funktioniert? Zweitens muss bei der Änderung der TF ein Stück Code geändert werden oder man muss erkennen, in welcher TF er arbeitet, um die Zahlen "Anfang" und "Ende" angemessen wahrzunehmen. Drittens halte ich es für viel bequemer, die Baro-Zahl rückwärts einzustellen - es ist nicht nötig, den "Anfang" manuell zu berechnen. Bei MQL haben wir es mit Stäben zu tun! Und der letzte Punkt: Was ist der Nachteil dieses Codes? (Außer, dass es im Strategietester nicht funktioniert. Und das ist meine Frage)

 
costy_ >>:

int Hour( )
Возвращает текущий час (0,1,2,..23) последнего известного серверного времени на момент старта программы (в процессе выполнения программы это значение не меняется).

Замечание: при тестировании последнее известное время сервера моделируется.


Тестер поддерживает ТФ М1, не привязывайтесь к барам, привязывайтесь ко времени, возможно это тоже нужно.

extern int History=100; //История в барах, на которой работает советник
StartDateTime=TimeCurrent()- History*Period()*60;//...=datetime - int*int*int (допустим 1265996665 - 100 * 15 * 60 это не есть интересующее время)

Alert("TimeCurrent()    "+TimeCurrent()+" < StartDateTime    "+ StartDateTime);//...проверим соотношение datetime 

if(TimeCurrent()< StartDateTime) // Время старта не наступило...
{
Alert("Время старта не наступило. Эксперт не работает.",": ", Symb,", ",Period());
return; // Выход из start()

} 
 
costy_ >>:

In etwa so:

datetime ist Datum und Uhrzeit, eine ganze Zahl ohne Vorzeichen, die die Anzahl der seit 0 Uhr am 1. Januar 1970 verstrichenen Sekunden enthält.

и

Daten der Typen color und datetime werden als Ganzzahlen dargestellt. Ganzzahlige Typen werden zusammen mit Gleitkommatypen als arithmetische (numerische) Typen bezeichnet.

Wenn nicht, wie kommt man da wieder raus?

Vielen Dank für den Hinweis auf das Zahlenformat. Es gibt eine Richtung der Suche. Wenn es noch eine fertige Lösung gibt, wäre ich dankbar

 

Eigentlich ist es besser, Time[0] anstelle von TimeCurrent() im Tester zu verwenden, es schien mir, dass TimeCurrent() im Tester vorher funktionierte...

und nun wird TimeCurrent() im Tester (oder nicht im Tester) höchstwahrscheinlich die Zeit ausgeben, zu der das letzte Zitat kam...


in diesem Fall wird es klappen

extern int History=100; // Historie in Takten, auf denen der Expert Advisor arbeitet
StartDateTime=Time[History];
if(Time[0] < StartDateTime) // Startzeitpunkt ist nicht gekommen
{
Alert("Startzeitpunkt ist nicht gekommen. EA funktioniert nicht.",": ",Symb,", ",Period());
return; // Exit start()
}

 
ikatsko >>:

Вроде как:

datetime - дата и время, беззнаковое целое число, содержащее количество секунд, прошедших с 0 часов 1 января 1970 года.

и

Данные типов color и datetime представляются в виде целых чисел. Целые типы вместе с типами с плавающей точкой называются арифметическими (числовыми) типами.

А если нет, то как выйти из этого положения.

Хотя, спасибо за подсказку на счет формата чисел. Есть направление поиска. Если всеже есть готовое решение буду благодарен

Nun, im vorherigen Kommentar wurde der Fehler über die Warnmeldung angezeigt.

In der Hilfe steht: "Hinweis: Beim Testen wird die letzte bekannte Serverzeit simuliert", aber wenn sie nicht simuliert wird, gehen alle Fragen an den Hilfe-Editor.

Sie haben es überprüft und den Fehler gefunden...

Nur Sie kennen die Lösung, da wir die weitere Richtung der Logik nicht kennen.

Ich verstehe nicht, warum es so viel Text gibt

StartDateTime=TimeCurrent()-History*Period()*60;

wo doch alles viel einfacher zu machen ist?

 
costy_ >>:

Готовое решение знаете только Вы, так как дальнейшее направление логики нам не известно.

Ich stimme mit Ihrer Lösung in der vorherigen Antwort vollkommen überein: Es handelt sich um eine Inkompatibilität des Datenformats! Die Forderung nach einer Standardlösung läuft darauf hinaus, das Problem der Formatkonvertierung zu lösen. Aber offensichtlich hat MQL4 keine solchen Optionen. Zum Beispiel ist heute der 43. Tag des Jahres, d.h. der 43. Balken im täglichen Zeitrahmen seit Jahresbeginn. Angenommen, ich möchte meinen Expert Advisor auf 60 Balken optimieren. Das bedeutet, dass der Prüfer seine Arbeit mit dem 365-(60-43)=348sten Tag (Balken) des vergangenen Jahres beginnen sollte. D.h. wir sollten TimeDayOfYear(TimeCurrent()) nehmen (es ist ein int!) und vergleiche ihn mit 348. Natürlich müssen wir auch den Wert des Jahres (des letzten Jahres) in Betracht ziehen. Alles in allem glaube ich, dass ich es geschafft habe. Wir müssen sie nur noch umsetzen. Viel schwieriger wird es bei kleinen TFs, wenn man eine große Anzahl von Balken testen muss, die (z.B. 5-Minuten) über die vorherige Stunde oder vielleicht den vorherigen Tag hinausgehen.

 

Ihr ganzes Problem liegt in der Problemstellung, machen Sie es den anderen klar... Ich habe ehrlich gesagt nicht verstanden, ab welcher Zeit Sie testen müssen...

Wenn Sie mit einem 60er-Takt beginnen müssen, beginnen Sie mit einem 60er-Takt.

int startTime = iTime(NULL,PERIOD_D1, N); // N - Nummer des Balkens ab dem aktuellen Zeitpunkt auf dem täglichen Zeitrahmen