Тестер неправильно расчитывает максимальную просадку

 

Здравствуйте господа программисты и разработчики. Помогите разобраться почему максимальная просадка в отчете не совпадает с действительностью.

Может тестер использует другую формулу расчета максимальной просадки отличную от той к которой я привык ? Я использую такую формулу расчета просадки:

Sum+=OrderProfit()+OrderCommission()+OrderSwap(); 

    if(Max<Sum)
          Max=Sum;


            Drawdown=Max-Sum;
            if(MaximalDrawdown<Drawdown)
               MaximalDrawdown=Drawdown;

Отчет теста по фунту стерлингов в прикрепленных файлах. Несоответствие даже в результатах теста. На графике баланса максимальная просадка меньше чем в отчете. Такое расхождение наблюдается на всех тестах и по всем парам и не соответствуют результатам расчета по моей формуле. В среднем разница составляет 20-30%.

Другой вопрос к разработчикам программистам. Как происходит вычисление стоимости тика при тестировании синхронно по времени или используется последняя цена Bid та что маячит в терминале во время тестирования?

не удалость прикрепить htm файл. отправил отчет в текстовом формате

Файлы:
20161124.log  50 kb
tect2.txt  28 kb
test.txt  25 kb
 
Если код вычисляете в каждом OnTick, то должно быть совпадение.
 

В коде использована функция OnTick() .  Если расчитать максимальную просадку, используя данные журнала, то получим максимальную просадку 29.93,  такую же, если вычислить просадку по графику баланса. А тестер в отчете,  выплевывает значение максимальной просадки равной 38.79. Поэтому, у меня возник вопрос к разработчикам. У меня подозрение, что они используют неверную формулу расчета максимальной просадки, или же что более вероятно, в коде тестера закралась алгоритмическая ошибка по невнимательности. Я знаю, такое бывает в программировании. Хочешь одно, а пишешь не совсем то, что хочешь и это тоже работает. Так что, у меня большая просьба к разработчика программистам. Исправьте ошибкии и, как можно скорей..  Максимальная просадка, это  наиважнейший показатель, сильно влияющий на решение, возиться ли с системой и дальше, или же выбросить ее на помойку. Если бы я не написал скрипт, имитирующие сделки торговой системы, для увеличения скорости тестирования, то не обнаружил бы ошибку тестера. Просто мне искренне жаль новичков. Иначе бы я не пришел сюда. Справился бы со своими проблемами, как нибудь сам.


 Только что, произвел тот же тест, но методом Every tick(см. прикрепленный логфайл)  и обнаружил еще оду неприятность. Дело в том, что в коде советника придусмотренно ограничение на модификацию стоплоса отложенного ордера, не позволяющее модифицировать отложенный ордер слишком часто, для того, чтобы не нагружать сервер частыми приказами. Например, стоплос отложенного ордера устанавливается на минимуме дня или недели.  Если минимум обновиться, то по условию этого ограничения, команда на модификацию ордера пойдет только в том случае, если цена Bid пиднимется выше минимума на 200 пипсов. Однако, судя по записям в журнале тестера, это условие грубо игнорируется, или же после каждого обновления минимума, цена Bid совершает бешенные скачки выше, чем на 200 пипсов. Такое никогда не наблюдаешь в реальных котировках. Происходит огромное количество модификаций, которое  резко замедляет тестирование. Последний тест,  длился почти час. Из за этого, пропадает всякое желание тестировать методом Every tick.

Здесь, для примера, показан участок, где модифицируется sellstop. Вы можете видеть ограничение ss-Bid>dif, о котором писал.

y - цена отложенного ордера sellstop
ss -  максимум дня.
stoploss=OrderStopLoss();
price=OrderOpenPrice();
pit = Point;

dif=200*pit;

                     RefreshRates();
                     if(Bid>y+pit)
                       {
                        if((stoploss+pit<=ss && ss-Bid>dif) || stoploss-pit>=ss)
                           result=OrderModify(OrderTicket(),y,ss,ts,ex,CLR_NONE);
                        else
                          {
                           if(price+pit<=y && Preload==true)
                              result=OrderModify(OrderTicket(),y,ss,ts,ex,CLR_NONE);
                          }
                       }

 


Файлы:
20161124.log  1955 kb
 
  1. Просадка в тестере по эквити.
  2. Тестер не ограничивает количество модификаций.
 

1. Я так и думал, что просадка в тестере возможна по Эквити но я боялся, что это на самом деле так. Знаете почему? Потому, что боялся допустить, что серьезные люди будут доверять данным Эквити который выдает тестер и, у которого  качество моделирования часто n/a. Зачем отслеживать флуктуации Эквити от  смоделированных тиков с качеством моделирования желающего оставлять лучше? Это же глупо. Яркой иллюстрацией  каково качество моделирования  может быть примером работы условия  ss-Bid>dif,  которое работает так как надо когда дело доходит до реальных котировок.   Уж лучше тогда рассчитывать максимальную просадку по балансу. Так вернее будет. Но это между прочим. У каждого свои вкусы.

