Под тестированием я понимаю более серьезные тесты с помощью программы TickStory и котировок Дукаскопи.
http://tradelikeapro.ru/tickstory-lite/
Качеством теста в 90% не занимаюсь, но где то читал, что терминал поддерживает hst файлы определенного размера. Раз тест не проходит за 1 проходку, значит размер котировок превышен.
Тестирование советников - тема для программистов 📌
От b0a, 12 марта, 2013 в Уголок Программиста
Я пользуюсь стандартным тестированием МТ4, с подгруженной от Альпари историей по М1.
При тестах стоит тестирование по каждому тику.
Это не тестирование, это попытка измерить отрезком трубы в 1 м длинну и ширину спичечного коробка. От реального тестирования с тиковыми данными будут отличия в разы.
Я пользуюсь стандартным тестированием МТ4, с подгруженной от Альпари историей по М1.
При тестах стоит тестирование по каждому тику.
Это не тестирование, это попытка измерить отрезком трубы в 1 м длинну и ширину спичечного коробка. От реального тестирования с тиковыми данными будут отличия в разы.
Даже не дневках ?
]
Даже не дневках ?
Зачем мучить себя вопросами когда есть бесплатный ТиксториЛайт, и тестируйте на здоровье с высоким качеством, а про встроенный тестер просто забудьте, на нем имеет смысл только первый раз советник прогнать чтобы в принципе понять - он сразу сливает или хоть немного зарабатывает.
Господа не подскажите - для тиковой истории под один инструмент за один год, какой объем дискового пространства нужен ?
от 1 до 2 Гиг (зависит от пары)
Ребят, подскажите. Тестирую трендовый советник,собственной разработки. В мт4 с его историей на днях. Купил помощнее комп, но даже с ним тестирование занимает 90 часов, правда загрузка проца на 15%.
возможно так долго из-за того что торговля построена на отложенных ордерах. Но все же есть ли патчи или может метод какой, что бы ускорить тестирование советника?
Ребят, подскажите. Тестирую трендовый советник,собственной разработки. В мт4 с его историей на днях. Купил помощнее комп, но даже с ним тестирование занимает 90 часов, правда загрузка проца на 15%.
возможно так долго из-за того что торговля построена на отложенных ордерах. Но все же есть ли патчи или может метод какой, что бы ускорить тестирование советника?
Вы хорошие и правильные вопросы задаете, себе и нам.
Первое самое Важное оптимизация кода советника, постарайтесь убрать все лишние, графические обьекты, функции комментариев и прочее не относящееся к торговой стратегии.
Второе постарайтесь уменьшить в коде количество циклов и проверок, старайтесь применять if () else , в место , if () if(), при большом выборе используй те оператор switch и так далее ...
Старайтесь не использовать код на каждом тике который должен срабатывать только при услових ...
По поводу железа
Важны частота камня, ссд накопитель, и оперативная память, наверно оперативная память самая важная так как должна быстро пулять блоки инструкций...
Операционка 64 бита, вот наверно и все мож что и забыл....
Изменено 21 мая, 2015 пользователем voldemar227
или используют требовательные к ресурсам индикаторы, типа рекурсивного ТМА - Вы как тренд определяете?
В общем от реализации кода зависит, у меня были случаи когда после оптимизации кода тестирование происходило в 100-и раз быстрее без потери качества так сказать...
Тренд определяю на пробой минимума и максимума, и еще есть дополнительный фильтр на выключения советника при явном флете по iMA.
Я как то не задумывался по поводу того, что он каждый тик что-то проверяется. Попробую подключить условие появления не просчитанных баров.
Я его в индикаторах только применял, может и в советнике прокатит. Кстати никто не пробывал, сработает?
Важны частота камня, ссд накопитель, и оперативная память, наверно оперативная память самая важная так как должна быстро пулять блоки инструкций...
Операционка 64 бита, вот наверно и все мож что и забыл....
Оперативкой я закупился вдоволь, создал рам-диск, скорость просчета увеличилась в четыре раза до ранее озвученных 90 часов.
Правда сейчас терминал, спустя 20 часов оптимизации, сократил оставшееся время до 9 часов... не знаю в чем причина, но приятно.
Тренд определяю на пробой минимума и максимума, и еще есть дополнительный фильтр на выключения советника при явном флете по iMA.
Я как то не задумывался по поводу того, что он каждый тик что-то проверяется. Попробую подключить условие появления не просчитанных баров.
Я его в индикаторах только применял, может и в советнике прокатит. Кстати никто не пробывал, сработает?
Важны частота камня, ссд накопитель, и оперативная память, наверно оперативная память самая важная так как должна быстро пулять блоки инструкций...
Операционка 64 бита, вот наверно и все мож что и забыл....
Оперативкой я закупился вдоволь, создал рам-диск, скорость просчета увеличилась в четыре раза до ранее озвученных 90 часов.
Правда сейчас терминал, спустя 20 часов оптимизации, сократил оставшееся время до 9 часов... не знаю в чем причина, но приятно.
Каков алгоритм оптимизации ?
Генетический или полный ?
bool NewBar()
{
static datetime new_Bar;
if (new_Bar == Time[1]) return(false); //Если бар не закрыт - выход
new_Bar = Time[1];
return(true);
Тренд определяю на пробой минимума и максимума, и еще есть дополнительный фильтр на выключения советника при явном флете по 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);
Здорово!!! так все просто ))) Спасибо. Сейчас заценим ))))
Генетический быстрее, просто возникло сомнение, может Вы на полную оптимизацию решились... :)Генетический. Это его такая особенность!?
Тренд определяю на пробой минимума и максимума, и еще есть дополнительный фильтр на выключения советника при явном флете по 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 - без этого кодом пользоваться нельзя, или ошибаюсь?Надежней и практичней будет так
Извините за оффтоп. 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; // в любом другом случае вернем фалсе
}
Мы уже обсуждали этот вопрос и пришли к заключению, что для надёжности следует пользоваться функциями текущего ТФ, а приход бара на другом ТФ можно рассчитать математически одной строчкой... 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); работает стабильно, сбой может быть только в случае если символ для функции берется с не открытого ранее графика...
Вы меня удивляете. datatime это целое 8 байтовое число, а Вы пишите про строку! Тем более это на практике работает, а не теоретически. Но соглашусь с Вами, что явное преобразование типов всё-таки необходимо.
Программная ошибка:
Time[0] имеет тип данных datatime это раньше был тип данных int , получается что Вы строку типа "0000.00.00 00:00" делите на число, как так?
Логическая ошибка проявляется только когда текущий ТФ длиннее выбранного пользователем. поэтому нужна доп. проверка.Логическая ошибка :
ЗЫ: если Вам нравится работа ф-ции iTime - прекрасно, я обратил внимание на иногда проявляющуюся нестабильность. Писал для других, Вас считаю достаточно компетентным.
Под результаты тестирования в МТ4, написано несколько утилит, некоторые из которых (например ReportManager) позволяют видеть результаты мультивалютного тестирования за выбранный промежуток
времени. Но при этом если в советники используется манименеджемент, "завязанный" каким то образом
на размере счета, то при таком мультивалютном "тестировании", этот момент считается криво.
То есть рассчет лота идет не от общего депо, а от результатов по одной валютной паре из этого отчета.
Как-то можно (кроме ручного перерасчета в экселе), этот нюанс учесть и увидеть корректные результаты (то есть увидеть результаты мультивалютного тестирования с учетом манименеджемента от общего размера счета)?
Все тесты всегда делаются со стандартным лотом. Просадка высчитывается делением значения максимальной на начальный депозит.
Этих данных вполне достаточно, чтобы иметь представление о просадке, доходе сета. далее на калькуляторе высчитывается соотношение лота в депо (0.01 на 500 тугриков), и после этого уже только прикручивается ММ для этого соотношения.
Для публикации сообщений создайте учётную запись или авторизуйтесь
Перейти к списку тем