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



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

СообщениеДобавлено: Вт Ноя 19, 2013 5:15 am Ответить с цитатой Вернуться к началу

000, хух, спасибищще! подправил, подкрутил по твоему примеру и свой код в рабочее состояние привёл. балансирует теперь. Smile
Посмотреть профиль Отправить личное сообщение
MrDrJOKER



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

СообщениеДобавлено: Сб Ноя 23, 2013 9:16 pm Ответить с цитатой Вернуться к началу

итак, я подправил код. вроде как балансировка должна теперь сохранять постоянные доли бумаг в портфеле исходя из эквити, но на самом деле система постепенно выходит в кзш и ведёт себя не так. почему? (см. картинку)
Код:
//--------------------------------------help-chanel lines, variables and optimisation-----------------------
SetTradeDelays(0,0,0,0); 
rebalance_time = 093000;
trigger_pos_xxx = 0;
trigger_pos_yyy = 0;
val_xxx = 0;
val_yyy = 0;
 
//----------------------------------- BUY, SELL, SHORT, COVER ---------------------------------
//SetOption( "PortfolioReportMode", 1 ); 
SetOption("UseCustomBacktestProc", True );
SetCustomBacktestProc("");//  Start of custom backtest procedure
 
if ( Status("action") == actionPortfolio )
{
   bo = GetBacktesterObject();
   bo.PreProcess(); // Initialize backtester
   
   TN = TimeNum();
   DoW = DayOfWeek();
   PortEquity = Foreign("~~~EQUITY", "O" );
 
   for( bar=0; bar < BarCount; bar++ )
   {
      bo.ProcessTradeSignals( bar ); 
      for( pos = bo.GetFirstOpenPos(); pos; pos = bo.GetNextOpenPos() )
      {   
         if( pos.Symbol == "YYY" AND TN[bar] == rebalance_time )
         {
            price = pos.GetPrice( bar, "O" );
            val_yyy = pos.GetPositionValue();
            diff = val_yyy - 0.33 * PortEquity[bar] ;
 
            if( abs( diff ) > price )
               // sell or buy xxx (depends on diff)
               bo.ScaleTrade( bar, pos.Symbol, diff < 0, price, abs( diff ) );
         }
      }
      for( pos = bo.GetFirstOpenPos(); pos; pos = bo.GetNextOpenPos() )
      { 
         //pos variable holds now Trade object
         if( pos.Symbol == "XXX" AND TN[bar] == rebalance_time )
         {
            //shares_xxx = pos.Shares;
            price = pos.GetPrice( bar, "O" );
            val_xxx = pos.GetPositionValue(); 
             diff = val_xxx - 0.66 * PortEquity[bar] ;

            if( abs( diff ) > price )
               // sell or buy xxx (depends on diff)
               bo.ScaleTrade( bar, pos.Symbol, diff < 0, price, abs( diff ) );
         }
      }
   }
   bo.PostProcess(); // Finalize backtester
}
 
//open first position
if( Name() == "YYY" )
{
   if( trigger_pos_yyy == 1 )
   {
      Short = 0;
   }
   else
   {
      PercentCapitalPerTrade =  33 ;
      SetPositionSize( PercentCapitalPerTrade, spsPercentOfEquity ); //izmenyaetsya s kazhdim izmeneniem portfeljnogo equity
      Short = TimeNum() == 093000 ;
      trigger_pos_yyy = 1;
   }
}
 
//open first position
if( Name() == "XXX" )
{
   if( trigger_pos_xxx == 1 )
   {
      Short = 0;
   }
   else
   {
      PercentCapitalPerTrade =  66 ;
      SetPositionSize( PercentCapitalPerTrade, spsPercentOfEquity );
      Short = TimeNum() == 093000 ;
      trigger_pos_xxx = 1;
   }
}
 
Buy = Sell = Cover = 0;
BuyPrice = SellPrice = ShortPrice = CoverPrice = Open; 
 
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Сб Ноя 23, 2013 9:33 pm Ответить с цитатой Вернуться к началу

Мне никогда не понять почему ты упорно пишешь часть правил входа после CustomBacktestProc и как оно вообще в таком случае работает.

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



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

СообщениеДобавлено: Сб Ноя 23, 2013 9:37 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Мне никогда не понять почему ты упорно пишешь часть правил входа после CustomBacktestProc и как оно вообще в таком случае работает.

вот тут на 10-й странице Томаш так описал построение кода, я его так и использую.

p.s.: поместил главные правила выше, ничего не изменилось.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Сб Ноя 23, 2013 10:40 pm Ответить с цитатой Вернуться к началу

Да, действительно. Прошу прощения. Вероятно не важно где писать правила системы до или после. Я писал до.... Sad

А зачем такая замороченная система? Просто напиши Short = 1; и все.
Смотрел почему у тебя там вдруг кэш то резко убавляется то резко прибавляется?

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



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

СообщениеДобавлено: Сб Ноя 23, 2013 10:47 pm Ответить с цитатой Вернуться к началу

Ага, не важно. CustomBacktestProc всё равно выполняется во второй фазе теста, так что без разницы, где её писать.
Посмотреть профиль Отправить личное сообщение ICQ Number
MrDrJOKER



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

СообщениеДобавлено: Сб Ноя 23, 2013 11:13 pm Ответить с цитатой Вернуться к началу

000 писал(а):

А зачем такая замороченная система? Просто напиши Short = 1; и все.
Смотрел почему у тебя там вдруг кэш то резко убавляется то резко прибавляется?


