
Привет! Эта статья содержит ценные сведения, и я искал ее уже довольно долго. Однако я столкнулся с проблемой при использовании примера, которым вы поделились. Спред кажется довольно большим из-за цены спроса. Не могли бы вы сообщить мне, есть ли что-то, что я упускаю, или это ошибка?
Насколько я могу судить, я не могу найти ошибку. При собственном тестировании я также столкнулся с вариациями ценового ряда с большими спредами. Такое может случиться. Если это неприемлемо, вы можете просто сделать больше перестановок и протестировать на сериях с более реалистичными спредами.
//--- случайная замена тиковых данных
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) и спреды полностью сохраняются.
По результатам.
- Я запускаю только на зеленых индексах - слив. Очевидно, что такая рандомизация выпрямляет (уменьшает количество ZZ) итоговый график.
- Бегаю только по фиолетовым -грааль тем сильнее, чем выше мин. состояние колена ZZ.
- Я бегаю по обоим цветам - сливовым.

- 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 — общее количество тестов с лучшей производительностью.
Этот критерий не будет работать в таком случае - оптимизировали на исходном символе, а затем прогнали на перестановках.
Используемый алгоритм перестановки.
- Создается массив логарифмированных приращений (между соседними тиками) bid/ask.
- Этот массив перемешивается. Причем сильно.
- Создается новый массив тиков через приращения из п.2.
Такой подход убивает напрочь все закономерности (если они были), что были в исходном ряде. Т.к. на выходе получаем случайное блуждание.
Нельзя так делать.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Опубликована статья Тесты на перестановку Монте-Карло в MetaTrader 5:
В статье рассматриваются тесты на перестановку на основе перетасованных тиковых данных на любом советнике исключительно силами MetaTrader 5.
Очевидно, что после экспорта файла необходимо записать, где он сохранен. Откройте его с помощью любого приложения для работы с электронными таблицами. На рисунке ниже показано использование бесплатного OpenOffice Calc, в котором была добавлена новая строка внизу таблицы. Прежде чем идти дальше, было бы разумно удалить строки для символов, которые не должны участвовать в вычислениях. Под каждым соответствующим столбцом p-значение рассчитывается с использованием пользовательского макроса. Формула макроса использует показатели производительности переставленного символа (расположенные в строке 18 показанного документа), а также показатели производительности переставленных символов для каждого столбца. Полная формула макроса представлена на рисунке.
Помимо использования приложения для работы с электронными таблицами, мы могли бы использовать Python, который имеет множество модулей для анализа XML-файлов. Если пользователь владеет MQL5, парсить файлы можно и простым скриптом. Просто не забудьте выбрать доступный каталог при экспорте результатов оптимизации из тестера.
Автор: Francis Dube