Автор |
Сообщение |
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
сабж.
нужная инфа:
http://www.amibroker.com/guide/a_custombacktest.html
http://www.amibroker.com/docs/Houston2.pdf
http://www.amibroker.org/userkb/2008/03/16/amibroker-custom-backtester-interface-2/
сделал пока такую заготовку только на открытие позиций, но что-то они даже не открываются нормально.
Код: |
//For 1 min timeframe!!!
//----------------------------MM---------------------------------------
Capital = 100000; // Initial Capital $100,000
Margin = 100;
// Position Sizing
PercentCapitalPerTrade = 100; // ie $250 out of a $10K account
SetPositionSize(PercentCapitalPerTrade*100/Margin,spsPercentOfEquity);
// Initial Trade Parameters
SetOption("InitialEquity", Capital );
SetOption("AccountMargin", Margin); // CFD trading requiring 1 % margin
//--------------------------------------Vspomogateljnie linii kanalov, peremennie i optimizatsiya-----------------------
SetTradeDelays(0,0,0,0);
all_portfolio = 5000;
open_pos_xxx = 0;
open_pos_yyy = 0;
//----------------------------------- BUY, SELL, SHORT, COVER ---------------------------------
SetOption("UseCustomBacktestProc", True );
SetCustomBacktestProc("");// Start of custom backtest procedure
if ( Status("action") == actionPortfolio )
{
bo = GetBacktesterObject();
bo.PreProcess(); // Initialize backtester
for( bar=0; bar < BarCount; bar++ )
{
bo.ProcessTradeSignals( bar ); CurEquity = bo.Equity;
for( pos = bo.GetFirstOpenPos(); pos; pos = bo.GetNextOpenPos() )
{
//pos variable now holds Trade object
if( Name() == "XXX" )
{
if( pos.Shares == 0 )
{
//bo.EnterTrade( bar, Name(), True, pos.GetPrice( bar, "O" ), round( all_portfolio*0.5 / pos.GetPrice( bar, "O" ) ) );
//Short[bar] = 1;
}
}
if( Name() == "YYY" )
{
if( pos.Shares == 0 )
{
//bo.EnterTrade( bar, Name(), True, pos.GetPrice( bar, "O" ), round( all_portfolio*0.5 / pos.GetPrice( bar, "O" ) ) );
//Short[bar] = 1;
}
}
}
}
bo.PostProcess(); // Finalize backtester
}
//open first position
if( Name() == "XXX" )
{
if( open_pos_xxx == 1 )
{
Short = 0;
}
else
{
SetPositionSize( round( all_portfolio*0.5 / LastValue( O ) ) , 4 );
Short = 1;
open_pos_xxx = 1;
}
}
//open first position
if( Name() == "YYY" )
{
if( open_pos_yyy == 1 )
{
Short = 0;
}
else
{
SetPositionSize( round( all_portfolio*0.5 / LastValue( O ) ) , 4 );
Short = 1;
open_pos_yyy = 1;
}
}
Buy = Sell = Cover = 0;
BuyPrice = SellPrice = ShortPrice = CoverPrice = Open;
|
не хочет. открывает позиции по одной бумаге, да и размер позиции не тот.
где косяк? |
Последний раз редактировалось: MrDrJOKER (Пн Ноя 04, 2013 4:48 am), всего редактировалось 2 раз(а) |
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
А опиши словами что хотел. Я не слишком силен в адвансед интерфейсе и по коду понять не смог. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
000 писал(а): |
А опиши словами что хотел. Я не слишком силен в адвансед интерфейсе и по коду понять не смог. |
да там по сути пока вся стратегия вот тут находится:
Код: |
//open first position
if( Name() == "XXX" )
{
if( open_pos_xxx == 1 )
{
Short = 0;
}
else
{
SetPositionSize( round( all_portfolio*0.5 / LastValue( O ) ) , 4 );
Short = 1;
open_pos_xxx = 1;
}
}
//open first position
if( Name() == "YYY" )
{
if( open_pos_yyy == 1 )
{
Short = 0;
}
else
{
SetPositionSize( round( all_portfolio*0.5 / LastValue( O ) ) , 4 );
Short = 1;
open_pos_yyy = 1;
}
}
Buy = Sell = Cover = 0;
BuyPrice = SellPrice = ShortPrice = CoverPrice = Open;
|
остальное - заготовка для ребалансировки портфеля. она по сути пуста и ничего не исполняет.
я так понимаю, в нормальном афл нельзя узнать величину набраной позиции на баре? |
Последний раз редактировалось: MrDrJOKER (Ср Ноя 06, 2013 12:10 am), всего редактировалось 1 раз |
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вот это меня и удиило. Я несколько раз использовал адвансед нтерфейс и всегда сначала пишутся общие сигналы а потом они шлифуются в CustomBacktestProc. а у тебя как то наоборот. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
MrDrJOKER писал(а): |
я так понимаю, в нормальном афл нельзя узнать величину набраной позиции на баре? |
В смысле сколько разных бумаг куплено/продано? |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
000 писал(а): |
MrDrJOKER писал(а): |
я так понимаю, в нормальном афл нельзя узнать величину набраной позиции на баре? |
В смысле сколько разных бумаг куплено/продано? |
да, или на какую сумму.
Код: |
Вот это меня и удиило. Я несколько раз использовал адвансед нтерфейс и всегда сначала пишутся общие сигналы а потом они шлифуются в CustomBacktestProc. а у тебя как то наоборот. |
думал сначала, что всё там писать надо, пока туториал не нашел) |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
MrDrJOKER писал(а): |
000 писал(а): |
MrDrJOKER писал(а): |
я так понимаю, в нормальном афл нельзя узнать величину набраной позиции на баре? |
В смысле сколько разных бумаг куплено/продано? |
да, или на какую сумму.
|
Да. Из обычного AFL этого узнать нельзя. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
000 писал(а): |
Вот это меня и удиило. Я несколько раз использовал адвансед нтерфейс и всегда сначала пишутся общие сигналы а потом они шлифуются в CustomBacktestProc. а у тебя как то наоборот. |
а что с моей уже написаной стратегией не так?
Код: |
//open first position
if( Name() == "XXX" )
{
if( open_pos_xxx == 1 )
{
Short = 0;
}
else
{
SetPositionSize( round( all_portfolio*0.5 / Open ) , 4 );
Short = 1;
open_pos_xxx = 1;
}
}
//open first position
if( Name() == "YYY" )
{
if( open_pos_yyy == 1 )
{
Short = 0;
}
else
{
SetPositionSize( round( all_portfolio*0.5 / Open ) , 4 );
Short = 1;
open_pos_yyy = 1;
}
}
Buy = Sell = Cover = 0;
BuyPrice = SellPrice = ShortPrice = CoverPrice = Open;
|
всё, разобрался, денег мало на портфель выделил) |
|
|
Посмотреть профиль Отправить личное сообщение |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
что-то я парюсь. нужно позу по одной бумаге балансировать по позе в другой бумаге и иногда вторую по заданному объёму.
как запоминать кол-во купленых бумаг и объём другой бумаги?
пытаюсь сохранить кол-во бумаг в переменные shares_xxx и shares_yyy, но этот код не ребалансирует ничего(правила на вход те же, добавил ребалансировки в mid-level):
Код: |
//--------------------------------------help-chanel lines, variables and optimisation-----------------------
SetTradeDelays(0,0,0,0);
all_portfolio = 2000000000;
trigger_pos_xxx = 0;
trigger_pos_yyy = 0;
shares_xxx = 0;
shares_yyy = 0;
//----------------------------------- BUY, SELL, SHORT, COVER ---------------------------------
SetOption("UseCustomBacktestProc", True );
SetCustomBacktestProc("");// Start of custom backtest procedure
if ( Status("action") == actionPortfolio )
{
bo = GetBacktesterObject();
bo.PreProcess(); // Initialize backtester
for( bar=0; bar < BarCount; bar++ )
{
bo.ProcessTradeSignals( bar ); CurEquity = bo.Equity;
for( pos = bo.GetFirstOpenPos(); pos; pos = bo.GetNextOpenPos() )
{
if( Name() == "YYY" AND pos.Shares != 0 )
{
shares_yyy = pos.Shares;
//bo.EnterTrade( bar, Name(), True, pos.GetPrice( bar, "O" ), round( all_portfolio*0.5 / pos.GetPrice( bar, "O" ) ) );
//Short[bar] = 1;
val_yyy = pos.GetPositionValue();
diff = val_yyy - round( 0.3333333333 * all_portfolio / pos.GetPrice( bar, "O" ) ) ;
if( abs( diff ) > pos.GetPrice( bar, "O" ) AND TimeNum() == 093000 AND DayOfWeek() == 1 )
{
// sell or buy xxx (depends on diff)
bo.ScaleTrade( bar, pos.Symbol, diff < 0, pos.GetPrice( bar, "O" ), abs( diff ) );
}
}
//pos variable holds now Trade object
if( Name() == "XXX" AND pos.Shares != 0 )
{
shares_xxx = pos.Shares;
//bo.EnterTrade( bar, Name(), True, pos.GetPrice( bar, "O" ), round( all_portfolio*0.5 / pos.GetPrice( bar, "O" ) ) );
val_xxx = pos.GetPositionValue();
val_yyy = shares_yyy * Foreign("YYY", "Open");
diff = val_xxx - val_yyy ;
if( abs( diff ) > pos.GetPrice( bar, "O" ) AND TimeNum() == 093100 )
{
// sell or buy xxx (depends on diff)
bo.ScaleTrade( bar, pos.Symbol, diff < 0, pos.GetPrice( bar, "O" ), abs( diff ) );
}
}
}
}
bo.PostProcess(); // Finalize backtester
}
//open first position
if( Name() == "YYY" )
{
if( trigger_pos_yyy == 1 )
{
Short = 0;
}
else
{
SetPositionSize( round( 0.3333333333 * all_portfolio / Open ) , 4 ); //0.333 of portfolio value
Short = 1 AND ( TimeNum() >= 093000 AND TimeNum() < 160000 ) ;
trigger_pos_yyy = 1;
}
}
//open first position
if( Name() == "XXX" )
{
if( trigger_pos_xxx == 1 )
{
Short = 0;
}
else
{
SetPositionSize( round( 0.6666666666 * all_portfolio / Open ) , 4 ); //0.666 of portfolio value
Short = 1 AND ( TimeNum() >= 093000 AND TimeNum() < 160000 ) ;
trigger_pos_xxx = 1;
}
}
Buy = Sell = Cover = 0;
BuyPrice = SellPrice = ShortPrice = CoverPrice = Open;
|
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Как то я вопроса не понял.
Цитата: |
как запоминать кол-во купленых бумаг
|
А это что?
Код: |
shares_yyy = pos.Shares; |
|
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
000 писал(а): |
Как то я вопроса не понял.
Цитата: |
как запоминать кол-во купленых бумаг
|
А это что?
Код: |
shares_yyy = pos.Shares; |
|
да, сложнее было получить кол-во бумаг в противоположной позиции. об этом я говорил. я их сейчас просто сохранил в переменные при наборе основной позиции.
вроде подправил, всё запомнил, но не работает, зараза. нет ребалансировки. что не так?
вот актуальный, подправленый код:
Код: |
//--------------------------------------help-chanel lines, variables and optimisation-----------------------
SetTradeDelays(0,0,0,0);
all_portfolio = 200000000;
trigger_pos_xxx = 0;
trigger_pos_yyy = 0;
shares_xxx = 0;
shares_yyy = 0;
val_xxx = 0;
val_yyy = 0;
buyprice_yyy = 0;
//----------------------------------- BUY, SELL, SHORT, COVER ---------------------------------
SetOption("UseCustomBacktestProc", True );
SetCustomBacktestProc("");// Start of custom backtest procedure
if ( Status("action") == actionPortfolio )
{
bo = GetBacktesterObject();
bo.PreProcess(); // Initialize backtester
for( bar=0; bar < BarCount; bar++ )
{
bo.ProcessTradeSignals( bar ); CurEquity = bo.Equity;
for( pos = bo.GetFirstOpenPos(); pos; pos = bo.GetNextOpenPos() )
{
if( Name() == "YYY" AND pos.Shares != 0 )
{
//shares_yyy = pos.Shares;
//val_yyy = pos.GetPositionValue();
val_yyy = shares_yyy * pos.GetPrice( bar, "O" );
diff = val_yyy - shares_yyy * buyprice_yyy ; //become diff between first position size and actual
if( abs( diff ) > pos.GetPrice( bar, "O" ) AND TimeNum() == 093000 AND DayOfWeek() == 1 )
{
// sell or buy xxx (depends on diff)
//bo.ScaleTrade( bar, pos.Symbol, diff < 0, pos.GetPrice( bar, "O" ), abs( diff ) );
if( diff < 0)
bo.ScaleTrade( bar, pos.Symbol, True, pos.GetPrice( bar, "O" ), abs( diff ) );
else
bo.ScaleTrade( bar, pos.Symbol, False, pos.GetPrice( bar, "O" ), abs( diff ) );
}
}
//pos variable holds now Trade object
if( Name() == "XXX" AND pos.Shares != 0 )
{
//shares_xxx = pos.Shares;
//val_xxx = pos.GetPositionValue();
val_xxx = shares_xxx * pos.GetPrice( bar, "O" );
val_yyy = shares_yyy * Foreign("YYY", "Open");
diff = val_xxx - val_yyy ;
if( abs( diff ) > pos.GetPrice( bar, "O" ) AND TimeNum() == 093100 )
{
// sell or buy xxx (depends on diff)
bo.ScaleTrade( bar, pos.Symbol, diff < 0, pos.GetPrice( bar, "O" ), abs( diff ) );
}
}
}
}
bo.PostProcess(); // Finalize backtester
}
//open first position
if( Name() == "YYY" )
{
if( trigger_pos_yyy == 1 )
{
Short = 0;
}
else
{
SetPositionSize( round( 0.3333333333 * all_portfolio / Open ) , 4 ); //0.333 of portfolio value
Short = 1 AND ( TimeNum() >= 093000 AND TimeNum() < 160000 ) ;
trigger_pos_yyy = 1;
shares_yyy = round( 0.3333333333 * all_portfolio / Open );
buyprice_yyy = Open;
}
}
//open first position
if( Name() == "XXX" )
{
if( trigger_pos_xxx == 1 )
{
Short = 0;
}
else
{
SetPositionSize( round( 0.6666666666 * all_portfolio / Open ) , 4 ); //0.666 of portfolio value
Short = 1 AND ( TimeNum() >= 093000 AND TimeNum() < 160000 ) ;
trigger_pos_xxx = 1;
shares_xxx = round( 0.6666666666 * all_portfolio / Open );
}
}
Buy = Sell = Cover = 0;
BuyPrice = SellPrice = ShortPrice = CoverPrice = Open;
|
|
|
|
Посмотреть профиль Отправить личное сообщение |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
плюнул на low-mode переписал так же в обычном AFL.
ничего не изменилось, нет ребалансировки.
Код: |
//--------------------------------------help-chanel lines, variables and optimisation-----------------------
SetTradeDelays(0,0,0,0);
all_portfolio = 75000000;
trigger_pos_xxx = 0;
trigger_pos_yyy = 0;
shares_xxx = 0;
shares_yyy = 0;
val_xxx = 0;
val_yyy = 0;
buyprice_yyy = 0;
//----------------------------------- BUY, SELL, SHORT, COVER ---------------------------------
//SetOption( „PortfolioReportMode“, 1 );
//choose right ticker
if( Name() == "YYY" )
{
//rebalance opened position
if( trigger_pos_yyy == 1 )
{
val_yyy = shares_yyy * Open;
diff = val_yyy - round( 0.3333333333 * all_portfolio ) ; //become diff between target position size and actual
if( abs( diff ) > Open AND TimeNum() == 093000 AND DayOfWeek() == 1 )
{
// sell or buy yyy (depends on diff)
if( diff > 0 )
{
Short = sigScaleOut;
SetPositionSize( round( diff / Open ) , spsShares );
}
else
{
Short = sigScaleIn;
SetPositionSize( round( diff / Open ) , spsShares );
}
}
}
//open first position
else
{
SetPositionSize( round( 0.3333333333 * all_portfolio / Open ) , 4 ); //0.333 of portfolio value
Short = TimeNum() >= 093000 AND TimeNum() < 160000 ;
trigger_pos_yyy = 1;
shares_yyy = round( 0.3333333333 * all_portfolio / Open );
buyprice_yyy = Open;
}
}
//choose right ticker
if( Name() == "XXX" )
{
//rebalance opened position
if( trigger_pos_xxx == 1 )
{
val_xxx = shares_xxx * Open;
val_yyy = shares_yyy * Foreign("YYY", "Open");
diff = val_xxx - val_yyy ; //become diff between target position size and actual
// sell or buy yyy (depends on diff)
if( abs( diff ) > Open AND TimeNum() == 093000 )
{
// sell or buy yyy (depends on diff)
if( diff > 0 )
{
Short = sigScaleOut;
SetPositionSize( round( diff / Open ) , spsShares );
}
else
{
Short = sigScaleIn;
SetPositionSize( round( diff / Open ) , spsShares );
}
}
}
//open first position
else
{
SetPositionSize( round( 0.6666666666 * all_portfolio / Open ) , 4 ); //0.666 of portfolio value
Short = TimeNum() >= 093000 AND TimeNum() < 160000 ;
trigger_pos_xxx = 1;
shares_xxx = round( 0.6666666666 * all_portfolio / Open );
}
}
Sell = Cover = Buy = 0;
BuyPrice = SellPrice = ShortPrice = CoverPrice = Open;
|
|
Последний раз редактировалось: MrDrJOKER (Вт Ноя 19, 2013 12:14 am), всего редактировалось 1 раз |
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Напиши просто по русски что именно хочешь. Больно муторно в чужом коде разбираться. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
MrDrJOKER
Зарегистрирован: 22.06.2009
Сообщения: 489
|
000 писал(а): |
Напиши просто по русски что именно хочешь. Больно муторно в чужом коде разбираться. |
смотри, есть две бумаги. нужно обе зашортить, а потом каждый день ребалансировать одну бумагу по второй(грубо говоря). т.е. чтоб позиции становились равной величины. |
|
|
Посмотреть профиль Отправить личное сообщение |
|
000
Site Admin
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Вот так
Код: |
SetTradeDelays(0,0,0,0);
val_xxx = 0;
val_yyy = 0;
Buy = DayOfWeek() < Ref(DayOfWeek(), -1);
Sell = DayOfWeek() == 4 AND Day() != Ref(Day(), -1);
Short = Cover = 0;
BuyPrice = SellPrice = ShortPrice = CoverPrice = Open;
SetPositionSize(10000, 1);
//----------------------------------- BUY, SELL, SHORT, COVER ---------------------------------
SetOption("UseCustomBacktestProc", True );
if ( Status("action") == actionPortfolio )
{
bo = GetBacktesterObject();
bo.PreProcess(); // Initialize backtester
for( bar=0; bar < BarCount; bar++ )
{
bo.ProcessTradeSignals( bar );
//CurEquity = bo.Equity;
for( pos = bo.GetFirstOpenPos(); pos; pos = bo.GetNextOpenPos() ) // просматриваем все открытые позиции
{
if( pos.Symbol == "LKOH") // символ по которому делаем баланс
{
val_yyy = pos.GetPositionValue(); // запоминаем размер позиции
}
}
for( pos = bo.GetFirstOpenPos(); pos; pos = bo.GetNextOpenPos() ) // просматриваем все открытые позиции второй раз
{
if( pos.Symbol == "SBER") // символ который балансируем
{
price = pos.GetPrice( bar, "O" );
val_xxx = pos.GetPositionValue();
bo.ScaleTrade( bar, pos.Symbol, 1, price, val_yyy - val_xxx);
}
}
}
bo.PostProcess(); // Finalize backtester
}
|
Чето он там пытается балансировать. Только не разобрался так или не так, но факт в том, что он меняет позицию по SBER иногда. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
|
|
|
Следующая тема
Предыдущая тема
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы не можете скачивать файлы
|
|