Алгоритм расчёта просадки, или Самостоятельная оценка результатов тестирования эксперта - страница 4

 
komposter писал(а) >>

Просадку надо считать по Equity.

А для этого надо проводить нужные расчеты не один раз в конце работы (в deinit()-е), а на каждом тике (в start()-е).

Но работа замедляется, в принципе, не сильно.

Ну наверное можно и в deinit'e пройтись по всем ордерам анализом.

Но мне все равно, лишь бы вычислительные затраты были приемлемые.

Дайте код плиз! :)

 
Shaitan >>:

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

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

В реале Гл. переменные не помогут - эксперт не в состоянии ловить все тики, да и паузы в работе могут быть (по разным причинам).

А к вопросу терминологии тут как-то сложилось терминальные переменные называть с большой буквы или GV. Все остальное - переменные, объявленные на глобальном уровне.

 
voltair >>:

Ну наверное можно и в deinit'e пройтись по всем ордерам анализом.

Но мне все равно, лишь бы вычислительные затраты были приемлемые.

Дайте код плиз! :)

Не по любому символу получится точно рассчитать плавающую прибыль на истории, да и незачем это.


В старте вставьте вот такой код:

static double	MaxEquity	= 0.0;
static double	DrawDown	= 0.0;

if ( AccountEquity() > MaxEquity ) MaxEquity = AccountEquity();
if ( MaxEquity - AccountEquity() > DrawDown ) DrawDown = MaxEquity - AccountEquity();
 

Если глобальные переменные терминала не помогут, то что поможет?

И потом, почему собс-но не помогут? С одной стороны, причём здесь ловля всех тиков? А с другой стороны, если эксперт работает не на древнем пне и не перегружен по самое не балуй, то нормально ловятся все тики. Пауза - ну извините, против лома нет приёма. Кроме как другого лома. Стоплоссы не надо забывать ставить. Пауза пройдёт, - пересчитаем эквити, не проблема.

 

Я бы в этот код добавил строку

eq = AccountEquity()

а потом работал бы с переменной. Вот так, например:

static double  MaxEquity = 0;
static double  DrawDownAbs = 0;
static double  DrawDownRel = 1;

double  eq = AccountEquity();
if ( eq>0 ) {
  if ( eq>MaxEquity )  MaxEquity = eq;
  if ( MaxEquity-eq>DrawDownAbs )  DrawDownAbs = MaxEquity-eq;
  if ( eq/MaxEquity<DrawDownRel )  DrawDownRel = eq/MaxEquity;
}

Уж больно неэффекивно каждый раз лопатить терминальную функцию работы со счётом.

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

 
Shaitan >>:

Если глобальные переменные терминала не помогут, то что поможет?

И потом, почему собс-но не помогут? С одной стороны, причём здесь ловля всех тиков? А с другой стороны, если эксперт работает не на древнем пне и не перегружен по самое не балуй, то нормально ловятся все тики. Пауза - ну извините, против лома нет приёма. Кроме как другого лома. Стоплоссы не надо забывать ставить. Пауза пройдёт, - пересчитаем эквити, не проблема.

Пропустив тик, на котором было максимальное эквити, вы получите ошибку в рассчете просадки.


Shaitan >>:

Я бы в этот код добавил строку

eq = AccountEquity()

Я бы тоже добавил, если бы писал не в редакторе сообщений форума ;)

 
komposter писал(а) >>

Не по любому символу получится точно рассчитать плавающую прибыль на истории, да и незачем это.

В старте вставьте вот такой код:

Ок! Хотя вначале я подумал, что Ваш код считает "просадку наоборот":

Но был не прав, то есть расчет верный.

Просто жаль было времени тратить на него, т.к., как видим, есть готовый.

P.S. Shaitan, Ваш еще не проверил.

 
komposter писал(а) >>

Пропустив тик, на котором было максимальное эквити, вы получите ошибку в рассчете просадки.

Ну, это мелочи. Тиком меньше, тиком больше. Погоды не сделает.

 
voltair писал(а) >>

Мне думается, такой подход не верен. Вот что он рассчитает, имхо:

А нужно то, где вопросы.

Но может я не прав?

Конечно не прав :) Вы перепутали прошлое с будущим, - очерёдность двух событий. Зелёную стрелку скорей следует назвать DrawUp! :)))

Я ж написал, код проверен, совпадение абсолютное.

 
Shaitan писал(а) >>

Конечно не прав :) Вы перепутали прошлое с будущим, - очерёдность двух событий. Зелёную стрелку скорей следует назвать DrawUp! :)))

Я ж неписал, код проверен, совпадение абсолютное.

Почему это я перепутал?

Читаем мануал: Максимальная просадка — наибольший убыток от локального максимума в валюте депозита и в проценте от депозита.

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

А Вы как определяете, что такое максимальная просадка? Дайте определение или покажите на этом графике.

Ваш код все еще не проверил. :)

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