Обсуждение статьи "Тесты на перестановку Монте-Карло в MetaTrader 5"

 

Опубликована статья Тесты на перестановку Монте-Карло в MetaTrader 5:

В статье рассматриваются тесты на перестановку на основе перетасованных тиковых данных на любом советнике исключительно силами MetaTrader 5.

Очевидно, что после экспорта файла необходимо записать, где он сохранен. Откройте его с помощью любого приложения для работы с электронными таблицами. На рисунке ниже показано использование бесплатного OpenOffice Calc, в котором была добавлена новая строка внизу таблицы. Прежде чем идти дальше, было бы разумно удалить строки для символов, которые не должны участвовать в вычислениях. Под каждым соответствующим столбцом p-значение рассчитывается с использованием пользовательского макроса. Формула макроса использует показатели производительности переставленного символа (расположенные в строке 18 показанного документа), а также показатели производительности переставленных символов для каждого столбца. Полная формула макроса представлена на рисунке.

Расчет P-значений в OpenOffice Calc

Помимо использования приложения для работы с электронными таблицами, мы могли бы использовать Python, который имеет множество модулей для анализа XML-файлов. Если пользователь владеет MQL5, парсить файлы можно и простым скриптом. Просто не забудьте выбрать доступный каталог при экспорте результатов оптимизации из тестера.

Автор: Francis Dube

 
//+------------------------------------------------------------------+
//|Helper method applying log transformation                         |
//+------------------------------------------------------------------+
bool CPermuteTicks::LogTransformTicks(void)
  {
//---resize m_logticks if necessary  
   if(m_logticks.Size()!=m_ticks.Size())
      ArrayResize(m_logticks,m_ticks.Size());
//---log transform only relevant data members, avoid negative and zero values
   for(uint i=0; i<m_ticks.Size(); i++)
     {
      m_logticks[i].bid_d=(m_ticks[i].bid>0)?MathLog(m_ticks[i].bid):MathLog(1e0);
      m_logticks[i].ask_d=(m_ticks[i].ask>0)?MathLog(m_ticks[i].ask):MathLog(1e0);
      m_logticks[i].vol_d=(m_ticks[i].volume>0)?MathLog(m_ticks[i].volume):MathLog(1e0);
      m_logticks[i].volreal_d=(m_ticks[i].volume_real>0)?MathLog(m_ticks[i].volume_real):MathLog(1e0);
     }
//---
   return true;
  }
Зачем логарифмировать объемы?!
 

мы хотим, чтобы p-значения были как можно ближе к нулю, в диапазоне 0,05 и ниже.

Полная формула приведена ниже:

z+1/r+1

где r — количество выполненных перестановок, а z — общее количество тестов с лучшей производительностью.

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

 
Процедура перестановки важна для правильного проведения теста.

Используемый алгоритм перестановки.

  1. Создается массив логарифмированных приращений (между соседними тиками) bid/ask.
  2. Этот массив перемешивается. Причем сильно.
  3. Создается новый массив тиков через приращения из п.2.

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


Нельзя так делать.

Причина обращения: