Во время Оптимизации с целью лучшего подхватывания самой ТС имеющихся рыночных закономерностей желательно наличие механизма обхода черных/белых лебедей (случайные сильные убытки/прибыли на одну сделку).
Некоторые обходят их через данные о новостях - не торгуют там в Оптимизаторе. Это неплохое решение.
Когда же нет календаря новостей, то пробуют вычислить лебедей через анализ истории котировок. Тут уже нет универсального решения, т.к. нужно подстраиваться под особенности своей ТС.
Наконец, есть еще способ обхода уток, когда не хочется возиться ни с одним из способов: просто выбросить самые убыточные/прибыльные сделки. А для остальных посчитать прибыльность, просадку и т.д.
Добавил такой фильтр в библиотеку. Его можно применять в качестве критерия Оптимизации ТС подобным образом.
sinput int inMinTrades = 500; // Минимальное количество трейдов (позиций) sinput int inMaxTrades = 2000; // Максимальное количество трейдов (позиций) #include <fxsaber\OnTesterCustom\OnTesterCustom.mqh> // https://www.mql5.com/ru/code/27714 sinput double inMarkup = 20; // Комиссия на миллион (одна сторона) sinput double inRisk = 0.5; // Фиксированный риск sinput double inFilter = 1; // Сколько процентов фильтруем double OnTester() { double Res = 0; if ((TesterStatistics(STAT_TRADES) >= inMinTrades) && (TesterStatistics(STAT_TRADES) <= inMaxTrades)) { ONTESTERCUSTOM OnTesterCustom(_Symbol); OnTesterCustom.Filter(inFilter / 100); // Применили фильтр сделок. Res = NormalizeDouble(OnTesterCustom.TesterStatistics(ONTESTERCUSTOM_GAIN, inRisk, inMarkup), 2); } return(Res); }
Следующим образом можно посмотреть, как меняется прибыльность ТС от размера фильтра.
#include <fxsaber\SingleTesterCache\SingleTesterCache.mqh> // https://www.mql5.com/ru/code/27611 #include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/ru/code/26132 #include <fxsaber\OnTesterCustom\OnTesterCustom.mqh> // https://www.mql5.com/ru/code/27714 #include <Graphics\Graphic.mqh> #define MIN_WIDTH 10 string GraphPlot( const double &Y[], int Width = 0, int Height = 0, const ENUM_CURVE_TYPE Type = CURVE_NONE, const string CurveName = NULL, string ObjName = NULL ) { Width = Width ? Width : (int)::ChartGetInteger(0, CHART_WIDTH_IN_PIXELS); Height = Height ? Height : (int)::ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS); ObjName = (ObjName == NULL) ? __FUNCTION__ : ObjName; CGraphic Graphic; const bool Res = (::ObjectFind(0, ObjName) >= 0) ? Graphic.Attach(0, ObjName) : Graphic.Create(0, ObjName, 0, 0, 0, Width, Height); if (Res) { const int Size = ::ArraySize(Y); Graphic.CurveAdd(Y, ((Type == CURVE_NONE) && Size) ? ((Width / Size < MIN_WIDTH) ? CURVE_LINES : CURVE_POINTS_AND_LINES) : Type, CurveName); Graphic.CurvePlotAll(); Graphic.Update(); } return (Res ? Graphic.ChartObjectName() : NULL); } void OnStart() { uchar Bytes[]; if (MTTESTER::GetLastTstCache(Bytes) != -1) // Если получилось прочитать последнюю кеш-запись одиночного прогона { const SINGLETESTERCACHE SingleTesterCache(Bytes); // Загоняем ее в соответствующий объект. const ONTESTERCUSTOM OnTesterCustom(SingleTesterCache); const double Risk = 0.1; // Фиксированный риск. const double Commission = 20; // Комиссия в у.е. на миллион. double Gains[]; const int Size = ArrayResize(Gains, 5); // Вычисляем прибыльность ТС для разных значений комиссии for (int i = 0; i < Size; i++) { ONTESTERCUSTOM TmpCustom = OnTesterCustom; TmpCustom.Filter(i / 100.0); // Делаем фильтр на i процентов. Gains[i] = TmpCustom.TesterStatistics(ONTESTERCUSTOM_GAIN, Risk, Commission); // Gains[i] = TmpCustom.TesterStatistics(ONTESTERCUSTOM_GAIN_FIXDD, Risk, Commission); } GraphPlot(Gains, 1200, 500, CURVE_NONE, "Gains(Filter)"); // Построили график зависимости прибыльности от фильтра. } }
Однако, минус такого подхода, что не получается обойти серии мелких сделок, которые в совокупности дают лебедя. Например, случай, когда флетовая ТС попадает на новость, где цена сильно мечется в обе стороны, но при этом далеко не улетает. Так получается несистемная итоговая высокая прибыль из множества сделок. И этот результат может не дать правильно подстроить ТС под рыночные закономерности во время Оптимизации. Соответственно, оценить потенциал торговой логики.
Добавил такой фильтр в библиотеку. Его можно применять в качестве критерия Оптимизации ТС подобным образом.
Расчеты подтвердили теорию. Хорошая штука. Кто-то специально подбирает стопы, выключает на выходные и т.д. Здесь ничего этого делать не надо. Рекомендую.
#include <fxsaber\SingleTesterCache\SingleTesterCache.mqh> // https://www.mql5.com/ru/code/27611 #include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/ru/code/26132 #include <fxsaber\OnTesterCustom\OnTesterCustom.mqh> // Дополнительные торговые стат. показатели. input double inMarkup2 = 20; // Комиссия на миллион (одна сторона) input double inRisk = 0.5; // Фиксированный риск input double inFilter = 2; // Сколько процентов фильтруем void OnStart() { uchar Bytes[]; if (MTTESTER::GetLastTstCache(Bytes) != -1) // Если получилось прочитать последнюю кеш-запись одиночного прогона { const SINGLETESTERCACHE SingleTesterCache(Bytes); // Загоняем ее в соответствующий объект. ONTESTERCUSTOM OnTesterCustom(SingleTesterCache); OnTesterCustom.Filter(inFilter / 100); // Применили фильтр сделок. const double Res = NormalizeDouble(OnTesterCustom.TesterStatistics(ONTESTERCUSTOM_GAIN, inRisk, inMarkup2), 2); MessageBox("OnTesterCustom = " + (string)Res); // Выводит оценку для последнего одиночного прохода. } }
Очень удобно.
Это не обвал индексов или нефти, а валютный рынок. Поэтому куда интереснее.
Вот несколько скринов с разных счетов. Многих неплохих скальперов-роботов уничтожило.
Что же случилось в обозначенное время?
Открытие после выходных
Черный лебедь.
Бэктест.
Оффтоп. График на H1.

