Баг в тестере стратегий билд 1375

 

1) Обновился с версии 1340 до версии 1375, советник при тестировании стал выдавать разные результаты торговли на одних и тех же параметрах при включении\выключении режима визуализации. Каким образом режим визуализации начал влиять на результат ?

 2) При тестировании на реальных тиках, цена исполнения рыночного ордера (CTrade.Buy / CTrade.Sell) иногда в моменте отличается от цены Bid\Ask если запросить текущую цену сразу до\после исполнения. Иногда в большую сторону, иногда в меньшую на 1-4 пункта. Неужели между двумя последжовательными действиями - торговая операция и запрос текущих цен успевает прийти какой то тик и текущая цена меняется?

 

1. Отчёты тестера покажите, чтобы можно было сравнить. Не включена ли у вас задержка исполнения?

2. Покажите исходный код и логи

 

1) Где взять отчеты тестера? Задержка исполнения не включена.

2) Выдержка кода, кратко - вызывается метод CheckOrdersPrice() который по массиву виртуальных ордеров (в памяти, отсортирован по цене, для BUY по убыванию, для SELL по возрастанию) смотрит, какие ордера могут исполнится (вызов происходит на каждый новый бар). В методе берется текущая цена GetSymbolPrice(), затем открывается рыночный ордер OpenMarketPosition(), после этого все логируется. Когда лог пишется, то цена текущая как раз и отличается от цены исполнения рыночного ордера на 1-4 пункта.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CheckOrdersPrice(int symbolIndex)
  {
   if(_data[symbolIndex].ordersCount==0)
      return;

   ENUM_VECTOR vector=GetVector(symbolIndex);
   ENUM_SYMBOL_INFO_DOUBLE priceType=vector==VECTOR_BUY ? SYMBOL_ASK : SYMBOL_BID;

   double price=GetSymbolPrice(symbolIndex,priceType);
   int idx=0;
   while(idx<_data[symbolIndex].ordersCount && 
         ((_data[symbolIndex].orders[idx].price >= price && vector == VECTOR_BUY) ||
         (_data[symbolIndex].orders[idx].price <= price && vector == VECTOR_SELL)))
     {
      idx++;
     }

// по всем ордерам, которые должны исполнится открываем позиции
   for(int j=0; j<idx; j++)
     {
      double filledPrice=OpenMarketPosition(symbolIndex,_data[symbolIndex].orders[j].volume,vector);
      Comment(StringFormat("Исполнен ордер %d, инструмент %s, объем %.2f, цена ордера %.5f, цена исполнения %.5f, цена текущая %.5f, тип %s",
              _data[symbolIndex].orders[j].id,
              _symbolParams[symbolIndex].symbol,
              _data[symbolIndex].orders[j].volume,
              _data[symbolIndex].orders[j].price,
              filledPrice,
              price,
              GetVectorDesc(vector)));
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double GetSymbolPrice(int symbolIndex,ENUM_SYMBOL_INFO_DOUBLE priceType)
  {
   return SymbolInfoDouble(_symbolParams[symbolIndex].symbol, priceType);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double OpenMarketPosition(int symbolIndex,double volume,ENUM_VECTOR vector)
  {
   string symbol=GetSymbol(symbolIndex);
   bool result=false;
   bool errorLogged=false;
   Debug(StringFormat("Открываем позициюпо %s, объем %.2f, тип %s",symbol,volume,GetVectorDesc(vector)));

   while(!result)
     {
      if(vector==VECTOR_BUY)
        {
         result=_trade.Buy(volume,symbol);
        }
      else
        {
         result=_trade.Sell(volume,symbol);
        }
      if(!result && !errorLogged)
        {
         Error(StringFormat("Не удалось открыть позицию, символ %s, объем %.2f, тип %s, результат %d",symbol,volume,GetVectorDesc(vector),_trade.ResultRetcode()));
         errorLogged=true;
        }
     }
   return _trade.ResultPrice();
  }
 

Вы никогда не сохраняли отчёты тестера? Как же Вы их анализируете-то? Отчёт можно сохранить из контекстного меню вкладки "Бэктест" (последний пункт меню)

Вы не умеете коды оформлять на форуме и не видели, как это делают другие? Есть специальная кнопка SRC вверху формы ввода сообщения. Невозможно же читать этот текст

Что такое "Когда лог пишется, то цена текущая как раз и отличается от цены исполнения рыночного ордера на 1-4 пункта"? Где Вы логируете текущую цену перед вызовом торговой функции, цену по которой хотите исполнить ордер, цену по которой ордер исполнился и текущую цену после вызова торговой функции?

 

1) Я анализирую по своим логам. В ближайшее время выложу отчеты с визуализацией и без нее.

2)  Вызывается Comment(StringFormat("Исполнен ордер %d, инструмент %s, объем %.2f, цена ордера %.5f, цена исполнения %.5f, цена текущая %.5f, тип %s", ...)), цена текущая - price - запрашивается ДО торговой операции, цена исполнения - filledPrice - то, что мне вернулось в результате выставления рыночного ордера.

 

Что такое "цена запрашивается до операции"? Вы не с бидами и асками работаете?

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

 

Работаю с бидом и аском, дублирую код, который скидывал выше, запрашиваю цену ДО операции, переменная price, цена bid/ask в зависисмости от типа ордера-:

ENUM_VECTOR vector=GetVector(symbolIndex);
ENUM_SYMBOL_INFO_DOUBLE priceType=vector==VECTOR_BUY ? SYMBOL_ASK : SYMBOL_BID;

double price=GetSymbolPrice(symbolIndex,priceType);

....

double GetSymbolPrice(int symbolIndex,ENUM_SYMBOL_INFO_DOUBLE priceType)
{
   return SymbolInfoDouble(_symbolParams[symbolIndex].symbol, priceType);
}

 

Прикрепляю отчеты тестера. По сделкам видно, например, что была сделка 02.10 05:34 в отчете без визуализации и не было этой сделки в отчете с визуализацией.

Файлы:
 
Графические объекты используются?
 

Используются только индикатор, из темы  https://www.mql5.com/ru/articles/234, для получения новых минутных баров с трех валютных пар EURUSD, EURGBP, GBPUSD. 

Повторюсь, вот сейчас протестировал на версии 1340, там результаты с визуализацией и без нее идентичны. 

Реализация мультивалютного режима в MetaTrader 5
Реализация мультивалютного режима в MetaTrader 5
  • 2011.01.10
  • Konstantin Gruzdev
  • www.mql5.com
Интерес к мультивалютному анализу и мультивалютной торговле существует давно. Но только с выпуском в свет терминала MetaTrader 5 и языка программирования MQL5 появилась возможность реализации полноценного мультивалютного режима. В данной статье предложен способ, позволяющий проводить анализ и обработку всех поступающих тиков по множеству финансовых инструментов. В качестве иллюстрации рассмотрен мультивалютный индикатор RSI для индекса доллара USDx.
 

Мне интересно самому посмотреть, что происходит.

Не могли бы Вы дать мне ex5 Вашего эксперта? Вместе с сопутствующими настройками и файлами.

Текущая версия отличается от версии 1340 несколько другим порядком подачи тиков при мультивалютном тестировании. Это объясняет разницу результатов в текущей версии и 1340. Но не объясняет разницу между обычным тестированием и визуальным

 
Отправил в личном сообщении советника и паарметры скриншотом, на самом деле на любом интервале будут различаться результаты.
Причина обращения: