Автор |
Сообщение |
Khan
Зарегистрирован: 10.05.2012
Сообщения: 29
|
Тестировал портфель тикеров и набрел на проблему: портфельный тестер закрывает позицию на баре и сразу же на нем открывает новую. Выходит ерунда, например, если закрываемся по стопу где-нибудь в середине бара или на Close, а открываемся по Open, то получается на этом баре 2 позиции сразу. В случае же стопа получается заглядывание в будущее.
Пошукал в инете, вопросы похожие народ задает, но ответы не решают проблему. Тестовая системка (на основе ответа автора амишки): входим на любом баре, выходим через случайное количество дней. Тестируется портфель etf'ок, выбираются случайно 3 тикера на 3 позиции.
Код: |
SetOption("MaxOpenPositions", 3);
SetPositionSize(3, spsPercentOfEquity);
Buy = 1;
Sell = Cover = Short = 0;
PositionScore = Random() * 10;
BuyPrice = Open;
SellPrice = Close;
TradeDays = 3 + Random() * 7;
ApplyStop(stopTypeNBar, stopModeBars, TradeDays-1); |
А вот результаты: |
Последний раз редактировалось: Khan (Пт Янв 17, 2014 6:59 am), всего редактировалось 1 раз |
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Собственно в чем вопрос?
Как запретить вход на том баре где был выход?
Код: |
SetOption("MaxOpenPositions", 3);
SetPositionSize(3, spsPercentOfEquity);
Buy = 1;
Sell = Cover = Short = 0;
PositionScore = Random() * 10;
BuyPrice = Open;
SellPrice = Close;
TradeDays = 3 + Random() * 7;
ApplyStop(stopTypeNBar, stopModeBars, TradeDays-1);
Equity(1);
Buy = 1 And Sell == 0;
|
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Khan
Зарегистрирован: 10.05.2012
Сообщения: 29
|
Не работает, также выходит. Пока получается так (по исходной картинке):
Код: |
SCHG Зашли 2 дек по Open ............. Вышли 6 дек по Close
SZO Зашли 6 дек по Open ............. Вышли 17 дек по Close
|
Денег-то не было до вечера 6, получается ерунда, двойная позиция в течение дня. Не пойму, как сдвинуть вход на 7 декабря. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Думал, думал. Походу не используя адвансед интерфейс никак не обойтись. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Khan
Зарегистрирован: 10.05.2012
Сообщения: 29
|
000 писал(а): |
Думал, думал. Походу не используя адвансед интерфейс никак не обойтись. |
Вот жеж. Не годится амишка для портфельных тестов без переделки. Попробую переделать, получится - отпишу. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Khan
Зарегистрирован: 10.05.2012
Сообщения: 29
|
Тех поддержка предложила в качестве решения установить следующую опцию SetOption("SettlementDelay", 1 ); Частично это помогает.
Вообще, разбираясь с портфельным тестером, начинаю разочаровываться в амишке. Для отдельных тикеров - все отлично, но с портфелем как-то сложно. Их метод: сначала расставили сигналы, убрали лишние и лишь потом включили портфельный тестер в отдельных случаях косячит. Ну или я пока не понимаю как это дело правильно настроить. Всплыла еще одна проблема, напишу попозже, может кто встречался. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
fujis84
Зарегистрирован: 07.01.2014
Сообщения: 56
|
Khan писал(а): |
Тестировал портфель тикеров и набрел на проблему: портфельный тестер закрывает позицию на баре и сразу же на нем открывает новую. Выходит ерунда, например, если закрываемся по стопу где-нибудь в середине бара или на Close, а открываемся по Open, то получается на этом баре 2 позиции сразу. В случае же стопа получается заглядывание в будущее.
Пошукал в инете, вопросы похожие народ задает, но ответы не решают проблему. Тестовая системка (на основе ответа автора амишки): входим на любом баре, выходим через случайное количество дней. Тестируется портфель etf'ок, выбираются случайно 3 тикера на 3 позиции.
Код: |
SetOption("MaxOpenPositions", 3);
SetPositionSize(3, spsPercentOfEquity);
Buy = 1;
Sell = Cover = Short = 0;
PositionScore = Random() * 10;
BuyPrice = Open;
SellPrice = Close;
TradeDays = 3 + Random() * 7;
ApplyStop(stopTypeNBar, stopModeBars, TradeDays-1); |
А вот результаты: |
нет проблем вообще
Код: |
SetCustomBacktestProc("");
maxLong = 3;
if( Status("action") == actionPortfolio )
{
bo = GetBacktesterObject();
bo.PreProcess();
for( i = 0; i < BarCount; i++ )
{
cntLongOpen = 0;
// scan through open positions and count the number of long positions
for( openpos = bo.GetFirstOpenPos(); openpos; openpos = bo.GetNextOpenPos() )
{
// check for entry signal and long signal
if( openpos.IsOpen AND openpos.IsLong )
{
cntLongOpen++;
}
}
// look at new signals and exclude Long signals if they exceed maxLong
for( sig = bo.GetFirstSignal(i); sig; sig = bo.GetNextSignal(i) )
{
// check for entry signal and long signal
if( sig.IsEntry() AND sig.IsLong() )
{
if( cntLongOpen >= maxLong )
{
sig.PosSize = 0;
}
else
{
cntLongOpen++;
}
}
}
bo.ProcessTradeSignals( i );
}
bo.PostProcess();
}
SetSortColumns( 3 );
SetOption( "InitialEquity",1000000 );
SetOption( "MaxOpenPositions", 3 );
SetPositionSize (3, spsPercentOfEquity);
SetOption( "AllowSameBarExit", False );
Buy = 1;
Sell = Cover = Short = 0;
PositionScore = Random () * 10;
BuyPrice = Open;
SellPrice = Close;
TradeDays = 3 + Random () * 7;
ApplyStop (stopTypeNBar, stopModeBars, TradeDays-1);
Short = Cover = 0; |
sig.PosSize = 0; -> альтернатива -> sig.Price = -1; // this marks the signal to be skipped |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Khan
Зарегистрирован: 10.05.2012
Сообщения: 29
|
fujis84 писал(а): |
... нет проблем вообще |
Спасибо, мне неохота было в custom backtester лезть, хотел отделаться малой кровью. Там-то можно написать все что угодно. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
Khan
Зарегистрирован: 10.05.2012
Сообщения: 29
|
Напишу сюда еще один вопрос, чтобы темы не плодить. Тестирую системку: входим на каждом баре, выходим по 1%-ному тейку. Портфель, приоритеты позиций пока определяются рандомно. Получились результаты (см. таблицу), вроде все сделки должны по +1% закрываться.
Получается же не так (см. картинку с котировками). Входим мы иногда не на барах, которые получились при индивидуальном тесте (зеленые стрелки), а на барах с синим стрелками, когда закрывается поза по другому инструменту. А тейк считается по открытию бара с индивидульного теста (зеленая линия), а должен считаться по новому открытию (желтая) линия. Значит расчет тейка надо выносить в custom backtester? А в общем случае при тесте портфеля расчет любого выхода, зависящего от бара входа (стопы всех видов, тейки, выход через N баров), надо выносить в custom backtester?
Код: |
InitialCapital = 100000; // Initial Capital
ATRRange = 20; // ATR period
MaxPosNumber = 2; // Max number of open positions
PosSizePercent = 99/MaxPosNumber; // Size of one position/addion, % of equity
EnterCount = 0; // Addion number initialization
Take = Null; Buy=Null; Sell = Null; Pos = Null; BuyPrice = Null; SellPrice = Null; EnterPrice = Null;
SetBarsRequired(-2, -2);
SetOption("InitialEquity", InitialCapital);
SetOption("MaxOpenPositions", MaxPosNumber);
SetPositionSize(PosSizePercent, spsPercentOfEquity);
ATRValue = ATR(ATRRange);
Buy = 1;
BuyPrice = Open;
PositionScore = Random() * 10;
StartBar = Lookup(BarIndex(), _DT("2013-Jun-01"), 1); // Define the first bar of working period
Buy[StartBar] = 1; Sell[StartBar] = 0;
BuyPrice[StartBar] = Open[StartBar];
Pos[StartBar] = 1;
EnterPrice[StartBar] = BuyPrice[StartBar];
Take[StartBar] = 1.01 * BuyPrice[StartBar];
for(i = StartBar+1; i<BarCount; i++)
{
if(Pos[i-1] AND NOT(Sell[i-1]))
{
Pos[i] = Pos[i-1];
// BuyPrice[i] = BuyPrice[i-1];
Take[i] = Take[i-1];
Sell[i] = 0;
if(Take[i]<High[i])
{
Sell[i] = 1;
SellPrice[i] = Max(Take[i], Open[i]);
}
}
if(Pos[i-1] AND Sell[i-1])
{
Pos[i] = 1;
Buy[i] = 1;
Sell[i] = 0;
BuyPrice[i] = Open[i];
Take[i] = BuyPrice[i] *1.01;
}
}
Plot(Take, "Take", colorGreen, style=1);
SetBacktestMode(backtestRegularRaw);
SetOption("SettlementDelay", 1 );
|
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ну разумеется.
У тебя в цикле покупка считается на одном баре, а реально в АА она происходит на другом баре. При этом в коде про это ничего не известно. При расчете тейка надо плясать от реальной сделки. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Khan
Зарегистрирован: 10.05.2012
Сообщения: 29
|
000 писал(а): |
Ну разумеется.
У тебя в цикле покупка считается на одном баре, а реально в АА она происходит на другом баре. При этом в коде про это ничего не известно. При расчете тейка надо плясать от реальной сделки. |
Дык, у Томаша везде написано что бэктестер надо переделывать для какаих-то мега-сложных систем, а для средних трейдеров и так сойдет. Здесь же элементарные стопы и тейки, а уже надо править логику. Поэтому я и удивляюсь, подумалось, что мне понимания стандартного AFL не хватает.
А картинки видно в предыдущем посте? Вроде прикреплял их, а сейчас не вижу. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Я прекрасно вижу картинки.
Но вообще в твоем случае если надо тейк 1% то правильнее использовать ApplyStop(). Тогда все четко будет и писать гораздо меньше. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Khan
Зарегистрирован: 10.05.2012
Сообщения: 29
|
000 писал(а): |
Я прекрасно вижу картинки.
Но вообще в твоем случае если надо тейк 1% то правильнее использовать ApplyStop(). Тогда все четко будет и писать гораздо меньше. |
С ApplyStop у меня почему-то не получилось запустить режим SetBacktestMode(backtestRegularRaw);
Да и больше я верю своему тейку. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
|