2. В справке, там где написано что такое максимальное проседание, невозможно понять какой убыток имеется в виду, нереализованный или же зафиксированный. Подправьте.  

 
Закачайте в тестер свои тики, тогда моделирования не будет.
 

1 22:40:12 2015.02.23 00:00  test EURJPY.ecn,Daily: #2 2015.02.11 02:00:00 buy 0.01 EURJPY.ecn 135.262 133.677 145.414 2015.02.20 14:40:00 133.677 -0.05 -0.34 -14.02  [sl] 2
2 22:40:12 2015.02.23 00:00  test EURJPY.ecn,Daily: #3 2015.02.16 20:20:00 sell 0.01 EURJPY.ecn 134.113 135.552 125.546 2015.02.17 14:00:00 135.552 -0.05 0.00 -12.73  [sl] 2
3 22:40:12 2015.03.02 00:20  test EURJPY.ecn,Daily: #4 2015.02.26 14:40:00 sell 0.01 EURJPY.ecn 134.330 135.664 127.790 2015.03.02 00:00:00 133.775 -0.05 0.01 4.91   2
4 22:40:13 2015.04.13 00:20  test EURJPY.ecn,Daily: #7 2015.04.07 10:40:00 sell 0.01 EURJPY.ecn 130.073 131.292 122.734 2015.04.13 00:00:00 127.360 -0.05 0.02 24.00   2
5 22:40:13 2015.05.04 00:20  test EURJPY.ecn,Daily: #10 2015.04.28 14:40:00 buy 0.01 EURJPY.ecn 130.213 129.009 136.194 2015.05.04 00:00:00 134.552 -0.05 -0.18 38.39   2
6 22:40:13 2015.05.25 00:20  test EURJPY.ecn,Daily: #11 2015.05.18 22:40:00 sell 0.01 EURJPY.ecn 135.663 136.957 128.094 2015.05.25 00:00:00 133.669 -0.05 0.03 17.64   2

---------------------------------------- ЭТИ СДЕЛКИ ЗАБЫЛИ ВЫСВЕТИТЬСЯ В ЖУРНАЛЕ. НО  БЛАГОПОЛУЧНО ОТЫСКАЛИСЬ В ЛОГФАЙЛЕ ТЕСТЕРА --------------------------------

 22:40:13 2015.06.01 00:20  test EURJPY.ecn,Daily: #12 2015.05.26 14:00:00 buy 0.01 EURJPY.ecn 134.162 133.096 142.017 2015.06.01 00:00:00 136.259 -0.05 -0.18 18.55   2
 22:40:13 2015.06.08 00:00  test EURJPY.ecn,Daily: #13 2015.06.01 10:40:00 sell 0.01 EURJPY.ecn 135.162 136.361 128.754 2015.06.01 18:40:00 136.361 -0.05 0.00 -10.61  [sl] 2
 22:40:13 2015.06.29 00:20  test EURJPY.ecn,Daily: #14 2015.06.23 06:40:00 sell 0.01 EURJPY.ecn 139.348 140.630 131.895 2015.06.29 00:00:00 134.985 -0.05 0.02 38.59   2
 22:40:13 2015.07.27 00:20  test EURJPY.ecn,Daily: #15 2015.07.21 14:40:00 buy 0.01 EURJPY.ecn 135.262 134.297 142.652 2015.07.27 00:00:00 135.877 -0.05 -0.18 5.44   2
 22:40:13 2015.08.24 00:00  test EURJPY.ecn,Daily: #18 2015.08.18 08:20:00 sell 0.01 EURJPY.ecn 137.556 138.393 133.343 2015.08.20 14:00:00 138.393 -0.05 0.02 -7.41  [sl] 2
 22:40:13 2015.08.31 00:20  test EURJPY.ecn,Daily: #19 2015.08.24 14:00:00 sell 0.01 EURJPY.ecn 138.068 138.958 133.945 2015.08.31 00:00:00 135.871 -0.05 0.03 19.44   2
 22:40:14 2015.10.12 00:20  test EURJPY.ecn,Daily: #21 2015.10.05 10:40:00 buy 0.01 EURJPY.ecn 135.356 134.366 141.106 2015.10.12 00:00:00 136.518 -0.05 -0.21 10.28   2
 22:40:14 2015.10.12 00:20  test EURJPY.ecn,Daily: #20 2015.09.30 18:00:00 sell 0.01 EURJPY.ecn 134.135 135.112 127.159 2015.10.05 10:00:00 135.112 -0.05 0.02 -8.65  [sl] 2
 22:40:14 2015.10.19 00:20  test EURJPY.ecn,Daily: #22 2015.10.15 10:00:00 sell 0.01 EURJPY.ecn 136.017 136.932 131.173 2015.10.19 00:00:00 135.591 -0.05 0.01 3.77   2

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

