Мультисистемный тестер (часть 1)

19Фев08

Давно задался вопросом: как оттестировать в один прогон и построить Equity несколько систем одновременно. Не прибегая к танцам с бубном вроде объединения данных Equity каждой системы или написанию своего софта.

Идею мне подкинул Олег (000), суть ее проста:
1. Создаем несколько клонов-инструментов (с одинаковыми данными и именами например EESR_1, EESR_2, EESR_N — по количеству систем)
2. Создаем один файл мега-систему, которая содержит в себе несколько систем.
3. В этом файле настраиваем фильтры для каждой системы(чтобы она торговала только определенной серией инструментов *_2 например)
4. Задаем объем капитала каждой системе
5. И тестим.
На выходе мы получаем, уже составную Equity, посчитанные общие к-ты Шарпа, CAR/MDD и т.п.

Основной вопрос, что при тесте 10 систем на 100 инструиментах, ручками все переименовывать не хватит жизни, поэтому мое врожденное чувство лени заставило меня накатать следующий скриптик: который помогает сделать(или очистить ранее созданную) группу клонов-инструментов для дальнейшего тестирования.

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


// MultiSystem Quotes Duplicator
// by Angel's Death 19.02.2008
//
// Описание: создает инструменты-клоны для дальнейшего тестирования нескольких систем
//
// Предупреждение: скрипт сохраняет и перезагружает БД Амиброкера автоматически, т.е. любое его изменение БД нельзя отменить
//
// Использование:
// 1. Задать WatchList в котором хранятся инструменты для клонирования
// 2. Задать количество клонов
// 3. Изменить путь к текущей БД Амиброкера
// 4. Задать № WatchList в который будут помещены результаты

DupeTickers = ParamTrigger("Dupe Tickers", "Click Here Duplicate Tickers");
//
// Удаляет все клонированные тикеры (настройки TickerList и NumDuplicates должны быть идентичными, тем что были при создании)
//
DeleteDupeTickers = ParamTrigger("Delete Duped Tickers", "Click Here DELETE Duplicated Tickers");

//
// Задаем категорию в которой хранятся инструменты которые му будем размножать
//
TickerList = CategoryGetSymbols( categoryWatchlist, 0 );
//
// Сколько клонов сделать
//
NumDuplicates = Param("SymbolDupeNo",1,0,10,1);
//
// В какой WatchList сохраним эти клоны
//
WatchListToSave = 13;
//
// Путь к БД Амиброкера
//
AmiBrokerDB = "F:\\Trading\\AmiBroker\\BackTesting";

function GetFolder(SymName)
{
ret = "_";
s = StrLeft(SymName, 1);
Ch = Asc(StrToUpper(s));
if ((Ch >= 48 && Ch = 65 && Ch <= 90)) ret = s;
return ret;
}

if ( DupeTickers )
{
oAB = CreateObject( "Broker.Application" );
oStocks = oAB.Stocks();
//
// Создаем новые инструменты
//

for( n=0; (Ticker=StrExtract( TickerList, n))!= ""; n++)
{
//oStocks.Remove( Ticker );
for(i = 1; i <= NumDuplicates; i++)
{
s = Ticker + "_" + i;
st = oStocks.Add(s);
st.WatchListBits = 2 ^ WatchListToSave;
}
}
oAb.SaveDatabase();
oAB.RefreshAll();

//
// Заменяем пустые данные новых инструментов, файлами с данными
// родительских инструментов
fso = CreateObject( "Scripting.FileSystemObject");

for( n=0; (Ticker=StrExtract( TickerList, n))!= ""; n++)
{
path = AmiBrokerDB+"\\"+GetFolder(Ticker)+"\\"+Ticker;
if (fso.FileExists(path))
{
for(i = 1; i <= NumDuplicates; i++)
{
//object.CopyFile ( source, destination[, overwrite] )
fso.CopyFile(path, path +"_" + i, True);
}
}
}

oAB.LoadDatabase(AmiBrokerDB);
}

if (DeleteDupeTickers)
{
oAB = CreateObject( "Broker.Application" );
oStocks = oAB.Stocks();
//
// Удаляем клонированные инструменты
//

for( n=0; (Ticker=StrExtract( TickerList, n))!= ""; n++)
{
for(i = 1; i <= NumDuplicates; i++)
{
s = Ticker + "_" + i;
oStocks.Remove(s);
}
}
oAb.SaveDatabase();
oAB.RefreshAll();
oAB.LoadDatabase(AmiBrokerDB);
}

MultiSystem Quotes Duplicator (переименовать в .afl!)

Далее выложу рыбу, для создания мега системы, и посмотрим результат…

Продолжение следует….

Реклама


9 Responses to “Мультисистемный тестер (часть 1)”

  1. 1 Camel

    (Ch >= 48 && Ch = 65 && Ch <= 90) = (Ch = 65) ?

  2. Camel, это мы пытаемся найти название папки на диске в зависимости от первой буквы названия Ticker’a, на HDD Ами хранит все тикеры физически в папках \A-Z_

  3. 3 Camel

    я просто немного не понял… как вижу я:
    (Ch не меньше 48) И (Ch равен 65) И (Ch не больше 90) — т.е. истина тогда и только тогда, когда Ch равен 65… или я неправильно понимаю код?

  4. Я понял, это особенности кривого отображения кода блогом. Нужно по ссылкениже скачать, там код верный,а это выражение имеет совсем другой вид.
    if ((Ch >= 48 && Ch <= 57) || (Ch >= 65 && Ch <= 90)) ret = s;

  5. 5 Camel

    таки скачал фай

  6. 6 Camel

    упс 😉

    таки скачал файл, посмотрел… вопросов больше не имею 😉

    спасибо

  7. Оригинальная идея. Интересно сколько времени на это потрачено? 🙂


  1. 1 Мультисистемный тестер (часть 2) « Heaven trading
  2. 2 Мультисистемный тестер (часть 2) – Ubertrader

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s


%d такие блоггеры, как: