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

Давно задался вопросом: как оттестировать в один прогон и построить 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);
}

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

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

Leave a comment