7 22:40:14 2015.11.16 00:00  test EURJPY.ecn,Daily: #24 2015.11.09 10:40:00 buy 0.01 EURJPY.ecn 133.102 132.173 137.694 2015.11.10 10:40:00 132.173 -0.05 -0.03 -8.22  [sl] 2
8 22:40:14 2015.12.07 00:00  test EURJPY.ecn,Daily: #27 2015.12.01 10:00:00 buy 0.01 EURJPY.ecn 130.392 129.753 133.601 2015.12.03 14:40:00 133.601 -0.05 -0.12 28.39  [tp] 2
9 22:40:14 2016.01.04 00:00  test EURJPY.ecn,Daily: #29 2015.12.28 02:40:00 buy 0.01 EURJPY.ecn 132.247 131.469 137.494 2015.12.29 14:40:00 131.469 -0.05 -0.03 -6.88  [sl] 2
10 22:40:14 2016.02.01 00:20  test EURJPY.ecn,Daily: #31 2016.01.27 14:00:00 buy 0.01 EURJPY.ecn 128.975 127.817 133.805 2016.02.01 00:00:00 131.401 -0.05 -0.15 21.46   2
11 22:40:15 2016.03.28 00:00  test EURJPY.ecn,Daily: #33 2016.03.22 10:00:00 sell 0.01 EURJPY.ecn 125.252 126.266 118.793 2016.03.25 02:00:00 126.266 -0.05 0.02 -8.97  [sl] 2
12 22:40:15 2016.04.11 00:20  test EURJPY.ecn,Daily: #35 2016.04.05 06:00:00 sell 0.01 EURJPY.ecn 126.342 127.350 121.311 2016.04.11 00:00:00 123.271 -0.05 0.02 27.17   2
13 22:40:15 2016.05.30 00:00  test EURJPY.ecn,Daily: #37 2016.05.17 09:20:00 buy 0.01 EURJPY.ecn 123.617 122.610 130.247 2016.05.23 14:40:00 122.610 -0.05 -0.18 -8.91  [sl] 2
14 22:40:15 2016.05.30 10:00  test EURJPY.ecn,Daily: #38 2016.05.23 14:00:00 sell 0.01 EURJPY.ecn 122.709 123.640 117.191 2016.05.30 10:00:00 123.640 -0.05 0.03 -8.23  [sl] 2
15 22:40:15 2016.06.13 00:00  test EURJPY.ecn,Daily: #39 2016.06.06 18:40:00 buy 0.01 EURJPY.ecn 122.079 120.823 126.580 2016.06.09 10:40:00 120.823 -0.05 -0.15 -11.11  [sl] 2
16 22:40:15 2016.07.18 00:20  test EURJPY.ecn,Daily: #40 2016.07.11 10:40:00 buy 0.01 EURJPY.ecn 112.606 111.076 124.826 2016.07.18 00:00:00 116.399 -0.05 -0.21 33.55   2
17 22:40:15 2016.08.01 00:00  test EURJPY.ecn,Daily: #41 2016.07.26 02:40:00 sell 0.01 EURJPY.ecn 115.584 116.957 106.978 2016.07.27 06:40:00 116.957 -0.05 0.00 -12.14  [sl] 2
18 22:40:15 2016.08.08 00:20  test EURJPY.ecn,Daily: #42 2016.08.02 18:40:00 sell 0.01 EURJPY.ecn 113.039 114.811 104.510 2016.08.08 00:00:00 112.962 -0.05 0.02 0.68   2
19 22:40:15 2016.08.16 00:00  test EURJPY.ecn,Daily: #43 2016.08.11 18:40:00 buy 0.01 EURJPY.ecn 113.411 112.704 121.346 2016.08.15 13:01:00 112.704 -0.05 -0.06 -6.25  [sl] 2
20 22:40:15 2016.09.12 00:20  test EURJPY.ecn,Daily: #46 2016.09.05 14:00:00 sell 0.01 EURJPY.ecn 115.269 116.149 111.897 2016.09.12 00:00:00 115.264 -0.05 0.03 0.04   2
21 22:40:16 2016.10.31 00:00  test EURJPY.ecn,Daily: #47 2016.10.25 16:20:00 buy 0.01 EURJPY.ecn 113.861 112.834 118.144 2016.10.30 23:00:00 114.823 -0.05 -0.15 8.51   2


По данным тестера прибыль, без учета комиссионных и свопов составила: 176.68

