Перейти к содержанию

Тестирование советников - тема для программистов


Рекомендуемые сообщения

Тестирование советников - тема для программистов Опубликовано

Под тестированием я понимаю более серьезные тесты с помощью программы TickStory и котировок Дукаскопи.
http://tradelikeapro.ru/tickstory-lite/

Качеством теста в 90% не занимаюсь, но где то читал, что терминал поддерживает hst файлы определенного размера. Раз тест не проходит за 1 проходку, значит размер котировок превышен.

  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 274
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Имхо виноват генетический алгоритм ! Но без него время теста увеличится на порядок... Я тестирую сначала быстро и грубо, но в широком диапазоне с широким шагом, потом смотрю на влияние переменных на

Перейти

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

Перейти

Rever27 я, например, делаю так: double OnTester() { double ret=0.0; if (TesterStatistics(STAT_EQUITY_DD)>0) ret = TesterStatistics(STAT_PROFIT) / TesterStatistics(STAT_EQUITY_DD); else

Перейти
Тестирование советников - тема для программистов Опубликовано


Я пользуюсь стандартным тестированием МТ4, с подгруженной от Альпари историей по М1.
При тестах стоит тестирование по каждому тику.


Это не тестирование, это попытка измерить отрезком трубы в 1 м длинну и ширину спичечного коробка. От реального тестирования с тиковыми данными будут отличия в разы.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Тестирование советников - тема для программистов Опубликовано



Я пользуюсь стандартным тестированием МТ4, с подгруженной от Альпари историей по М1.
При тестах стоит тестирование по каждому тику.


Это не тестирование, это попытка измерить отрезком трубы в 1 м длинну и ширину спичечного коробка. От реального тестирования с тиковыми данными будут отличия в разы.

Даже не дневках ?
Ссылка на сообщение
Поделиться на другие сайты

Тестирование советников - тема для программистов Опубликовано

]
Даже не дневках ?


Зачем мучить себя вопросами когда есть бесплатный ТиксториЛайт, и тестируйте на здоровье с высоким качеством, а про встроенный тестер просто забудьте, на нем имеет смысл только первый раз советник прогнать чтобы в принципе понять - он сразу сливает или хоть немного зарабатывает.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Тестирование советников - тема для программистов Опубликовано

Господа не подскажите - для тиковой истории под один инструмент за один год, какой объем дискового пространства нужен ?

Ссылка на сообщение
Поделиться на другие сайты

Тестирование советников - тема для программистов Опубликовано

Ребят, подскажите. Тестирую трендовый советник,собственной разработки. В мт4 с его историей на днях. Купил помощнее комп, но даже с ним тестирование занимает 90 часов, правда загрузка проца на 15%.
возможно так долго из-за того что торговля построена на отложенных ордерах. Но все же есть ли патчи или может метод какой, что бы ускорить тестирование советника?

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Тестирование советников - тема для программистов Опубликовано (изменено)


Ребят, подскажите. Тестирую трендовый советник,собственной разработки. В мт4 с его историей на днях. Купил помощнее комп, но даже с ним тестирование занимает 90 часов, правда загрузка проца на 15%.
возможно так долго из-за того что торговля построена на отложенных ордерах. Но все же есть ли патчи или может метод какой, что бы ускорить тестирование советника?


Вы хорошие и правильные вопросы задаете, себе и нам.
Первое самое Важное оптимизация кода советника, постарайтесь убрать все лишние, графические обьекты, функции комментариев и прочее не относящееся к торговой стратегии.
Второе постарайтесь уменьшить в коде количество циклов и проверок, старайтесь применять if () else , в место , if () if(), при большом выборе используй те оператор switch и так далее ...
Старайтесь не использовать код на каждом тике который должен срабатывать только при услових ...
По поводу железа
Важны частота камня, ссд накопитель, и оперативная память, наверно оперативная память самая важная так как должна быстро пулять блоки инструкций...
Операционка 64 бита, вот наверно и все мож что и забыл.... Изменено пользователем voldemar227
  • Лайк 6
Ссылка на сообщение
Поделиться на другие сайты

Тестирование советников - тема для программистов Опубликовано
f999145 чуть расширю ответ voldemar227. Бывает анализируют историю закрытых ордеров на каждом тике (это про лишние циклы)
или используют требовательные к ресурсам индикаторы, типа рекурсивного ТМА - Вы как тренд определяете?
В общем от реализации кода зависит, у меня были случаи когда после оптимизации кода тестирование происходило в 100-и раз быстрее без потери качества так сказать...
  • Лайк 4
Ссылка на сообщение
Поделиться на другие сайты

Тестирование советников - тема для программистов Опубликовано

Тренд определяю на пробой минимума и максимума, и еще есть дополнительный фильтр на выключения советника при явном флете по iMA.
Я как то не задумывался по поводу того, что он каждый тик что-то проверяется. Попробую подключить условие появления не просчитанных баров.
Я его в индикаторах только применял, может и в советнике прокатит. Кстати никто не пробывал, сработает?


Важны частота камня, ссд накопитель, и оперативная память, наверно оперативная память самая важная так как должна быстро пулять блоки инструкций...
Операционка 64 бита, вот наверно и все мож что и забыл....



Оперативкой я закупился вдоволь, создал рам-диск, скорость просчета увеличилась в четыре раза до ранее озвученных 90 часов.
Правда сейчас терминал, спустя 20 часов оптимизации, сократил оставшееся время до 9 часов... не знаю в чем причина, но приятно.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Тестирование советников - тема для программистов Опубликовано


Тренд определяю на пробой минимума и максимума, и еще есть дополнительный фильтр на выключения советника при явном флете по iMA.
Я как то не задумывался по поводу того, что он каждый тик что-то проверяется. Попробую подключить условие появления не просчитанных баров.
Я его в индикаторах только применял, может и в советнике прокатит. Кстати никто не пробывал, сработает?


Важны частота камня, ссд накопитель, и оперативная память, наверно оперативная память самая важная так как должна быстро пулять блоки инструкций...
Операционка 64 бита, вот наверно и все мож что и забыл....



Оперативкой я закупился вдоволь, создал рам-диск, скорость просчета увеличилась в четыре раза до ранее озвученных 90 часов.
Правда сейчас терминал, спустя 20 часов оптимизации, сократил оставшееся время до 9 часов... не знаю в чем причина, но приятно.

Каков алгоритм оптимизации ?
Генетический или полный ?
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Тестирование советников - тема для программистов Опубликовано
f999145 Вот процедурка на определение нового бара:
bool NewBar()
{
static datetime new_Bar;
if (new_Bar == Time[1]) return(false); //Если бар не закрыт - выход
new_Bar = Time[1];
return(true);
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Тестирование советников - тема для программистов Опубликовано



Тренд определяю на пробой минимума и максимума, и еще есть дополнительный фильтр на выключения советника при явном флете по iMA.
Я как то не задумывался по поводу того, что он каждый тик что-то проверяется. Попробую подключить условие появления не просчитанных баров.
Я его в индикаторах только применял, может и в советнике прокатит. Кстати никто не пробывал, сработает?


Важны частота камня, ссд накопитель, и оперативная память, наверно оперативная память самая важная так как должна быстро пулять блоки инструкций...
Операционка 64 бита, вот наверно и все мож что и забыл....



Оперативкой я закупился вдоволь, создал рам-диск, скорость просчета увеличилась в четыре раза до ранее озвученных 90 часов.
Правда сейчас терминал, спустя 20 часов оптимизации, сократил оставшееся время до 9 часов... не знаю в чем причина, но приятно.

Каков алгоритм оптимизации ?
Генетический или полный ?


Генетический. Это его такая особенность!?

Добавлено: 21-05-2015 16:03:21


f999145 Вот процедурка на определение нового бара:
bool NewBar()
{
static datetime new_Bar;
if (new_Bar == Time[1]) return(false); //Если бар не закрыт - выход
new_Bar = Time[1];
return(true);



Здорово!!! так все просто ))) Спасибо. Сейчас заценим ))))
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Тестирование советников - тема для программистов Опубликовано

Генетический. Это его такая особенность!?

Генетический быстрее, просто возникло сомнение, может Вы на полную оптимизацию решились... :)
Ссылка на сообщение
Поделиться на другие сайты

Тестирование советников - тема для программистов Опубликовано




Тренд определяю на пробой минимума и максимума, и еще есть дополнительный фильтр на выключения советника при явном флете по iMA.
Я как то не задумывался по поводу того, что он каждый тик что-то проверяется. Попробую подключить условие появления не просчитанных баров.
Я его в индикаторах только применял, может и в советнике прокатит. Кстати никто не пробывал, сработает?


Важны частота камня, ссд накопитель, и оперативная память, наверно оперативная память самая важная так как должна быстро пулять блоки инструкций...
Операционка 64 бита, вот наверно и все мож что и забыл....



Оперативкой я закупился вдоволь, создал рам-диск, скорость просчета увеличилась в четыре раза до ранее озвученных 90 часов.
Правда сейчас терминал, спустя 20 часов оптимизации, сократил оставшееся время до 9 часов... не знаю в чем причина, но приятно.

Каков алгоритм оптимизации ?
Генетический или полный ?


Генетический. Это его такая особенность!?

Добавлено: 21-05-2015 16:03:21


f999145 Вот процедурка на определение нового бара:
bool NewBar()
{
static datetime new_Bar;
if (new_Bar == Time[1]) return(false); //Если бар не закрыт - выход
new_Bar = Time[1];
return(true);



Здорово!!! так все просто ))) Спасибо. Сейчас заценим ))))

Надежней и практичней будет так
void  new_bar(bool &fl)
{
static datetime time=0;

if(NewBar==-1){fl=true; return;}

if(time==0)
{
time=iTime(_Symbol,NewBar,0);
fl=false;
}
if(time!=iTime(_Symbol,NewBar,0))
{
time=iTime(_Symbol,NewBar,0);
fl=true;
return;
}
fl=false;
}
Ссылка на сообщение
Поделиться на другие сайты

Тестирование советников - тема для программистов Опубликовано

Надежней и практичней будет так

Извините за оффтоп. voldemar227 поясните для интересующихся, в чём преимущество и заодно нужно людям растолковать назначение переменной NewBar - без этого кодом пользоваться нельзя, или ошибаюсь?
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Тестирование советников - тема для программистов Опубликовано


Надежней и практичней будет так

Извините за оффтоп. voldemar227 поясните для интересующихся, в чём преимущество и заодно нужно людям растолковать назначение переменной NewBar - без этого кодом пользоваться нельзя, или ошибаюсь?

Вы не ошибаетесь я забыл добавить еще код
Данный фрагмент ставится во входных параметрах

С помощью этого кода мы можем выбрать в настройках советника на каком таймфреме учитывать появление нового бара, например мы торгуем на М30 но определенные действия нужно сделать приприходе нового 4х часового бара или нового дня.
enum tf { Not_Used =-1, Current=0, M1=1, M5=5, M15=15, M30=30, H1=60, H4=240, D1=1440};
input tf NewBar=Current;

bool nb_flag=false; // флаг который будет получать значение и проверять будет новый бар на каждом тике

Далее в он тик вызывается функция
new_bar(nb_flag); // переменная по ссылке получает значение true - пришол новый бар, false - - нового бара нет см функцию



тело функции
void new_bar(bool &fl) // принимаем по ссылке переменную
{
static datetime time=0; // создадим статическую переменную для хранения времени

if(NewBar==-1){fl=true; return;} // если у нас в настройках советника трейдер выбрал Not_Used значит мы вообще не учитываем появление нового бара и по умолчанию наша переменная получает значение труе, затем выход из функции

if(time==0) // Если советник только что стартовал и наша статическая переменная пуста то заполним её значением времени а нашему флагу переданному по ссылке присвоим значение фалсе
{
time=iTime(_Symbol,NewBar,0);
fl=false;
}
if(time!=iTime(_Symbol,NewBar,0)) // Если пришол новый бар
{
time=iTime(_Symbol,NewBar,0); // запомним время его открытия
fl=true; // заполним переменную параметром труе
return; // оборвем и выйдем из функции
}
fl=false; // в любом другом случае вернем фалсе
}
  • Лайк 4
Ссылка на сообщение
Поделиться на другие сайты

