Параметры TestReport/TestReplaceReport и получение отчёта о прогонах эксперта в оптимизаторе - страница 2

 
chv:

Я говорю не о способах рисования графики, а об алгоритме формирования баланса/средств. Он мне пока неизвестен. А как рисовать линии и точки, дело десятое.
Подскажите, пожалуйста, алгоритм.


это не поможет? - 'Что означают цифры в отчёте тестирования эксперта'
 
xeon:
chv:

Я говорю не о способах рисования графики, а об алгоритме формирования баланса/средств. Он мне пока неизвестен. А как рисовать линии и точки, дело десятое.
Подскажите, пожалуйста, алгоритм.


это не поможет? - 'Что означают цифры в отчёте тестирования эксперта'
Уже тепло. Второй сверху график в статье показывает график баланса, правда, без Equity.

Ближе к API:
double AccountBalance( ) 
Возвращает значение баланса активного счета (сумма денежных средств на счете). 
 
double AccountEquity( ) 
Возвращает сумму собственных средств для текущего счета. Расчет equity зависит от настроек торгового сервера.
   

этот набор функций возвращает то, что нужно.

Вопрос, как получить их значения, актуальные после каждого закрытия любого ордера? Если вычислять их на каждом вызове start(), то при долгом её выполнении часть тиков цены может пройди мимо start(). Может быть ведь массовое закрытие ордеров по s/l или t/p. Если же я после беру значения OrderClosePrice() для каждого ордера, как получить значения AccountBalance / AccountEquity актуальными на момент их закрытия? Или пропуск тиков в start() считается допустимым?
Наверняка это очень просто, чего-то я не догоняю.

 
По поводу отлавливания прогонов оптимизатора. А не вариант ловить изменения оптимизируемых параметров экспертов или достижение конечной даты
тестирования? Тогда можно по этому событию и генерировать отчет о прогоне.
 
Luptator:
По поводу отлавливания прогонов оптимизатора. А не вариант ловить изменения оптимизируемых параметров экспертов или достижение конечной даты
тестирования? Тогда можно по этому событию и генерировать отчет о прогоне.

В терминале нет таких событий, как изменение параметров в оптимизаторе. И дат тоже, более того, реальные даты тестирования отличаются от заданных (с/по), являясь первой/последней датами, пришедшеми с ценой с сервера.
 
chv:

Вопрос, как получить их значения, актуальные после каждого закрытия любого ордера? Если вычислять их на каждом вызове start(), то при долгом её выполнении часть тиков цены может пройди мимо start(). Может быть ведь массовое закрытие ордеров по s/l или t/p. Если же я после беру значения OrderClosePrice() для каждого ордера, как получить значения AccountBalance / AccountEquity актуальными на момент их закрытия? Или пропуск тиков в start() считается допустимым?
Наверняка это очень просто, чего-то я не догоняю.

 

В тестере тики не пропускаются даже при долгой обработке cобытия start()

 
chv:
Luptator:
По поводу отлавливания прогонов оптимизатора. А не вариант ловить изменения оптимизируемых параметров экспертов или достижение конечной даты
тестирования? Тогда можно по этому событию и генерировать отчет о прогоне.

В терминале нет таких событий, как изменение параметров в оптимизаторе. И дат тоже, более того, реальные даты тестирования отличаются от заданных (с/по), являясь первой/последней датами, пришедшеми с ценой с сервера.
Я имел в виду сделать это вручную. Например, ловим изменение теэйкпрофита. Заводим глобальную переменную в которой храним значение тп.
И если при вызове start() текущее значение тп не равно предыдущему, то произошла смена параметра. Что-то вроде этого:

int prev_param=0;
..........
.........
start()
{
if(prev_param!=TakeProfit)
{
// тут обработка
prev_param=TakeProfit;
}
}
 

Блин чего-то меня не в ту сторону унесло, ведь график строится на истории ордеров, по порядку пролистывая всю историю сделок. .. После того как все сделки завершены и завершена работа советника. А значит.

Мы объявляем проходную цену и время закрытия и движемся в порядке истории, можно на прямую выводить в XML файл. Кстати я бы на вашем месте, поставил бы заголовок XML файа encoding="windows-1251", а то русский выводить в файл не получится, хоть это и не столь важно для файла данных, тем не менее, UTF8 трудно сочетать с ANSI, если будут выведены хотябы специальные символы, превышающие диапазон байта 0x7F так как верхий бит отвечает за использование более одного байта для символа:) Лучше всего конечно использовать UTF-8 но для этого надо как минимум передать управление тому коду, который знает о ней.

 

Блин создать код проще, чем вывести суть для чего:) Я так думаю что ордера в истории по порядку закрытия записываются, поэтому упорядочивать по дате не требуется. А на основе этого уже можно налепить график. Что еще Вам не хватает для графика? На мой взгляд это все что нужно.

int start() {
    int _index = 0;
    double _price = 5000;
    Print( "Начальный депозит: ", _price );
    while ( OrderSelect( _index, SELECT_BY_POS, MODE_HISTORY ) ) {
        int _order = OrderType();
        if ( _order == OP_BUY || _order == OP_SELL ) {
            double _ctime = OrderCloseTime();
            _price = _price + ( OrderCommission() + OrderSwap() + OrderProfit() );
            Print( "Order Closed Time: ", TimeToStr( _ctime, TIME_DATE|TIME_MINUTES|TIME_SECONDS ), " Price: ", _price );
        }
        _index++;
        
    }
    Print( "Итоговый депозит: ", _price );
  return(0);
}
Причина обращения: