Новый билд MetaTrader 4. Build 177.

 
Новый билд MetaTrader 4. Build 177.

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"

Инсталлировать можно поверх предыдущей версии - все настройки и данные сохранятся.
 
Что-то изменилось в тестере. Советник Moving Average потерял свою прибыльность. Или это только у меня так?
 
Я стал думать, что у меня дежавю, но нашел на вашем форуме ваш скрин.
 
Что-то изменилось в тестере. Советник Moving Average потерял свою прибыльность. Или это только у меня так?


Только что специально протестировал на предыдущем 177 и обновленном билде 177 - все сходится до цента.
К тому же, этот эксперт торгует на открытии бара - на него механизм моделлера вообще не оказывает влияния.

Я стал думать, что у меня дежавю, но нашел на вашем форуме ваш скрин.


А на чем тест шел? Вероятно, это другой символ или другой период.
 
Я и сам ничего не понимаю. Сделал откат на предыдущий 177 билд (заново его поставил) - та же картина.Перекомпилировал на всякий случай заново - тоже самое. Сейчас буду перегружать комп.
 
Я и сам ничего не понимаю. Сделал откат на предыдущий 177 билд (заново его поставил) - та же картина.Перекомпилировал на всякий случай заново - тоже самое. Сейчас буду перегружать комп.


Да нет, наверняка все дело в том, что в предыдущие разы на других параметрах (extern) тестировались или на других таймфреймах и символах. К тому же, внутри тестера вроде ничего не меняли.
 
Да нет, параметры по умолчанию стоят, как и раньше. И тайм-фрейм тот же - дневки на Евре.Я не занимался оптимизацией советника и первый раз его запустил сегодня на работе - график Баланса был такой же как у вас. Дома обновил на 178 билд и снова запустил с параметрами по умолчанию - вид другой. Моделирование Опенпрайс. Стал копать код , чтобы понять логику советника. Сигналы входа и выхода еще непроверял, но вот нашел интересный момент:
   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
//---- sell conditions
   if(Open[1]>ma && Close[1]<ma)  


Насколько корректно проверять значение мувинга в нулевом баре по ценам Close? Или вы изменили механизм расчета индикаторов при тестировании? Нет ли тут подглядывания в будущее? Проверять через логи не хочу (честно признаюсь), наверняка вы это делали. Просто много чего и так приходится проверять по работе, времени жалко, а у вас ответы должны быть готовые. Потому и спрашиваю. Условия для покупки в советнике аналогичны - сравнение цен открытия и закрытия последнего закрытого бара с мувингом в нулевом баре по Клозам.

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


Какие параметры использовались? Я у себя прогоню на двух разных билдах и выложу в форум для проверки.

Моделирование Опенпрайс. Стал копать код , чтобы понять логику советника. Сигналы входа и выхода еще непроверял, но вот нашел интересный момент:

   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 не моделируется и берется как есть.

MetaTrader 4. Build 176.

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();
//----
  }
//+------------------------------------------------------------------+



Кстати, обратил внимание, что механизм открытия ордеров не Стоп и Реверс, хотя было бы логично, если бы по приходу противоположного сигнала открываться в эту сторону, а не только закрывать позиции. А так получается через раз, и потому от случайного количества баров в истории Евры на дневках может сильно изменяться конечный итог. Вариант, что у меня разное число дневок по Евре дома и на работе , я отмел, так как вроде по Евре у меня всегда на дневках скачена вся доступная история, и поэтому сейчас в непонятном ступоре.

 
В новом билде на вкладке Peзyльтaты в тестере в графе Прибыль все значения 0.00, а баланс меняется.
 
В новом билде на вкладке Peзyльтaты в тестере в графе Прибыль все значения 0.00, а баланс меняется.


Да, точно. Чистый баг - обязательно исправим в понедельник к билду 178.
Спасибо!