Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 Buy и Sell на одном баре и пропуск входов при тесте портфеля Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
Khan



Зарегистрирован: 10.05.2012
Сообщения: 29

СообщениеДобавлено: Чт Янв 02, 2014 7:53 am Ответить с цитатой Вернуться к началу

Тестировал портфель тикеров и набрел на проблему: портфельный тестер закрывает позицию на баре и сразу же на нем открывает новую. Выходит ерунда, например, если закрываемся по стопу где-нибудь в середине бара или на 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

СообщениеДобавлено: Чт Янв 02, 2014 9:45 am Ответить с цитатой Вернуться к началу

Собственно в чем вопрос?
Как запретить вход на том баре где был выход?
Код:

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

СообщениеДобавлено: Пт Янв 03, 2014 12:37 am Ответить с цитатой Вернуться к началу

Не работает, также выходит. Пока получается так (по исходной картинке):
Код:

SCHG Зашли 2 дек по Open ............. Вышли 6 дек по Close
SZO                                    Зашли 6 дек по Open ............. Вышли 17 дек по Close

Денег-то не было до вечера 6, получается ерунда, двойная позиция в течение дня. Не пойму, как сдвинуть вход на 7 декабря.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Сб Янв 04, 2014 12:01 am Ответить с цитатой Вернуться к началу

Думал, думал. Походу не используя адвансед интерфейс никак не обойтись.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Khan



Зарегистрирован: 10.05.2012
Сообщения: 29

СообщениеДобавлено: Сб Янв 04, 2014 2:51 am Ответить с цитатой Вернуться к началу

000 писал(а):
Думал, думал. Походу не используя адвансед интерфейс никак не обойтись.
Вот жеж. Не годится амишка для портфельных тестов без переделки. Попробую переделать, получится - отпишу.
Посмотреть профиль Отправить личное сообщение
Khan



Зарегистрирован: 10.05.2012
Сообщения: 29

СообщениеДобавлено: Чт Янв 16, 2014 5:04 pm Ответить с цитатой Вернуться к началу

Тех поддержка предложила в качестве решения установить следующую опцию SetOption("SettlementDelay", 1 ); Частично это помогает.

Вообще, разбираясь с портфельным тестером, начинаю разочаровываться в амишке. Для отдельных тикеров - все отлично, но с портфелем как-то сложно. Их метод: сначала расставили сигналы, убрали лишние и лишь потом включили портфельный тестер в отдельных случаях косячит. Ну или я пока не понимаю как это дело правильно настроить. Всплыла еще одна проблема, напишу попозже, может кто встречался.
Посмотреть профиль Отправить личное сообщение
fujis84



Зарегистрирован: 07.01.2014
Сообщения: 56

СообщениеДобавлено: Пт Янв 17, 2014 4:02 am Ответить с цитатой Вернуться к началу

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;


Image


sig.PosSize = 0; -> альтернатива -> sig.Price = -1; // this marks the signal to be skipped
Посмотреть профиль Отправить личное сообщение
Khan



Зарегистрирован: 10.05.2012
Сообщения: 29

СообщениеДобавлено: Пт Янв 17, 2014 6:44 am Ответить с цитатой Вернуться к началу

fujis84 писал(а):
... нет проблем вообще

Спасибо, мне неохота было в custom backtester лезть, хотел отделаться малой кровью. Там-то можно написать все что угодно.
Посмотреть профиль Отправить личное сообщение
Khan



Зарегистрирован: 10.05.2012
Сообщения: 29

СообщениеДобавлено: Пт Янв 17, 2014 3:07 pm Ответить с цитатой Вернуться к началу

Напишу сюда еще один вопрос, чтобы темы не плодить. Тестирую системку: входим на каждом баре, выходим по 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

СообщениеДобавлено: Пт Янв 17, 2014 4:36 pm Ответить с цитатой Вернуться к началу

Ну разумеется.
У тебя в цикле покупка считается на одном баре, а реально в АА она происходит на другом баре. При этом в коде про это ничего не известно. При расчете тейка надо плясать от реальной сделки.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Khan



Зарегистрирован: 10.05.2012
Сообщения: 29

СообщениеДобавлено: Пт Янв 17, 2014 7:16 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Ну разумеется.
У тебя в цикле покупка считается на одном баре, а реально в АА она происходит на другом баре. При этом в коде про это ничего не известно. При расчете тейка надо плясать от реальной сделки.

Дык, у Томаша везде написано что бэктестер надо переделывать для какаих-то мега-сложных систем, а для средних трейдеров и так сойдет. Здесь же элементарные стопы и тейки, а уже надо править логику. Поэтому я и удивляюсь, подумалось, что мне понимания стандартного AFL не хватает.

А картинки видно в предыдущем посте? Вроде прикреплял их, а сейчас не вижу.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


Зарегистрирован: 10.12.2007
Сообщения: 9106

СообщениеДобавлено: Пт Янв 17, 2014 8:43 pm Ответить с цитатой Вернуться к началу

Я прекрасно вижу картинки.
Но вообще в твоем случае если надо тейк 1% то правильнее использовать ApplyStop(). Тогда все четко будет и писать гораздо меньше.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Khan



Зарегистрирован: 10.05.2012
Сообщения: 29

СообщениеДобавлено: Пт Янв 17, 2014 10:09 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Я прекрасно вижу картинки.
Но вообще в твоем случае если надо тейк 1% то правильнее использовать ApplyStop(). Тогда все четко будет и писать гораздо меньше.
С ApplyStop у меня почему-то не получилось запустить режим SetBacktestMode(backtestRegularRaw);
Да и больше я верю своему тейку. Wink
Посмотреть профиль Отправить личное сообщение
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen