Ошибки, баги, вопросы - страница 737

 
-Alexey-:
Почему когда я нажимаю кнопку "Старт" тестер тестирует не с уровня начального депозита, а с уровня, на котором закончился прошлый тест. В 4-ке нет такой проблемы. Как запускать тестирование с уровня начального депозита?

Мы не можем воспроизвести у себя описанную Вами ситуацию.

Давайте больше подробностей

 
stringo:

Мы не можем воспроизвести у себя описанную Вами ситуацию.

Давайте больше подробностей

Генерирую в мастере эксперта на средней со стопом параболик. Запускаю тест по ценам открытия, нажимаю "отмена". Запускаю второй раз - получается описанная ситуация(при этом график баланса и эквити рисуется не заново, а продолжается). С экспертами не из мастера все в порядке.
Мастер MQL5: Создание эксперта без программирования
Мастер MQL5: Создание эксперта без программирования
  • 2010.12.15
  • MetaQuotes Software Corp.
  • www.mql5.com
Вы хотите быстро проверить торговую идею, не тратя времени на программирование? Выберите в "Мастере MQL5" нужный тип торговых сигналов, подключите модули сопровождения позиций и управления капиталом - на этом вся работа закончена. Создайте свои реализации модулей или закажите их через сервис "Работа" - и комбинируйте новые модули с уже существующими.
 

Похоже что это баг. 

В режиме мультивалютного тестирования когда ждем появления нового бара на двух инструментах тестер ведет себя не корректно.

Немного пояснений. В функции  isNewBar  при появлении нового бара на основном инструменте в цикле ждем появление нового бара на другом финансовом инструменте. 

Код прилагаю.

//в тестере баг в режиме мультивалютного тестирования
//позиция открывается если на двух инструментах появился новый бар 
#include <Trade\Trade.mqh>
#include <Trade\OrderInfo.mqh>
#include <Trade\PositionInfo.mqh>
//--- input parameters
input int      Per=10;//период средней 
input string   Instrum1="EURUSD";//первый инструмент
input string   Instrum2="GBPUSD";//второй инструмент
//-------------------------------------------------------
CTrade   trade;//торговые функции
COrderInfo orderinfo;//информация об ордере
CPositionInfo  posinfo;//информация о позиции
int hiMA ;//хэндл индикатора 
int OnInit()
  {
      hiMA=iMA(_Symbol,_Period,Per,0,MODE_SMA,PRICE_OPEN) ;
      if(hiMA < INVALID_HANDLE) return(-1) ;
      return(0);
  }
//====================================================================
void OnDeinit(const int reason)
  {
   IndicatorRelease(hiMA) ;
  }
//=====================================================================
void OnTick()
  {
      if(!isNewBar(Instrum2)) return   ;
      //Print("  Это новый бар  ");
      double   Ma[1] ;//показания индикатора 
      CopyBuffer(hiMA,0,0,1,Ma) ;
      MqlTick price;// будет использоваться для получения текущих/последних котировок цены
      bool possel=posinfo.Select(Instrum1) ;
      SymbolInfoTick(Instrum1,price) ;
      if(possel && price.bid > Ma[0] && posinfo.PositionType() == POSITION_TYPE_SELL)
         {//цена выше средней закрываем короткую позу
            trade.PositionClose(Instrum1) ; return ;
         }
      if( !possel && price.bid > Ma[0])
         {//цена выше средней нет поз открываем длинную позу 
            trade.Buy(0.1,Instrum1,0,0,0,NULL) ; return ;
         }
      if( possel && price.ask < Ma[0] && posinfo.PositionType() == POSITION_TYPE_BUY)
         {//цена ниже средней закрываем длинную позу
            trade.PositionClose(Instrum1) ; return ;
         } 
      if(!possel && price.ask < Ma[0])
         {// цена ниже средней нет поз открываем короткую позу
            trade.Sell(0.1,Instrum1,0,0,0,NULL) ;
         }
      return ;
  }
//=======================================================================
bool isNewBar(string other_symbol)
  {//возвращает труе если новый бар на двух инструментах
   static datetime last_bar_time=0;
   int cntsleep ;
   if(last_bar_time==0)
     {//--- это первый вызов, запишем время открытия и выйдем
      last_bar_time=(datetime)SeriesInfoInteger(_Symbol,Period(),SERIES_LASTBAR_DATE);
      return(false);
     }
   datetime curr_time=(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);
   if(curr_time!=last_bar_time)
     {//время открытия не совпадает это новый бар 
      last_bar_time=curr_time;
      cntsleep=0 ;
      while(!(curr_time == (datetime)SeriesInfoInteger(other_symbol,Period(),SERIES_LASTBAR_DATE)))
         {// ждем появления нового бара на втором инструменте   
            Sleep(5000); 
            if(cntsleep >10) return(false) ;// недождались 
            cntsleep++ ;
         }
      return(true) ;
     }
    return(false) ;
  }
Обработчик события "новый бар"
Обработчик события "новый бар"
  • 2010.10.04
  • Konstantin Gruzdev
  • www.mql5.com
Язык программирования MQL5 позволяет решать задачи на совершенно новом уровне. Даже те задачи, которые уже вроде имеют решения, благодаря объектно-ориентированному программированию могут подняться на качественно новый уровень. В данной статье специально взят простой пример проверки появления нового бара на графике, который был преобразован в достаточно мощный и универсальный инструмент. Какой? Читайте в статье.
 
ivandurak:

Похоже что это баг. 

В режиме мультивалютного тестирования когда ждем появления нового бара на двух инструментах тестер ведет себя не корректно.


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

Кроме  того, обращаю ваше внимание на статью Основы тестирования в MetaTrader 5. В ней есть объяснение механизма генерации тиков и базовых понятий.

 
Rosh:

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

Кроме  того, обращаю ваше внимание на статью Основы тестирования в MetaTrader 5. В ней есть объяснение механизма генерации тиков и базовых понятий.

Все просто.

Запускаем советника на оптимизацию видим такой результат.

 

Выбираем например 4-й проход   запускаем советника, получаем его нормальную работу со всеми сделками вот отчет.

 

Складывается ощущение. Что тестер в режиме оптимизации мультивалютника не может привязать сделку к бару если она открылась не на опен бара. 

Если в функции  isNewBar закоментировать цикл, по логике не ждать появление нового бара на другом инструменте то все работает. Версия терминала 5 билд 642.

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

С праздником. 

 
-Alexey-:
Генерирую в мастере эксперта на средней со стопом параболик. Запускаю тест по ценам открытия, нажимаю "отмена". Запускаю второй раз - получается описанная ситуация(при этом график баланса и эквити рисуется не заново, а продолжается). С экспертами не из мастера все в порядке.

Создайте заявку в сервисдеск, где укажите

  • номер билда
  • битность системы и версию Windows.
  • приложите код советника
  • настройки и входные параметры советника
 

Вот кусок кода. Как сделать так, чтобы при значении  trpar2=false , параметры  input int grusdchf=100; input int grusdjpy=100; не оптимиировались 

//------------------------------------------------------------
input bool  trpar1=true ;//разрешение торговли по EURUDSD
input int   greurusd=100;//сетка для EURUSD
input int   grgbpusd=100;//сетка для GBPUSD
//------------------------------------------------------------
input bool  trpar2=true;//
input int   grusdchf=100;//
input int   grusdjpy=100;//
//------------------------------------------------------------
input bool  trpar3=true;//
input int   graudjpy=100;//
input int   grchfjpy=100;//
 
ivandurak:

Вот кусок кода. Как сделать так, чтобы при значении  trpar2=false , параметры  input int grusdchf=100; input int grusdjpy=100; не оптимиировались 

 

Не выставлять флажки в тестере напротив этих параметров. Или уточните вопрос, а то вижу двусмысленность. :)

 

Вопрос:

Нужно передать в функцию массив указателей на объекты. По ссылке, разумеется (массив же).

Какой синтаксис использовать?

void MyFunc(MyClass &*MayClassPointersArray[]);  / не компилируется.
void MyFunc(MyClass *&MayClassPointersArray[]);  / компилируется, но сомневаюсь что смысл правильный

Зря сомневаюсь?  Или таки нужно как-то иначе?

 
ivandurak:

Вот кусок кода. Как сделать так, чтобы при значении  trpar2=false , параметры  input int grusdchf=100; input int grusdjpy=100; не оптимиировались 

input bool trpar2=true;
input int grusdchf=100;
input int grusdjpy=100;

if (trpair2==false)  // если false то всегда 100
  {
   x_grusdchf=100;
   x_grusdjpy=100;
  }
 else                // если true то значения с перебора 
  {
   x_grusdchf=grusdchf;
   x_grusdjpy=grusdjpy;
  }
Сталкивался с такой потребностью.Криво и жестоко ,но на правильный результат выходит.Флажки включены на всех трех входных данных.А далее блокируется при false.
Причина обращения: