Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Заведи торговый сигнал. Зарабатывай на платной подписке!
ooparadise
61
ooparadise 2016.07.20 23:38 

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

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

Slawa
Модератор
6841
Slawa 2016.07.21 11:54  

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

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

ooparadise
61
ooparadise 2016.07.21 13:25  

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();
  }
Slawa
Модератор
6841
Slawa 2016.07.21 13:57  

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

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

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

ooparadise
61
ooparadise 2016.07.21 14:07  

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

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

Slawa
Модератор
6841
Slawa 2016.07.21 14:19  

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

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

ooparadise
61
ooparadise 2016.07.21 14:33  

Работаю с бидом и аском, дублирую код, который скидывал выше, запрашиваю цену ДО операции, переменная 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 в отчете без визуализации и не было этой сделки в отчете с визуализацией.

Файлы:
Slawa
Модератор
6841
Slawa 2016.07.21 14:44  
Графические объекты используются?
ooparadise
61
ooparadise 2016.07.21 14:46  

Используются только индикатор, из темы  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.
Slawa
Модератор
6841
Slawa 2016.07.21 15:03  

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

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

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

ooparadise
61
ooparadise 2016.07.21 17:31  
Отправил в личном сообщении советника и паарметры скриншотом, на самом деле на любом интервале будут различаться результаты.
1234
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий