| / | Форум |
33780 |
Rosh
31.07.2007 20:17
getch писал (а): Действительно, функция не до конца корректна. Правильно сравнивать
не только на условие "больше", но и на условие "равно",
то ест так:Скрипт, показывающий ошибку вашей функции сравнения двух double: //+------------------------------------------------------------------+ //| right comparison of 2 doubles | //+------------------------------------------------------------------+ bool CompareDoubles(double number1,double number2, int Dig,double accuracy) { if(NormalizeDouble(MathAbs(number1-number2),Dig)>=accuracy) return(true); else return(false); } Я сделал более подробный вариант советника, и протестировал все периоды по символу EURUSD с Dayli до минуток на модели "Все тики". Предварительно я скачал историю с 1999 года из History Center c автоматическим созданием всех таймфреймов. Также я скачал последний билд терминала от 25.07.2007. Вот код советника: //+------------------------------------------------------------------+ //| CheckHighAndLow-2.mq4 | //| Copyright © 2007, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ru/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2007, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/ru/" extern string FileName = "TestTicks.txt"; int handle; double tOpen, tHigh, tLow, tClose; int CountErrors; int PrevTime; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- PrevTime = Time[0]; tOpen = Bid; tHigh = Bid; tLow = Bid; tClose = Bid; CountErrors = 0; handle=FileOpen(FileName,FILE_READ|FILE_WRITE, "\t"); FileSeek(handle, 0, SEEK_END); FileWrite(handle,Symbol(),Period()); FileWrite(handle,"Time","tOpen","Open[1]","tHigh","High[1]","tLow","Low[1]","tClose","Close[1]"); return(0); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- string Str; Str = "Bar Errors = " + DoubleToStr(100.0 * CountErrors / Bars, 2) + "%"; Print(Str); FileWrite(handle, Str); FileClose(handle); //---- return(0); } //+------------------------------------------------------------------+ //| right comparison of 2 doubles | //+------------------------------------------------------------------+ bool CompareDoubles(double number1,double number2, int Dig,double accuracy) { if(NormalizeDouble(MathAbs(number1-number2),Dig)>=accuracy) return(true); else return(false); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- string Str; if (PrevTime == Time[0]) { if (Bid > tHigh) tHigh = Bid; else if (Bid < tLow) tLow = Bid; } else { PrevTime = Time[0]; if (CompareDoubles(tOpen,Open[1], Digits,Point) || CompareDoubles(tHigh,High[1], Digits,Point) || CompareDoubles(tLow,Low[1], Digits,Point) || CompareDoubles(tClose,Close[1], Digits,Point)) { Str = TimeToStr(Time[1]) + ", Volume = " + DoubleToStr(Volume[1], 0); Print(Str); FileWrite(handle,TimeToStr(Time[1]),tOpen,Open[1], tHigh,High[1],tLow,Low[1],tClose,Close[1]); CountErrors++; } tOpen = Bid; tHigh = Bid; tLow = Bid; } tClose = Bid; //---- return(0); } //+------------------------------------------------------------------+Результаты немного меня озадачили. На всех таймфреймах количество ошибок 0. Кроме перида Daily На дневном периоде действительно большой % ошибок. Завтра я проверю на этих же данных этим же советником, так как предыдущий тест на рабочем компьютере показал только одну ошибку моделирования. Если Вам несложно, прошу Вас скачать последний билд терминала и установить в отдельную папку. А также загрузить котировки из History Center. Если у Вас на EURUSD покажет ошибки, сообщите пожалуйста. Спасибо Вам за найденные ошибки в моем коде и терминале. |
|
getch
02.08.2007 13:03
Сделал все, как в первом посте, только билд 208. Ошибки остались. Закачал USDJPY из History Center Alpari, ошибки исчезли. Надо смотреть Period_converter. Спасибо за внесенные исправления. Да, только что произошла неприятность: при попытке закрыть ордер терминал выдал крэш и история котировок по множеству инструментов (терминал на реале висел несколько недель) исчезла. Хотелось бы, чтобы при крэше все же история котировок сохранялась. Еще раз спасибо. |
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий