Мультисистемный тестер (часть 2)
Итак первый этап пройден мы создали набор клонов-инструментов теперь очередь за стратегией:
Чтобы оттестировать несколько стратегий на множестве инструментов придется немного поработать руками, структура afl кода должна состоять из нескольких уровней:
1 уровень — Мега стратегия, которая объединяем в себе множество стратегий, именно этот afl файл должен быть загружен в тестер и прогоняться на истории
2 уровень — множество файлов с системами они включают в себя правила торговли
Внимание: не копируйте нижеприведенный код, из-за особенностей показа кавычек, амиброкер не будет его правильно компилировать. Скачайте прикрепленный файл ниже по ссылке
Давайте разбираться подробнее:
Листинг файла MegaSystem.afl
//
// Включаем в мега стратегию файл с системой Sys1.
// !!Замените пути к стратегии на свои
#include ".\\Formulas\\Custom\\MultiSystem\\Sys1.afl";
//
// Передаем список базовых инстурментов по которым должна торговать это стратегия
// список иструментов должен быть без суффиксов "_N", т.е. это должен быть список инструментов
// ставших основой для клонов
//
// Заметка: Можно для каждой системы задать свой список инструментов для теста.
_N(TickerList = CategoryGetSymbols( categoryWatchlist, 0 ));
//
// Основная функция запускающая механизм теста для нашей системы
// (аргументы разберем в Sys1.afl)
InitSystem(TickerList, 1, 0.5);
// Система 2
#include ".\\Formulas\\Custom\\MultiSystem\\Sys2.afl";
_N(TickerList = CategoryGetSymbols( categoryWatchlist, 0 ));
InitSystem2(TickerList, 2, 0.5);
//
// По аналогии список можно продолжить
// !!! Нельзя допустить чтобы в #include файлах имена функций совпадали друг с другом
// Поэтому целесообразно для каждой системы переименовывать вызываемые функции
Структура файла 2го уровня:
Листинг файла Sys1.afl
// Функция должна содержать правила входа-выхода для каждой конкретной системы
// Аргумент - SysPosSize - представляет собой лимит который мы выделяем на конкретную систему(из группы тестируемых систем)
//
function LaunchSystem(SysPosSize)
{
// Обязательные параметры, иначе мы будем присваивать локальные переменные
global Buy,Sell,Short,Cover;
global BuyPrice,SellPrice,ShortPrice, CoverPrice;
// --end
//Правила системы
Buy = Cross( MACD(), Signal() );
Sell = Cross( Signal(), MACD() );
BuyPrice = SellPrice = Open;
//Устанавливаем объем открытых позиций для каждого инструмента с поправкой на общесистемный лимит
//Можно использовать PositionSize
SetPositionSize( 30*SysPosSize, spsPercentOfEquity );
}
//
// Основная функция для инициализации расчета сигналов системы
// Аргументы
// TickerList - список базовых активов (без суффикса "_N")!!! (перечисленые через запятую)
// SysID - индекс систем, система с SysID = 3, будет торговать только инструменты с суффиксом "_3"
// SysPosSize - общий лимит на эту систему (0.3 = 30%)
function InitSystem(TickerList, SysID, SysPosSize)
{
//Получаем название базового инструмента клона
BaseTicker = StrLeft(Name(),StrFind(Name(), "_")-1);
//Если имя текущего инструмента в списке торгуемых и Клон-инструмент с индксом нашей системы то расчитываем сигналы
if (StrFind(TickerList, BaseTicker) > 0 && Name() == BaseTicker+"_"+SysID)
{
LaunchSystem(SysPosSize);
}
}
Теперь тестируем
Настройки анализатора:
1. Список инструментов он же Use Filter: устанавливаем как фильтр тот WatchList в котором находятся все клоны инструменты (в нашем случае WatchList 13)
2. Formula File — выбираем MegaSystem.afl
3. Комиссии можно задать как в настройках тестера так и отдельно в коде afl (для тестового случая ставим 0)
Для примера и теста работоспособности мы взяли 2 одинаковых системы, только с одной разницей когда одна в лонг, другая по тем же ценам в шорт. Тем самым общий результат тестирования должен быть равен 0, естесственно при условии 0 комиссии.
В итоге если все заработает нормально мы должны получить следующую картину.
Исходники AFL
Mega System AFL Source
Заключение
Друзья, теперь в ваших руках появился мощнейший инструмент, с помощью которого вы можете тестировать любой набор систем. Амиброкер в очередной раз доказал что он на голову выше всех конкурирующих программ.
Удачи!
Filed under: Amibroker | 4 комментария
Метки: backtesting, multisystem, systems
А если нужно исследовать несколько систем но на одном графике — как это проще всего сделать?
установить Wealth Lab и без заморочек тестировать портфель на специальном симуляторе