Тестирование советников - тема для программистов Опубликовано
voldemar227 да так значительно лучше. Но насчёт надёжности: именно из-за iTime моя сова на реале пропускает сделки, т.к. МТ не желает обновлять котировки других ТФ автоматически, поэтому нужно или держать открытым график другого ТФ или танцевать с бубном.
Мы уже обсуждали этот вопрос и пришли к заключению, что для надёжности следует пользоваться функциями текущего ТФ, а приход бара на другом ТФ можно рассчитать математически одной строчкой... if (MathMod(Time[0], NewBar*60 ) == 0 ) Alert("Новый бар ",EnumToString(NewBar));
Ссылка на сообщение
Поделиться на другие сайты

Тестирование советников - тема для программистов Опубликовано


voldemar227 да так значительно лучше. Но насчёт надёжности: именно из-за iTime моя сова на реале пропускает сделки, т.к. МТ не желает обновлять котировки других ТФ автоматически, поэтому нужно или держать открытым график другого ТФ или танцевать с бубном.
Мы уже обсуждали этот вопрос и пришли к заключению, что для надёжности следует пользоваться функциями текущего ТФ, а приход бара на другом ТФ можно рассчитать математически одной строчкой... if (MathMod(Time[0], NewBar*60 ) == 0 ) Alert("Новый бар ",EnumToString(NewBar));


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

Тестирование советников - тема для программистов Опубликовано

Ну логическая - понятно этот пример придумал на ходу и, конечно, нужны доп. проверки, а "программной" не вижу, даже не знаю, что Вы имеете в виду... в скрипте работает на ура...
Вот скрипт на проверку ф-ции iTime:

#property script_show_inputs
enum tf { Current=0, M1=1, M5=5, M15=15, M30=30, H1=60, H4=240, D1=1440};
input tf NewBar=Current;
datetime dt;
void OnStart()
{
dt = iTime(_Symbol,NewBar,0);
Alert("Последний бар ",EnumToString(NewBar)," по версии iTime ", TimeToStr(dt));
}

Если не менять ТФ запустить скрипт и в настройках взять другой ТФ, то выдает результат печальный, правда на второй раз уже верные - успевает подкачать... В принципе если регулярно обращаться к другому ТФ, то наверно работать будет.

Ссылка на сообщение
Поделиться на другие сайты

Тестирование советников - тема для программистов Опубликовано



Надежней и практичней будет так

Извините за оффтоп. voldemar227 поясните для интересующихся, в чём преимущество и заодно нужно людям растолковать назначение переменной NewBar - без этого кодом пользоваться нельзя, или ошибаюсь?

Вы не ошибаетесь я забыл добавить еще код
Данный фрагмент ставится во входных параметрах

С помощью этого кода мы можем выбрать в настройках советника на каком таймфреме учитывать появление нового бара, например мы торгуем на М30 но определенные действия нужно сделать приприходе нового 4х часового бара или нового дня.
enum tf { Not_Used =-1, Current=0, M1=1, M5=5, M15=15, M30=30, H1=60, H4=240, D1=1440};
input tf NewBar=Current;

bool nb_flag=false; // флаг который будет получать значение и проверять будет новый бар на каждом тике

Далее в он тик вызывается функция
new_bar(nb_flag); // переменная по ссылке получает значение true - пришол новый бар, false - - нового бара нет см функцию



тело функции
void new_bar(bool &fl) // принимаем по ссылке переменную
{
static datetime time=0; // создадим статическую переменную для хранения времени

if(NewBar==-1){fl=true; return;} // если у нас в настройках советника трейдер выбрал Not_Used значит мы вообще не учитываем появление нового бара и по умолчанию наша переменная получает значение труе, затем выход из функции

if(time==0) // Если советник только что стартовал и наша статическая переменная пуста то заполним её значением времени а нашему флагу переданному по ссылке присвоим значение фалсе
{
time=iTime(_Symbol,NewBar,0);
fl=false;
}
if(time!=iTime(_Symbol,NewBar,0)) // Если пришол новый бар
{
time=iTime(_Symbol,NewBar,0); // запомним время его открытия
fl=true; // заполним переменную параметром труе
return; // оборвем и выйдем из функции
}
fl=false; // в любом другом случае вернем фалсе
}


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