стратегия такая. нужно постоянно удерживать равномерные позы.
вот я и вычисляю разницу между нужной величиной и актуальной:
Код:
val_yyy = pos.GetPositionValue();
diff = val_yyy - 0.33 * PortEquity[bar] ;

а потом на её величину и изменяю размер позиции и так с обоими бумагами
Код:
if( abs( diff ) > price )
               // sell or buy xxx (depends on diff)
               bo.ScaleTrade( bar, pos.Symbol, diff < 0, price, abs( diff ) );


где просто Short = 1; написать?
Посмотреть профиль Отправить личное сообщение
MrDrJOKER



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

СообщениеДобавлено: Сб Ноя 23, 2013 11:59 pm Ответить с цитатой Вернуться к началу

вот странную закономерность нашел, оставил буфер в 20% на счёте и получил такую эквити. такое ощущение, что эквити (PortEquity = Foreign("~~~EQUITY", "O" )) выдаёт какие-то левые значения, не совсем актуальные. нашел в low-level свои Properties для эквити. погоняю сейчас с ними ещё.


Последний раз редактировалось: MrDrJOKER (Вс Ноя 24, 2013 12:12 am), всего редактировалось 1 раз
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Вс Ноя 24, 2013 12:10 am Ответить с цитатой Вернуться к началу

MrDrJOKER писал(а):

где просто Short = 1; написать?

Вместо этого
Код:

//open first position
if( Name() == "YYY" )
{
   if( trigger_pos_yyy == 1 )
   {
      Short = 0;
   }
   else
   {
      PercentCapitalPerTrade =  33 ;
      SetPositionSize( PercentCapitalPerTrade, spsPercentOfEquity ); //izmenyaetsya s kazhdim izmeneniem portfeljnogo equity
      Short = TimeNum() == 093000 ;
      trigger_pos_yyy = 1;
   }
}
 
//open first position
if( Name() == "XXX" )
{
   if( trigger_pos_xxx == 1 )
   {
      Short = 0;
   }
   else
   {
      PercentCapitalPerTrade =  66 ;
      SetPositionSize( PercentCapitalPerTrade, spsPercentOfEquity );
      Short = TimeNum() == 093000 ;
      trigger_pos_xxx = 1;
   }
}

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



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

СообщениеДобавлено: Вс Ноя 24, 2013 1:17 am Ответить с цитатой Вернуться к началу

000 писал(а):

Вместо этого


для точности расчётов. ТФ рабочий - 30 мин и кто его знал, как low-level себя вести будет. поэтому перестраховался.

так, использовал bo.Equity и эквити начало считать правильно, наконец. буфер сохраняется, почти всегда)
Код:
diff = val_yyy - 0.33 * bo.Equity ;


но результаты не те, что должны были быть. блин. где-то косяки Evil or Very Mad

edit: проверяю в ручную detailed report сделок и вижу, что размеры позиций очень сильно расходятся и со временем становятся совсем не 1 к 2. т.е. общий размер всех позиций правильный(90% портфеля), а разделение капитала по позициям с громадными перекосами идёт. что ж такое?
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Вс Ноя 24, 2013 11:21 pm Ответить с цитатой Вернуться к началу

Я не разобрался. А вот эта конструкция
bo.ScaleTrade( bar, pos.Symbol, diff < 0, price, abs( diff ) );
может как уменьшать так и увеличивать позицию? И сайз задается конечный или на сколько надо изменить?

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



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

СообщениеДобавлено: Пн Ноя 25, 2013 1:05 am Ответить с цитатой Вернуться к началу

000 писал(а):
Я не разобрался. А вот эта конструкция
bo.ScaleTrade( bar, pos.Symbol, diff < 0, price, abs( diff ) );
может как уменьшать так и увеличивать позицию? И сайз задается конечный или на сколько надо изменить?


да. если на месте diff < 0 True позиция увеличивается, если False - уменьшается. сайз - на сколько нужно скалировать. хотя у Томаша не особо разжевано было, я по примерам ориентировался.

вот что у Томаша:
Цитата:

long ScaleTrade(long Bar, string Symbol, bool bIncrease, float Price, float PosSize, [optional] variant Deposit)

Low-level method that scales trade on any symbol. This method searches open trade list and if there is no open trade on given symbol it does nothing. Optional Deposit parameter specifies margin deposit for futures, if not given then Price parameter is used.


тут на 26-й странице как раз такой пример, тоже с ребалансировкой, на 5 % от эквити.
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Пн Ноя 25, 2013 10:08 am Ответить с цитатой Вернуться к началу

Подумалось. А у тебя в настройках АА включена опция Pad and align to reference symbol ?

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



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

СообщениеДобавлено: Пн Ноя 25, 2013 1:25 pm Ответить с цитатой Вернуться к началу

000 писал(а):
Подумалось. А у тебя в настройках АА включена опция Pad and align to reference symbol ?


выключена.
в 9.30 в обоих иструментах точно есть бары.

попробуй прогнать мой код у себя на любых инструментах пожалуйста. сохранится ли баланс инструментов где-то в середине report-а?
мне что-то плохо верится, что ами так глючит.


Последний раз редактировалось: MrDrJOKER (Пн Ноя 25, 2013 1:31 pm), всего редактировалось 1 раз
Посмотреть профиль Отправить личное сообщение
000
Site Admin


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

СообщениеДобавлено: Пн Ноя 25, 2013 1:26 pm Ответить с цитатой Вернуться к началу

А всетаки включи на всякий пожарный.

_________________
ceterum censeo carthaginem esse delendam
Удачи. Олег.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



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


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

File Attachment © by Meik Sievertsen