Если расчитывать стоимость тика в момент закрытия  сделки по формуле  TickValue = 100 / USDJPY, где USDJPY это цена открытия дневного бара, то получим более реалистичный
результат. Прибыль, без учета комиссионных и свопов в этом случае составит: 166.37.

Прибыли различаются на  100*(176.68-166.37)/176.68=5.8%.
Кому то эти 5.8% могут показаться чушью. Но если быть точными и не пудрить людям мозги то господа разработчики программисты  будет лучше если начнете использовать динамичный TickValue в тестере.
Если не можете это сделать то скинтесь и наймите первоклассного программиста. Он вам быстро накатает хороший код и кстати сделает автоматическую подгрузку тиков в тестер с громким названием "Тестер стратегий" чтобы не было моделирования. Черт возьми живем же в век информационных технологий и это можно было бы сделать давным давно.. Раз уж тестер вызывается делать тесты на каждом тике когда включен тумблер "Every tick" то пусть он это делает без всякой предварительной канители с моей стороны.


А новичкам я дам код который по данным тестера поможет им скорpектировать результат прибыли. В коде предусмотрен  динамичный TickValue. Его нет в тестере.
В массиве df[] собранны результаты сделок в виде разностей цен открытия и закрытия ордеров . А в массиве tm[] округленное время закрытия сделок как раз для цены открытия дня.
Кто то может и лучше сделать приставку. Развивайтесь. Что до меня то я устал думать более про этот тестер.

   double df[]=
     {
      0.962,  //21
      0.003,  //20
      -0.707, //19
      0.075,  //18
      -1.373, //17
      3.793,  //16
      -1.256, //15
      -0.931, //14
      -1.007, //13
      3.069,  //12
      -1.014, //11
      2.426,  //10
      -0.778, //9
      3.209,  //8
      -0.929, //7
      0.426,  //------------------------------
      -0.977, // Эти сделки не высветились в журнале.
      1.162,  // То есть не попали в принтер.
      2.197,  //
      -0.837, //
      0.615,  //
      4.363,  //
      -1.199, //
      2.097,  //-------------------------------
      1.992,  //6
      4.339,  //5
      2.711,  //4
      0.553,  //3
      -1.439, //2
      -1.585  //1
     };
//---  
   string tm[]=
     {
      "2016.10.30", //21
      "2016.09.12", //20
      "2016.08.15", //19
      "2016.08.08", //18
      "2016.07.27", //17
      "2016.07.18", //16
      "2016.06.09", //15
      "2016.05.30", //14
      "2016.05.23", //13
      "2016.04.11", //12
      "2016.03.25", //11
      "2016.02.01", //10
      "2015.12.29", //9
      "2015.12.03", //8
      "2015.11.10", //7
      "2015.10.19", //-----------------------------
      "2015.10.05", //
      "2015.10.12", //
      "2015.08.31", //
      "2015.08.20", //
      "2015.07.27", //
      "2015.06.29", //
      "2015.06.01", //
      "2015.06.01", //------------------------------
      "2015.05.25", //6
      "2015.05.04", //5
      "2015.04.13", //4
      "2015.03.02", //3
      "2015.02.17", //2
      "2015.02.20"  //1
     };

   int i,shift;
   double sum=0;
   double TickValue;

   for(i=ArraySize(tm)-1; i>=0; i--)
     {
      shift=iBarShift("USDJPY.ecn",PERIOD_CURRENT,StrToTime(tm[i]),false);
      TickValue=100.0/iOpen("USDJPY.ecn",PERIOD_CURRENT,shift);
      sum=sum+0.01*TickValue*df[i]/Point;
     }
   Alert("Скорректированная прибыль= ",sum);
 

какой то временной провал.. не видно некоторых сделок в журнале



Файлы:
20161125.log  49 kb
 

как раз столкнулся с тем, что тестер реально не умеет считать. Причем не только просадку. У меня советник показывает при тесте просадку 7600, за год - тоесть если депозит будет 7000 - советник сольет. А я запускаю на 2000 депозит - и советник не сливает, причем просадка уже стала 6300... ) 

по мимо этого если сложить много сделок вручную , и по графику доходности - будет 3-5% разницы ( своп, комиссия и тд- все считается и там и там)

 
Roman Yablonskiy #:

как раз столкнулся с тем, что тестер реально не умеет считать. Причем не только просадку. У меня советник показывает при тесте просадку 7600, за год - тоесть если депозит будет 7000 - советник сольет. А я запускаю на 2000 депозит - и советник не сливает, причем просадка уже стала 6300... ) 

по мимо этого если сложить много сделок вручную , и по графику доходности - будет 3-5% разницы ( своп, комиссия и тд- все считается и там и там)

О какой просадке речь: абсолютная, относительная, максимальная?

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