[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 426

 
ikatsko >>:

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


Хотя:

datetime TimeCurrent( )

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

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


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

Intendete impostare i tempi di trading all'interno di un giorno?

Se è così

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


//B start

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

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

Если так то


Vorrei ottimizzare i parametri di un EA su brevi timeframe su un piccolo periodo di tempo vicino al tempo corrente. Lo Strategy Tester, d'altra parte, permette di impostare la data in cui il processo di ottimizzazione inizia e finisce. Quando il TF è di 15 minuti (per esempio), allora in un giorno (e questo è il minimo che permette al tester di impostare) ci saranno 96 barre. E penso che sia molto. Vorrei che questo TF fosse ottimizzato sulle ultime 2 ore, cioè su 8 barre per esempio.


Ho inserito un tale frammento nell'EA:

extern int History=100; //Storia in barre, su cui lavora l'Expert Advisor
StartDateTime=TimeCurrent()-History*Period()*60;
if(TimeCurrent()<StartDateTime) // L'ora di inizio non è arrivata
{
Alert("L'ora di inizio non è arrivata. EA non ha funzionato.",": ",Symb,", ",Period());
return; // Esci da start()

}

Mi aspettavo che l'EA nel tester di strategia non funzionasse prima di StartDateTime. Ma no!

 
ikatsko >>:

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

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


//B start

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

int Ora( )
Restituisce l'ora corrente (0,1,2,...23) dell'ultima ora del server conosciuta all'inizio del programma (questo valore non cambia durante l'esecuzione del programma).

Nota: durante i test, viene simulata l'ultima ora conosciuta del server.


Il tester supporta M1 TF, non legarlo alle barre, legalo al tempo, forse ti serve anche quello.

 
costy_ >>:

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

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


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

La frase: quando si fa il test, l'ultimo tempo conosciuto del server viene simulato è presente e in TimeCurrent( ) però non funziona. La tua variante è buona, ma dobbiamo controllare se funziona? In secondo luogo, quando si cambia TF è necessario cambiare un pezzo di codice o si deve riconoscere in quale TF funziona, per percepire adeguatamente i numeri "inizio" e "fine". In terzo luogo, penso che sia molto più conveniente impostare il numero di baro all'indietro - non c'è bisogno di calcolare l'"inizio" manualmente. In MQL ci occupiamo di barre! E l'ultima cosa: qual è lo svantaggio di questo codice? (Tranne che non funziona nel tester di strategia. E questa è la mia domanda)

 
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_ >>:

Un po' come:

datetime è data e ora, un intero senza segno contenente il numero di secondi trascorsi dalle ore 0 del 1° gennaio 1970.

и

I dati di tipo color e datetime sono rappresentati come interi. I tipi interi, insieme ai tipi a virgola mobile, sono chiamati tipi aritmetici (numerici).

Se no, come uscirne.

Grazie per la dritta sul formato dei numeri, però. C'è una direzione di ricerca. Se ancora c'è una soluzione pronta sarà grato

 

In realtà, è meglio usare Time[0] invece di TimeCurrent() nel tester, mi sembrava che TimeCurrent() funzionasse nel tester prima...

e ora è più probabile che TimeCurrent() nel tester (o non nel tester) dia il tempo in cui l'ultima citazione è arrivata...


in questo caso funzionerà

extern int History=100; // Storia in barre, su cui lavora l'Expert Advisor
StartDateTime=Time[History];
if(Time[0] < StartDateTime) // Il tempo di inizio non è arrivato
{
Alert("Il tempo di inizio non è arrivato. EA non funziona.",": ",Symb,", ",Period());
return; // Exit start()
}

 
ikatsko >>:

Вроде как:

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

и

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

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

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

Bene, nel commento precedente, l'errore è stato visualizzato tramite l'avviso.

L'aiuto dice "Nota: durante i test, viene simulata l'ultima ora conosciuta del server", ma se non è simulata tutte le domande all'editor dell'aiuto.

Hai controllato, hai trovato l'errore...

Solo voi conoscete la soluzione, poiché non conosciamo l'ulteriore direzione della logica.

Non capisco proprio perché ci sia così tanto testo

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

quando tutto può essere fatto in modo molto più semplice?

 
costy_ >>:

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

Sono completamente d'accordo con la tua soluzione nella risposta precedente: è un'incompatibilità di formato di dati! La richiesta di una soluzione off-the-shelf si riduce a risolvere il problema della conversione dei formati. Ma ovviamente MQL4 non ha tali opzioni. Per esempio, oggi è il 43° giorno dell'anno, cioè la 43° barra nel timeframe giornaliero dall'inizio dell'anno. Supponiamo che io voglia ottimizzare il mio Expert Advisor su 60 barre. Significa che il tester dovrebbe iniziare a lavorare con 365-(60-43)=348° giorno (barra) dell'anno precedente. Cioè dovremmo prendere TimeDayOfYear(TimeCurrent()) (è un int!) e confrontarlo con 348. Ovviamente dobbiamo tenere conto anche del valore dell'anno (l'anno scorso). Tutto sommato, credo di aver capito. Dobbiamo solo implementarlo. Sarà molto più difficile su piccoli TF, quando si deve testare un gran numero di barre, che (per esempio, 5-minuti) vanno oltre l'ora precedente, o forse il giorno precedente.

 

Tutto il tuo problema è nella dichiarazione del problema, rendilo chiaro agli altri... Onestamente non ho capito da che ora hai bisogno di testare...

Se dovete iniziare con una barra di 60, iniziate con 60 barre.

int startTime = iTime(NULL,PERIOD_D1, N); // N - numero della barra dal momento attuale sul timeframe giornaliero