Тестер в новой сборке 604 работает некорректно - страница 4

 

Создал этот простой советник для тестирования на 509 и 604, оба на демо-счете MQ 444 на том же сервере, бэктест на те же даты.

  • Советник совершает чередующиеся сделки buy sell buy sell
  • фиксированный SL/TP. Размер лота основан на балансе счета. Исходные коды ниже.
  • 509 скомпилирован на 509 и протестирован на 509
  • 600 скомпилирован на 604 и протестирован на 604
Отчет тестера стратегий
Тестовый советник 509
MetaQuotes-New MT4 Test (Build 509)

СимволEURUSD (евро против доллара США)
Период1 час (H1) 2013.10.14 06:00 - 2013.12.30 23:00 (2013.01.01 - 2013.12.31)
МодельКаждый тик (наиболее точный метод, основанный на всех доступных наименьших таймфреймах)
Бары в тесте1384Смоделировано тиков1448514Качество моделирования46.42%
Ошибки несовпадения графиков0
Начальный депозит10000.00
Общая чистая прибыль-1199.25Валовая прибыль20200.90Валовый убыток-21400.15
Коэффициент прибыли0.94Ожидаемая прибыль-8.75
Абсолютная просадка2515.20Максимальная просадка3725.52 (33.23%)Относительная просадка33.23% (3725.52)
Всего сделок137Короткие позиции (выигранные %)68 (41.18%)Длинные позиции (выигранные %)69 (44.93%)
Прибыльные сделки (% от общего количества)59 (43.07%)Убыточные сделки (% от общего количества)78 (56.93%)
Крупнейшийприбыльная сделка394.33убыточная сделка-337.74
Среднийприбыльная торговля342.39убыточная торговля-274.36
Максимумпоследовательных побед (прибыль в деньгах)4 (1494.97)последовательные проигрыши (убыток в деньгах)12 (-3337.77)
Максимальныйпоследовательная прибыль (количество выигрышей)1494.97 (4)последовательный убыток (количество убытков)-3337.77 (12)
Среднеепоследовательные выигрыши2последовательные поражения2
Среднеепобеды подряд2последовательные поражения2

 
Тестовый советник 600+
MetaQuotes-New MT4 Test (Build 604)

СимволEURUSD (евро против доллара США)
Период1 час (H1) 2013.10.14 06:00 - 2013.12.30 23:00 (2013.01.01 - 2013.12.31)
МодельКаждый тик (наиболее точный метод, основанный на всех доступных наименьших таймфреймах)
Бары в тесте1384Смоделировано тиков1459801Качество моделирования46.42%
Ошибки несоответствия графиков0
Начальный депозит10000.00СпредТекущий (6)
Общая чистая прибыль-1985.08Валовая прибыль19147.44Валовый убыток-21132.52
Коэффициент прибыли0.91Ожидаемая прибыль-14.81
Абсолютная просадка2677.75Максимальная просадка4021.28 (35.45%)Относительная просадка35.45% (4021.28)
Всего сделок134Короткие позиции (выигранные %)67 (40.30%)Длинные позиции (выигранные %)67 (44.78%)
Прибыльные сделки (% от общего количества)57 (42.54%)Убыточные сделки (% от общего количества)77 (57.46%)
Крупнейшийприбыльная сделка394.33убыточная сделка-337.74
Среднийприбыльная торговля335.92убыточная торговля-274.45
Максимумпоследовательных побед (прибыль в деньгах)4 (1494.97)последовательные проигрыши (убыток в деньгах)12 (-3336.50)
Максимальныйпоследовательная прибыль (количество выигрышей)1494.97 (4)последовательный убыток (количество убытков)-3336.50 (12)
Среднеепоследовательные выигрыши2последовательные проигрыши2
 
//========================================================================
//|                                                      Test EA 509.mq4 |
//|                                                  Copyright 2014, SDC |
//|                                        https://www.mql5.com/en/users/sdc |
//========================================================================
#property copyright "Copyright 2014, SDC"
#property link      "https://www.mql5.com/en/users/sdc"

//========================================================================
  int start()
//========================================================================
 {
//----
  static int ticket;
//----
  if(OrderSelect(ticket,SELECT_BY_TICKET))
  {if(OrderCloseTime()<=0) //-------------------- last order is still open
   {return(0);
   }else //------------------------------------------ last order is closed
   {if(OrderType()==0) ticket = maketrade(1);
    if(OrderType()==1) ticket = maketrade(0);
  }}else //-------------------------------------- cant find previous order
  {ticket = maketrade(0);
  }
//----
  return(0);
 }
//========================================================================
  int maketrade(int op)
//========================================================================
 {
  int errcnt=0;
  int mn = 777;
  int ticket=0;
  double lot=lots();
  double price=0;
  double sl=30;
  double tp=40;
//----
  if(lot<=0)return(0);
  if(Digits == 5 || Digits ==3)
  {sl*=10;
   tp*=10;
  }
  if(op == 0)
  {price = Ask;
   tp = Bid + tp*Point;
   sl = Bid - sl*Point;
  }
  if(op == 1)
  {price = Bid;
   tp = Ask - tp*Point;
   sl = Ask + sl*Point; 
  }
  while(ticket < 1)
  {ticket=OrderSend(Symbol(),op,lot,price,0,sl,tp,"",mn,0,Gold);
   if(ticket>0)return(ticket);
   else errcnt++;
   if(errcnt>2)return(0); //-------------------------------- 3 tries abort
   if(errors(GetLastError())==1) continue; //------------------- try again
   else return(-1);
  }
//----
  return(0);
 }
//========================================================================
  double lots()                                  //---- generic lot sizing
//========================================================================
 {
  string pair    = Symbol();
  double free    = AccountFreeMargin();
  double maxlot  = MarketInfo(pair,MODE_MAXLOT);
  double minlot  = MarketInfo(pair,MODE_MINLOT);
  double onelot  = MarketInfo(pair,MODE_MARGINREQUIRED);
  double lot     = AccountBalance()/10000;
  double newlot  = 0;
  double step    = MarketInfo(pair,MODE_LOTSTEP);
//----
  if(lot*onelot < free) newlot=MathFloor(lot/step)*step;
  else newlot=MathFloor(free/onelot/step)*step;
  if(newlot > maxlot) newlot = maxlot;
  if(newlot < minlot) newlot = minlot;
  if(newlot*onelot < free) return(newlot);
//----   
  return(0);
 }
//========================================================================
  int errors(int error)                     //---- generic errror handling 
//========================================================================
 {
  Print("Test EA 509 Error: ",error);
  if(error==0) return(0);
  switch(error)
  {
//recoverable error
   case  129:  RefreshRates();               return(1); //---- wrong price    
   case  135:  RefreshRates();               return(1); //-- price changed
   case  136:  while(RefreshRates()==false)
               Sleep(1);                     return(1); //------ no quotes
   case  138:  RefreshRates();               return(1); //-------- requote     
   case  146:  Sleep(500);
               RefreshRates();               return(1); //---- system busy
//logical error
   case  130:                                return(2); //-- invalid stops
   case 4108:                                return(2); //- invalid ticket
//critical error
   case   2:                                 return(3); //--- common error
   case   5:                                 return(3); //---- version old
   case  64:                                 return(3); //---- acc blocked
   case 133:                                 return(3); //----- prohibited
   default :                                 return(3); //---- other error
  }
//----
  return(0);
 }
//========================================================================
 
//========================================================================
//|                                                     Test EA 600+.mq4 |
//|                                                  Copyright 2014, SDC |
//|                                        https://www.mql5.com/en/users/sdc |
//========================================================================
#property copyright "Copyright 2014, SDC"
#property link      "https://www.mql5.com/en/users/sdc"
#property version   "1.00"
#property strict
//========================================================================
  void OnTick()
//========================================================================
 {
//----
  static int ticket;
//----
  if(OrderSelect(ticket,SELECT_BY_TICKET))
  {if(OrderCloseTime()<=0) //-------------------- last order is still open
   {return;
   }else //------------------------------------------ last order is closed
   {if(OrderType()==0) ticket = maketrade(1);
    if(OrderType()==1) ticket = maketrade(0);
  }}else //-------------------------------------- cant find previous order
  {ticket = maketrade(0);
  }
//----
  return;
 }
//========================================================================
  int maketrade(int op)
//========================================================================
 {
  int errcnt=0;
  int mn = 777;
  int ticket=0;
  double lot=lots();
  double price=0;
  double sl=30;
  double tp=40;
//----
  if(lot<=0)return(0);
  if(Digits == 5 || Digits ==3)
  {sl*=10;
   tp*=10;
  }
  if(op == 0)
  {price = Ask;
   tp = Bid + tp*Point;
   sl = Bid - sl*Point;
  }
  if(op == 1)
  {price = Bid;
   tp = Ask - tp*Point;
   sl = Ask + sl*Point; 
  }
  while(ticket < 1)
  {ticket=OrderSend(Symbol(),op,lot,price,0,sl,tp,"",mn,0,Gold);
   if(ticket>0)return(ticket);
   else errcnt++;
   if(errcnt>2)return(0); //-------------------------------- 3 tries abort
   if(errors(GetLastError())==1) continue; //------------------- try again
   else return(-1);
  }
//----
  return(0);
 }
//========================================================================
  double lots()                                  //---- generic lot sizing
//========================================================================
 {
  string pair    = Symbol();
  double free    = AccountFreeMargin();
  double maxlot  = MarketInfo(pair,MODE_MAXLOT);
  double minlot  = MarketInfo(pair,MODE_MINLOT);
  double onelot  = MarketInfo(pair,MODE_MARGINREQUIRED);
  double lot     = AccountBalance()/10000;
  double newlot  = 0;
  double step    = MarketInfo(pair,MODE_LOTSTEP);
//----
  if(lot*onelot < free) newlot=MathFloor(lot/step)*step;
  else newlot=MathFloor(free/onelot/step)*step;
  if(newlot > maxlot) newlot = maxlot;
  if(newlot < minlot) newlot = minlot;
  if(newlot*onelot < free) return(newlot);
//----   
  return(0);
 }
//========================================================================
  int errors(int error)                     //---- generic errror handling 
//========================================================================
 {
  Print("Test EA 600+ Error: ",error);
  if(error==0) return(0);
  switch(error)
  {
//recoverable error
   case  129:  RefreshRates();               return(1); //---- wrong price    
   case  135:  RefreshRates();               return(1); //-- price changed
   case  136:  while(RefreshRates()==false)
               Sleep(1);                     return(1); //------ no quotes
   case  138:  RefreshRates();               return(1); //-------- requote     
   case  146:  Sleep(500);
               RefreshRates();               return(1); //---- system busy
//logical error
   case  130:                                return(2); //-- invalid stops
   case 4108:                                return(2); //- invalid ticket
//critical error
   case   2:                                 return(3); //--- common error
   case   5:                                 return(3); //---- version old
   case  64:                                 return(3); //---- acc blocked
   case 133:                                 return(3); //----- prohibited
   default :                                 return(3); //---- other error
  }
//----
  return(0);
 }
//========================================================================
 

509 График:

604 График:

 

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

Edit: Я мог бы догадаться, что это будет само по себе испытание. Приятно, что в MQ есть данные по минутным графикам, начиная с 1974 года, но мне не нужны были все эти данные !!! Это похоже на то, что вы можете не иметь вообще ничего или иметь так много, что вам нужна половина silcon valley в вашем ПК! Мой терминал сейчас работает с 700mb RAM *rollseyes*.

 
SDC:

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

Edit: Я мог бы догадаться, что это будет само по себе испытание. Приятно, что в MQ есть данные по минутным графикам, начиная с 1974 года, но мне не нужны были все эти данные !!! Это похоже на то, что вы можете не иметь их вообще или иметь так много, что вам нужна половина silcon valley в вашем ПК! мой терминал сейчас работает с 700mb RAM *rollseyes*


Здравствуйте, вы можете попробовать M15 и M1 тесты для этого. вы конвертировали код из старого mq4 в новый? вы можете попробовать со старым сложным mq4 советником, с конвертацией в новый mq4.

включая другие типы данных, такие как datetime и т.д. включая внутренние и пользовательские индикаторы... я не смог увидеть никаких индикаторов, используемых в этом коде...

Возможная проблема 604 - потеря точности чисел, как для индикаторов, так и для других чисел.

Мне нужно разработать метод тестирования чисел для сравнения точных значений переменных для двух сред...

 

Возможно, это не первопричина вашей проблемы, но в 60x вам нужно где-то включить ResetLastError()? (1-я команда внутри цикла while?)

 
cbalta:


Здравствуйте, вы можете попробовать M15 и M1 тесты для этого. вы преобразовали код из старого mq4 в новый? вы можете, пожалуйста, попробовать со старым сложным mq4 советником, с преобразованием в новый mq4.

включая другие типы данных, такие как datetime и т.д. включая внутренние и пользовательские индикаторы... я не смог увидеть никаких индикаторов, используемых в этом коде...

Возможной проблемой 604 является потеря точности чисел, для индикаторов и других чисел.

Мне нужно разработать метод тестирования чисел для сравнения точных значений переменных для двух сред...


Я использовал тот же исходный код, который я разместил, я скомпилировал 509 тестовый код на 509 Metaeditor, я скомпилировал 600 исходный код на 604 metaeditor, единственные различия между ними - новый использует void OnTick(), старый использует start().

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

 
ydrol:

Возможно, это не первопричина вашей проблемы, но в 60x вам нужно где-то включить ResetLastError()? (1-я команда внутри цикла while?)

Я не уверен, нужно ли мне это? Я посмотрю, советник выполнил тесты без ошибок, поэтому я не смог увидеть, как работает GetLastError() в новом терминале. Сильное использование оперативной памяти (максимум более 1 ГБ) было связано с десятилетиями данных 1-минутных графиков, которые были загружены с демо-сервера metaquotes, когда я нажал кнопку загрузки в центре истории, мне пришлось удалить некоторые из них.