Новый билд MetaTrader 4. Build 177.
Только что специально протестировал на предыдущем 177 и обновленном билде 177 - все сходится до цента.
К тому же, этот эксперт торгует на открытии бара - на него механизм моделлера вообще не оказывает влияния.
А на чем тест шел? Вероятно, это другой символ или другой период.
Да нет, наверняка все дело в том, что в предыдущие разы на других параметрах (extern) тестировались или на других таймфреймах и символах. К тому же, внутри тестера вроде ничего не меняли.
ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0); //---- sell conditions if(Open[1]>ma && Close[1]<ma)
Насколько корректно проверять значение мувинга в нулевом баре по ценам Close? Или вы изменили механизм расчета индикаторов при тестировании? Нет ли тут подглядывания в будущее? Проверять через логи не хочу (честно признаюсь), наверняка вы это делали. Просто много чего и так приходится проверять по работе, времени жалко, а у вас ответы должны быть готовые. Потому и спрашиваю. Условия для покупки в советнике аналогичны - сравнение цен открытия и закрытия последнего закрытого бара с мувингом в нулевом баре по Клозам.
Какие параметры использовались? Я у себя прогоню на двух разных билдах и выложу в форум для проверки.
ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0); //---- sell conditions if(Open[1]>ma && Close[1]<ma)
Насколько корректно проверять значение мувинга в нулевом баре по ценам Close? Или вы изменили механизм расчета индикаторов при тестировании? Нет ли тут подглядывания в будущее? Проверять через логи не хочу (честно признаюсь), наверняка вы это делали. Просто много чего и так приходится проверять по работе, времени жалко, а у вас ответы должны быть готовые. Потому и спрашиваю. Условия для покупки в советнике аналогичны - сравнение цен открытия и закрытия последнего закрытого бара с мувингом в нулевом баре по Клозам.
Абсолютно корректно. Мы же на своем периоде и Close мы абсолютно точно знаем. Особенно если эксперт создан и торгует только на открытии бара.
Подглядывания в будущее на своем текущем графике небыло и нет.
А вот возможность получения несмоделированного Close с _другого_ периода мы исправили еще в билде 176:
"MetaTrader 4. Build 176."
Как мы и обсуждали, Open & Close на чужом периоде своего символа всегда 100% правильные,
а Low = min(Open,Close) и High=max(Open,Close), Volume не моделируется и берется как есть.
1. При оптимизации отключается работа с объектами;
2. Добавлено моделирование нулевого бара чужого периода на тестируемом инструменте;
3. При тестировании при обращении индикатора к чужому периоду и символу осуществляется задержка для подкачки недостающих данных;
4. При копировании в буфер обмена строка параметров разбивается при помощи символов табуляции;
5. Поправлен перебор параметров оптимизации;
6. Добавлена возможность использования шаблона tester.tpl для открытия графика с результатами тестирования;
7. Формат дат тестирования изменен на YYYY.MM.DD;
8. Во вкладке результатов оптимизации добавлена возможность показывать входные параметры;
9. Исправлена ошибка сортировки по символу в списке открытых позиций;
10. Поправлена переинициализация экспертов при смене счета;
11. Поправлена функция TimeToStr() в тестере;
12. Исправлены ошибки по крешлогам.
Завтра проверю на работе. Я уже начинаю думать, что у меня другой советник MovingAverage, только откуда он взялся - не могу понять. На всякий случай выкладываю его код, неужели только у меня такая мистика.
//+------------------------------------------------------------------+ //| Moving Average.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #define MAGICMA 20050610 extern double Lots = 0.1; extern double MaximumRisk = 0.02; extern double DecreaseFactor = 3; extern double MovingPeriod = 12; extern double MovingShift = 6; //+------------------------------------------------------------------+ //| Calculate open positions | //+------------------------------------------------------------------+ int CalculateCurrentOrders(string symbol) { int buys=0,sells=0; //---- for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA) { if(OrderType()==OP_BUY) buys++; if(OrderType()==OP_SELL) sells++; } } //---- return orders volume if(buys>0) return(buys); else return(-sells); } //+------------------------------------------------------------------+ //| Calculate optimal lot size | //+------------------------------------------------------------------+ double LotsOptimized() { double lot=Lots; int orders=HistoryTotal(); // history orders total int losses=0; // number of losses orders without a break //---- select lot size lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1); //---- calcuulate number of losses orders without a break if(DecreaseFactor>0) { for(int i=orders-1;i>=0;i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; } if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue; //---- if(OrderProfit()>0) break; if(OrderProfit()<0) losses++; } if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1); } //---- return lot size if(lot<0.1) lot=0.1; return(lot); } //+------------------------------------------------------------------+ //| Check for open order conditions | //+------------------------------------------------------------------+ void CheckForOpen() { double ma; int res; //---- go trading only for first tiks of new bar if(Volume[0]>1) return; //---- get Moving Average ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0); //---- sell conditions if(Open[1]>ma && Close[1]<ma) { res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red); return; } //---- buy conditions if(Open[1]<ma && Close[1]>ma) { res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue); return; } //---- } //+------------------------------------------------------------------+ //| Check for close order conditions | //+------------------------------------------------------------------+ void CheckForClose() { double ma; //---- go trading only for first tiks of new bar if(Volume[0]>1) return; //---- get Moving Average ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0); //---- for(int i=0;i<OrdersTotal();i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue; //---- check order type if(OrderType()==OP_BUY) { if(Open[1]>ma && Close[1]<ma) OrderClose(OrderTicket(),OrderLots(),Bid,3,White); break; } if(OrderType()==OP_SELL) { if(Open[1]<ma && Close[1]>ma) OrderClose(OrderTicket(),OrderLots(),Ask,3,White); break; } } //---- } //+------------------------------------------------------------------+ //| Start function | //+------------------------------------------------------------------+ void start() { //---- check for history and trading if(Bars<100 || IsTradeAllowed()==false) return; //---- calculate open orders by current symbol if(CalculateCurrentOrders(Symbol())==0) CheckForOpen(); else CheckForClose(); //---- } //+------------------------------------------------------------------+
Кстати, обратил внимание, что механизм открытия ордеров не Стоп и Реверс, хотя было бы логично, если бы по приходу противоположного сигнала открываться в эту сторону, а не только закрывать позиции. А так получается через раз, и потому от случайного количества баров в истории Евры на дневках может сильно изменяться конечный итог. Вариант, что у меня разное число дневок по Евре дома и на работе , я отмел, так как вроде по Евре у меня всегда на дневках скачена вся доступная история, и поэтому сейчас в непонятном ступоре.
Да, точно. Чистый баг - обязательно исправим в понедельник к билду 178.
Спасибо!

- Бесплатные приложения для трейдинга
- Форексный VPS бесплатно на 24 часа
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
1. Поток тестирования выполняется с пониженным приоритетом;
2. Эксперту дается время на завершение функции старт перед деинициализацией;
3. В MQL4 добавлена функция IsStopped() что дает возможность эксперту узнать о том, что его просят как можно быстрее остановиться. Например, этой функцией желательно проверятся в тяжелых вычислениях или ожиданиях.
4. При удалении текущего активного счета из Navigator происходит его зачистка в настройках и отключение от сервера;
5. На графике тестирования рисуется график Equity, в том случае, если он отличается от баланса;
6. Исправлена функция iBarsShift();
7. В режиме фиксации масштаба графика 1:1 расширен диапазон цен;
8. Добавлена возможность установки дат из контекстного меню графика и результатов тестирования;
9. Поправлена конфигурация окон при работе на двух мониторах;
10. Добавлена возможность удаления по кнопке Delete сервера в списке серверов при выделении демо-счета;
11. Поправлена отсылка почты + в журнал выводится диагностика событий при отсылке почты;
12. Добавлена автоматизация при первоначальном вводе параметров оптимизации;
13. Массовые поправки в русском словаре языка MQL4 из состава MetaEditor;
14. В отчет тестера добавлено визуальный показатель качества моделирования
цвета:
- розовый - нет данных низших таймфреймов
- градации зеленого - наличие данных (чем зеленее цвет, тем мельче данные)
Соответственно, теперь каждый может видеть, что качество моделирования напрямую зависит от наличия данных из более мелких таймфреймов. Чем больше покрытие зеленой полосой, тем более качественно смоделированы данные.
Этот билд тестовый и не включен в LiveUpdate.
Мы его выпустим под билдом 178 в понедельник после того как дополнительно протестируем его за эти выходные. Если кто-то желает его попробовать, то скачайте дистрибутив по ссылке:
"торговый терминал MetaTrader 4"
Инсталлировать можно поверх предыдущей версии - все настройки и данные сохранятся.