Тестирование советников - тема для программистов Опубликовано


Ну логическая - понятно этот пример придумал на ходу и, конечно, нужны доп. проверки, а "программной" не вижу, даже не знаю, что Вы имеете в виду... в скрипте работает на ура...
Вот скрипт на проверку ф-ции iTime:

#property script_show_inputs
enum tf { Current=0, M1=1, M5=5, M15=15, M30=30, H1=60, H4=240, D1=1440};
input tf NewBar=Current;
datetime dt;
void OnStart()
{
dt = iTime(_Symbol,NewBar,0);
Alert("Последний бар ",EnumToString(NewBar)," по версии iTime ", TimeToStr(dt));
}

Если не менять ТФ запустить скрипт и в настройках взять другой ТФ, то выдает результат печальный, правда на второй раз уже верные - успевает подкачать... В принципе если регулярно обращаться к другому ТФ, то наверно работать будет.



if (MathMod(Time[0], NewBar*60 ) == 0 )

Программная ошибка:
Time[0] имеет тип данных datatime это раньше был тип данных int , получается что Вы строку типа "0000.00.00 00:00" делите на число, как так?
Если уж и городить костыли то правильнее будет так if (MathMod((double)Time[0], NewBar*60 ) == 0 ) .

Логическая ошибка :
Comment(MathMod(1432281600,3600 ));

1432281600 это количество секунд и значат 8:00 22.05.2015г
3600 это 1 час в секундах 60мин * 60 сек

Я Вашу формулу перевел в другой вид .

теперь смотрим при выполнении MathMod(1432281600,3600 ) == 0 оно же MathMod((double)Time[0], NewBar*60 ) == 0 у нас равенство будет верно только в том случае если NewBar*60 будет равно нашему таймфрему на который установлен советник. так как Time[0] вернет время открытия бара текущего периода.

Функция iTime(_Symbol,NewBar,0); работает стабильно, сбой может быть только в случае если символ для функции берется с не открытого ранее графика...

Ссылка на сообщение
Поделиться на другие сайты

Тестирование советников - тема для программистов Опубликовано


Программная ошибка:
Time[0] имеет тип данных datatime это раньше был тип данных int , получается что Вы строку типа "0000.00.00 00:00" делите на число, как так?

Вы меня удивляете. datatime это целое 8 байтовое число, а Вы пишите про строку! Тем более это на практике работает, а не теоретически. Но соглашусь с Вами, что явное преобразование типов всё-таки необходимо.

Логическая ошибка :

Логическая ошибка проявляется только когда текущий ТФ длиннее выбранного пользователем. поэтому нужна доп. проверка.
ЗЫ: если Вам нравится работа ф-ции iTime - прекрасно, я обратил внимание на иногда проявляющуюся нестабильность. Писал для других, Вас считаю достаточно компетентным.
Ссылка на сообщение
Поделиться на другие сайты

Тестирование советников - тема для программистов Опубликовано

Под результаты тестирования в МТ4, написано несколько утилит, некоторые из которых (например ReportManager) позволяют видеть результаты мультивалютного тестирования за выбранный промежуток
времени. Но при этом если в советники используется манименеджемент, "завязанный" каким то образом
на размере счета, то при таком мультивалютном "тестировании", этот момент считается криво.
То есть рассчет лота идет не от общего депо, а от результатов по одной валютной паре из этого отчета.
Как-то можно (кроме ручного перерасчета в экселе), этот нюанс учесть и увидеть корректные результаты (то есть увидеть результаты мультивалютного тестирования с учетом манименеджемента от общего размера счета)?

Ссылка на сообщение
Поделиться на другие сайты

Тестирование советников - тема для программистов Опубликовано
AndreyGold На кой вам нужно тестировать Сов с ММ? Чтобы видеть красивый рост графика?
Все тесты всегда делаются со стандартным лотом. Просадка высчитывается делением значения максимальной на начальный депозит.
Этих данных вполне достаточно, чтобы иметь представление о просадке, доходе сета. далее на калькуляторе высчитывается соотношение лота в депо (0.01 на 500 тугриков), и после этого уже только прикручивается ММ для этого соотношения.
  • Лайк 5
Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...