Приветствую @fxsaber !
Можно ли с помощью этой библиотеки формировать из оптимизатора при определенных проходах график баланса из вкладки тестера "График" ?
есть необходимость просмотреть много скриншотов при оптимизации портфеля ТС, просто выбраковывать ТС по просадке не получается, все равно приходится визуально оценивать
Можно ли с помощью этой библиотеки формировать из оптимизатора при определенных проходах график баланса из вкладки тестера "График" ?
Это одна из возможностей Report-библиотеки.

- www.mql5.com
я бегло смотрел описание Report-библиотеки.
интересует "зелененькая линия" графика эквити, Report-библиотека умеет делать такой скриншот?
ЗЫ: очень тяжело автоматически отсеивать ТС у которых просадка по эквити "мгновенная" и которая будет пересиживанием убытка
интересует "зелененькая линия" графика эквити, Report-библиотека умеет делать такой скриншот?
Делал только баланс.
просто выбраковывать ТС по просадке не получается, все равно приходится визуально оценивать
Можно оценивать эквити не визуально, а программно. Например, так - https://www.mql5.com/ru/articles/2358

- www.mql5.com
Можно оценивать эквити не визуально, а программно. Например, так - https://www.mql5.com/ru/articles/2358
не то, у меня ТС уже с неплохими показателями, теперь нужно выбраковать портфели ТС, которые длительную просадку по эквити имеют - пересиживают, и оставить те где шпильки эквити бывают по просадке, эти ТС я подтюнингую
но все равно спасибо!
ЗЫ: сделать запись эквити и баланса в массив в тестере не проблема, проблема в визуализации, ,.... оказалось, что я совсем не умею пользоваться CGraphic - сижу изучаю возможности, хотя скорее всего опять в .dll на C# все сделаю, быстрее все делается

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
OnTesterCustom:
Дополнительные торговые стат. показатели.
Автор: fxsaber