Автор |
Сообщение |
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
000, хух, спасибищще! подправил, подкрутил по твоему примеру и свой код в рабочее состояние привёл. балансирует теперь. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
итак, я подправил код. вроде как балансировка должна теперь сохранять постоянные доли бумаг в портфеле исходя из эквити, но на самом деле система постепенно выходит в кзш и ведёт себя не так. почему? (см. картинку)
Код: |
//--------------------------------------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
|
Мне никогда не понять почему ты упорно пишешь часть правил входа после CustomBacktestProc и как оно вообще в таком случае работает. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
000 писал(а): |
Мне никогда не понять почему ты упорно пишешь часть правил входа после CustomBacktestProc и как оно вообще в таком случае работает. |
вот тут на 10-й странице Томаш так описал построение кода, я его так и использую.
p.s.: поместил главные правила выше, ничего не изменилось. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Да, действительно. Прошу прощения. Вероятно не важно где писать правила системы до или после. Я писал до....
А зачем такая замороченная система? Просто напиши Short = 1; и все.
Смотрел почему у тебя там вдруг кэш то резко убавляется то резко прибавляется? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
Mechanic
Зарегистрирован: 10.06.2008
Сообщения: 359
|
Ага, не важно. CustomBacktestProc всё равно выполняется во второй фазе теста, так что без разницы, где её писать. |
|
|
Посмотреть профиль Отправить личное сообщение ICQ Number |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
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
|
вот странную закономерность нашел, оставил буфер в 20% на счёте и получил такую эквити. такое ощущение, что эквити (PortEquity = Foreign("~~~EQUITY", "O" )) выдаёт какие-то левые значения, не совсем актуальные. нашел в low-level свои Properties для эквити. погоняю сейчас с ними ещё. |
Последний раз редактировалось: MrDrJOKER (Вс Ноя 24, 2013 12:12 am), всего редактировалось 1 раз |
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
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
|
000 писал(а): |
Вместо этого
|
для точности расчётов. ТФ рабочий - 30 мин и кто его знал, как low-level себя вести будет. поэтому перестраховался.
так, использовал bo.Equity и эквити начало считать правильно, наконец. буфер сохраняется, почти всегда)
Код: |
diff = val_yyy - 0.33 * bo.Equity ; |
но результаты не те, что должны были быть. блин. где-то косяки
edit: проверяю в ручную detailed report сделок и вижу, что размеры позиций очень сильно расходятся и со временем становятся совсем не 1 к 2. т.е. общий размер всех позиций правильный(90% портфеля), а разделение капитала по позициям с громадными перекосами идёт. что ж такое? |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Я не разобрался. А вот эта конструкция
bo.ScaleTrade( bar, pos.Symbol, diff < 0, price, abs( diff ) );
может как уменьшать так и увеличивать позицию? И сайз задается конечный или на сколько надо изменить? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
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
|
Подумалось. А у тебя в настройках АА включена опция Pad and align to reference symbol ? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
000 писал(а): |
Подумалось. А у тебя в настройках АА включена опция Pad and align to reference symbol ? |
выключена.
в 9.30 в обоих иструментах точно есть бары.
попробуй прогнать мой код у себя на любых инструментах пожалуйста. сохранится ли баланс инструментов где-то в середине report-а?
мне что-то плохо верится, что ами так глючит. |
Последний раз редактировалось: MrDrJOKER (Пн Ноя 25, 2013 1:31 pm), всего редактировалось 1 раз |
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
А всетаки включи на всякий пожарный. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
|