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

 

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

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

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

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

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

Автор: Francis Dube

 
Привет! Эта статья содержит ценные сведения, и я искал ее уже довольно долго. Однако я столкнулся с проблемой при использовании примера, которым вы поделились. Спред кажется довольно большим из-за цены спроса. Не могли бы вы сообщить мне, есть ли что-то, что я упускаю, или это ошибка?
 
Le Huu Hai #:
Привет! Эта статья содержит ценные сведения, и я искал ее уже довольно долго. Однако я столкнулся с проблемой при использовании примера, которым вы поделились. Спред кажется довольно большим из-за цены спроса. Не могли бы вы сообщить мне, есть ли что-то, что я упускаю, или это ошибка?

Насколько я могу судить, я не могу найти ошибку. При собственном тестировании я также столкнулся с вариациями ценового ряда с большими спредами. Такое может случиться. Если это неприемлемо, вы можете просто сделать больше перестановок и протестировать на сериях с более реалистичными спредами.

 
Пробовал скрипт пару раз на фьючерсных контрактах, как последних, так и непрерывных, безрезультатно. Мало того, что сгенерированные символы визуально идентичны на графике, их значения тикового объема/реального объема сосредоточены всего на нескольких свечах в течение дня, и тестер захлебывается и замирает на этих символах, не давая никаких результатов.
 
Firstly, time and tick flag information will be left untouched so our permutation routine should not alter this information. We are interested in only the bid, ask and volume.
Совершенно непонятно, почему вы решили взять логарифм объемов. Особенно тикового объема.
 
Автор, вы не используете очень много возможностей языка, поэтому ваш код в разы больше и сложнее для чтения.

Например, эти строки можно заменить одной строкой.
 //--- случайная замена тиковых данных
      tempvalue.bid_d=m_differenced[i].bid_d;
      tempvalue.ask_d=m_differenced[i].ask_d;
      tempvalue.vol_d=m_differenced[i].vol_d;
      tempvalue.volreal_d=m_differenced[i].volreal_d;

      m_differenced[i].bid_d=m_differenced[j].bid_d;
      m_differenced[i].ask_d=m_differenced[j].ask_d;
      m_differenced[i].vol_d=m_differenced[j].vol_d;
      m_differenced[i].volreal_d=m_differenced[j].volreal_d;

      m_differenced[j].bid_d=tempvalue.bid_d;
      m_differenced[j].ask_d=tempvalue.ask_d;
      m_differenced[j].vol_d=tempvalue.vol_d;
      m_differenced[j].volreal_d=tempvalue.volreal_d;
Swap(m_differenced[i], m_differenced[j]);


template < typename T>
void Swap( T &Value1, T &Value2 )
{
  const T Value = Value1;
  
  Value1 = Value2;
  Value2 = Value;
}


Это же замечание относится к методам логарифмического и обратного преобразования структурных данных. И т. д.

 

Конвертация тиков - редкая тема. Обычно это делается только с одной ценой (бид, например) и на барах.

Я благодарен автору за то, что он поднял эту тему.


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

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


Только здесь произошло нечто успешное.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Машинное обучение в трейдинге: теория, модели, практика и алготорговля

fxsaber, 2023.09.07 07:33

Я пробовал несколько алгоритмов. Для наглядности вот несколько из них.

ДО строится по цене Avg с условием фиксации. мин. колено

  • Зеленые точки - индексы3Z вершин в массиве тика.
  • Фиолетовые - средний индекс между вершинами.

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

Получается, что временные метки, абсолютные значения приращений (Avg-price) и спреды полностью сохраняются.


По результатам.

  1. Я запускаю только на зеленых индексах - слив. Очевидно, что такая рандомизация выпрямляет (уменьшает количество ZZ) итоговый график.
  2. Бегаю только по фиолетовым -грааль тем сильнее, чем выше мин. состояние колена ZZ.
  3. Я бегаю по обоим цветам - сливовым.
Я предполагаю, что если вы построите 3Z на основе Bid/Ask в одно и то же время, то точка 2 будет более сильным граалем.

Обратное время очень хорошо сохраняет рыночные паттерны.
Проверка обратного времени.
Проверка обратного времени.
  • 2023.09.03
  • www.mql5.com
Мною была поставлена задача разобраться в причинах получения прибыли определенной ТС (торговая система). Для этого требовалось изучить историю котировок, подтвердив или опровергнув возникающие
 
//+------------------------------------------------------------------+
//|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.

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


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

 
Есть ли способ провести анализ Монте-Карло, но с использованием многовалютной ea?