[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 426

costy_
2446
costy_  
ikatsko >>:

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


Хотя:

datetime TimeCurrent( )

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

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


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

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

Если так то

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


//B start

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

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

Если так то


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


Я вставил в советника такой фрагмент:

extern int History=100; //История в барах, на которой работает советник
StartDateTime=TimeCurrent()-History*Period()*60;
if(TimeCurrent()<StartDateTime) // Время старта не наступило
{
Alert("Время старта не наступило. Эксперт не работает.",": ",Symb,", ",Period());
return; // Выход из start()

}

И предполагал, что советник в тестере стратегий не будет работать ранее StartDateTime. Ан нет!

costy_
2446
costy_  
ikatsko >>:

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

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


//B start

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

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

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


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

Ivan Katsko
558
Ivan Katsko  
costy_ >>:

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

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


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

Фраза: при тестировании последнее известное время сервера моделируется присутствует и в TimeCurrent( ) однако не работает. Ваш вариант хорош, но надо проверить работает ли? Во-вторых при изменении ТФ надо менять кусок кода или должен распознавать в каком ТФ работает, чтоб адекватно воспринимать числа "начало" и "окончание". В-третьих все-таки задать число баро назад по-моему значительно удобней- не надо вычислять вручную это "начало". Мы же в MQL имеем дело с барами! И последнее: чем все же плох приведенный мной код? (Разве что тем, что не работает в тестере стратегий. А именно в этом мой вопрос)

costy_
2446
costy_  
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()

} 
Ivan Katsko
558
Ivan Katsko  
costy_ >>:

Вроде как:

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

и

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

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

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

keekkenen
1115
keekkenen  

вообще-то в тестере вместо TimeCurrent() лучше использовать Time[0], раньше как мне казалось TimeCurrent() в тестере работал..

а сейчас скорее всего TimeCurrent() в тестере (так и не в тестере) будет выдавать время когда пришла последняя котировка..


тогда получится

extern int History=100; //История в барах, на которой работает советник
StartDateTime=Time[History];
if(Time[0] < StartDateTime) // Время старта не наступило
{
Alert("Время старта не наступило. Эксперт не работает.",": ",Symb,", ",Period());
return; // Выход из start()
}

costy_
2446
costy_  
ikatsko >>:

Вроде как:

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

и

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

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

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

Ну так в предыдущем коменте через алерт вывел ошибку.

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

Вы проверили, нашли ошибку...

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

Не пойму только зачем столько текста

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

если все делается гораздо проще?

Ivan Katsko
558
Ivan Katsko  
costy_ >>:

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

Я согласен полностью с вашим решением в предыдущем ответе: это несовместимость форматов данных! Просьба по готовому решению сводится к решению вопроса переобразования форматов. Но очевидно таких вариантов MQL4 не имеет. И теперь я вижу решение поставленного мной вопроса в следующем (излагаю, может кому тоже сгодится): например, сегодня 43-й день года, т.е. 43-й бар на дневном ТФ от начала года. Пусть я хочу оптимизировать свой советник на 60-и барах. Это значит, что на дневном ТФ тестер должен начать работу с 365-(60-43)=348-го дня (бара) прошлого года. Т.е. надо взять TimeDayOfYear(TimeCurrent()) (это же int!) и сравнить его с 348. Очевидно надо учесть ещё и значение года (прошлого). В общем, мне кажется, я все понял. Надо только реализовать. Гораздо сложнее будет на малых ТФ, когда надо будет протестировать большое число баров, которые (например, 5-ти минутки) будут выходить за пределы предыдущего часа, а может и предыдущего дня.

keekkenen
1115
keekkenen  

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

если нужно начать с 60 бара так и берите время с него

int startTime = iTime(NULL,PERIOD_D1, N); // N - номер бара от текущего момента на дневном тф