Библиотеки: OnTesterCustom

 

OnTesterCustom:

Дополнительные торговые стат. показатели.

OnTesterCustom

Автор: fxsaber

 

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

Некоторые обходят их через данные о новостях - не торгуют там в Оптимизаторе. Это неплохое решение.

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


Наконец, есть еще способ обхода уток, когда не хочется возиться ни с одним из способов: просто выбросить самые убыточные/прибыльные сделки. А для остальных посчитать прибыльность, просадку и т.д.


Добавил такой фильтр в библиотеку. Его можно применять в качестве критерия Оптимизации ТС подобным образом.

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)"); // Построили график зависимости прибыльности от фильтра.
  }
}


Однако, минус такого подхода, что не получается обойти серии мелких сделок, которые в совокупности дают лебедя. Например, случай, когда флетовая ТС попадает на новость, где цена сильно мечется в обе стороны, но при этом далеко не улетает. Так получается несистемная итоговая высокая прибыль из множества сделок. И этот результат может не дать правильно подстроить ТС под рыночные закономерности во время Оптимизации. Соответственно, оценить потенциал торговой логики.

 
fxsaber:

Добавил такой фильтр в библиотеку. Его можно применять в качестве критерия Оптимизации ТС подобным образом.

Расчеты подтвердили теорию. Хорошая штука. Кто-то специально подбирает стопы, выключает на выходные и т.д. Здесь ничего этого делать не надо. Рекомендую.

 
Если попался чужой скальпер, или не хочется возиться с исходными кодами, а нужно быстро сделать оценку одиночного прохода, то запускаю такой скрипт.
#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); // Выводит оценку для последнего одиночного прохода.
  }
}


Очень удобно.

 
В мониторингах счетов увидел часто повторяющуюся одну и ту же картину слития счетов.

Это не обвал индексов или нефти, а валютный рынок. Поэтому куда интереснее.

Вот несколько скринов с разных счетов. Многих неплохих скальперов-роботов уничтожило.



Что же случилось в обозначенное время?


Открытие после выходных


Открытие сессии с гепом на две фигуры. Огромный геп для данного символа.

Слитие или прибыль на этом гепе — авось. Кто слил — виноват. Потому что уже во всю штормило на фонде до выходных. Ну а кто заработал на гепе — тупое везение. Поэтому анализ открытия — ни о чем.


Черный лебедь.

 
Но интереснее, что произошло дальше — черный лебедь на 10 фигур за 40 минут. Кто на нем слил или заработал — абсолютно не виноваты. Это случайность. Осуждать слитых или хвалить профитных на данном движении просто некорректно.
 

Бэктест.

 
А теперь про алготрейдинг.

Очевидно, что в рассматриваемое время не работали почти все рыночные закономерности. Так стоит ли этот кусок истории теперь включать в бэктест своих ТС? В статье об этом четко написал — нет. Этот кусок должен быть выброшен из бэктеста. Не все с этим согласны по какой-то причине. Когда-то разбирался случай с лебедем по франку.

Ну была интервенция по франку. Не торговать эдж? Будет BREXIT, не торговать фунт, где аналогичный по поведению эдж? Безусловно, перед предполагаемым BREXIT в конце октября надо быть безумцем не остановить реальную торговлю по фунту. Но если во время BREXIT будет задница с фунтом, а через месяц история покажет, что все тот же эдж пашет, то по какой причине его не начинать торговать?

Один из способов выкидывания такого несистемного выброса при поиске рыночных закономерностей описал здесь.

Оффтоп. График на H1.

За три недели движение на 20 фигур. Изменение валютного курса на 13%, и это не рубль!


Но привел график по другой причине. Мне абсолютно не понятно, по какой причине черный лебедь «предсказал» дальнейший относительно плавный ход на 10 фигур?
 

 Приветствую @fxsaber !

Можно ли с помощью этой библиотеки формировать из оптимизатора при определенных проходах график баланса из вкладки тестера "График" ?

есть необходимость просмотреть много скриншотов при оптимизации портфеля ТС, просто выбраковывать ТС по просадке не получается, все равно приходится визуально оценивать

 
Igor Makanu:

Можно ли с помощью этой библиотеки формировать из оптимизатора при определенных проходах график баланса из вкладки тестера "График" ?

Это одна из возможностей Report-библиотеки.

Report
Report
  • www.mql5.com
Данная библиотека является несколько переработанной версией замечательного скрипта 2006 года с учетом современных реалий MQL. Некоторые возможности убраны, некоторые - добавлены. В обеих платформах (MetaTrader 4/5) для сохранения отчета (в виде MetaTrader 4) можно запустить такой скрипт: и увидеть в соответствующем файле сформированный...
 
fxsaber:

Это одна из возможностей Report-библиотеки.

я бегло смотрел описание Report-библиотеки.

интересует "зелененькая линия" графика эквити, Report-библиотека умеет делать такой скриншот?

ЗЫ: очень тяжело автоматически отсеивать ТС у которых просадка по эквити "мгновенная" и которая будет пересиживанием убытка

 
Igor Makanu:

интересует "зелененькая линия" графика эквити, Report-библиотека умеет делать такой скриншот?

Делал только баланс.

 
Igor Makanu:

просто выбраковывать ТС по просадке не получается, все равно приходится визуально оценивать

Можно оценивать эквити не визуально, а программно. Например, так - https://www.mql5.com/ru/articles/2358

R-квадрат как оценка качества кривой баланса стратегии
R-квадрат как оценка качества кривой баланса стратегии
  • www.mql5.com
Каждая торговая стратегия нуждается в объективной оценке ее эффективности. Для этого используется обширный ряд статистических параметров. Многие из них просты в расчете и показывают интуитивно понятные метрики. Другие сложнее в построении и в интерпретации значений. Несмотря на все это многообразие, есть очень мало качественных метрик для...
 
Andrey Khatimlianskii:

Можно оценивать эквити не визуально, а программно. Например, так - https://www.mql5.com/ru/articles/2358

не то, у меня ТС уже с неплохими показателями, теперь нужно выбраковать портфели ТС, которые длительную просадку по эквити имеют - пересиживают, и оставить те где шпильки эквити бывают по просадке, эти ТС я подтюнингую

но все равно спасибо!

ЗЫ: сделать запись эквити и баланса в массив в тестере не проблема, проблема в визуализации, ,.... оказалось, что я совсем не умею пользоваться CGraphic - сижу изучаю возможности, хотя скорее всего опять в .dll на C# все сделаю,  быстрее все делается

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