Автор |
Сообщение |
Marcello
Зарегистрирован: 30.05.2015
Сообщения: 69
|
Есть системка с 3 параметрами, которые дают ~6000 комбинаций. На периоде, выбранном для оптимизации, делается около 500 сделок. Можно ли в процессе оптимизации вывести в файл все сделки (то, что выводится в режиме PortfolioReportMode = 0) с указанием значений текущих параметров? Цель: получить все сделки для каждой комбиниции параметров для дальнейшего использования в другом приложении. |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Может попробовать воспользоваться AmiBroker's OLE Automation Object Model
У объекта Analysis есть метод Report....
Analysis.Report( FileName: String ) - saves report to the file or displays it if FileName = "" |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
Marcello
Зарегистрирован: 30.05.2015
Сообщения: 69
|
Analysis. This object is obsolete.
Я думал, что можно как-то использовать статус: https://www.amibroker.com/guide/afl/status.html
Что-то типа
Код: |
if( Status("action") == actionExOptimizePortfolio ) { |
А дальше использовать свойства объекта Trade:
Код: |
string Symbol
float EntryDateTime
float EntryPrice
float ExitDateTime
float ExitPrice
long BarsInTrade |
Вот только как сюда прикрутить вывод текущих значений оптимизируемых параметров? |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Если получается вывести список сделок, то прикрутить вывод параметров вроде не должно доставить проблем. Просто дописать их во время формирования строки. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
Marcello
Зарегистрирован: 30.05.2015
Сообщения: 69
|
Все получилось. Вот фрагмент кода, вдруг кому пригодится:
Код: |
SetCustomBacktestProc("");
if( Status("action") == actionPortfolio ) {
bo = GetBacktesterObject();
bo.Backtest();
logStr = "";
strDiv = "\t";
trade = bo.getFirstTrade();
if ( trade ) fh = fopen( "d:\\" + trade.Symbol + ".txt", "a");
for ( trade = bo.getFirstTrade(); trade; trade = bo.getNextTrade() ) {
logStr = trade.Symbol + strDiv;
logStr = logStr + StrFormat( "%g_%g_%g", BR, BP, SR ) + strDiv; // тут перечислены оптимизируемые параметры
logStr = logStr + DateTimeToStr( trade.EntryDateTime ) + strDiv;
logStr = logStr + StrFormat( "%g", trade.EntryPrice ) + strDiv;
logStr = logStr + DateTimeToStr( trade.ExitDateTime ) + strDiv;
logStr = logStr + StrFormat( "%g", trade.ExitPrice ) + strDiv;
logStr = logStr + StrFormat( "%g", trade.BarsInTrade ) + "\n";
if ( fh ) fputs( logStr, fh ); else _TRACE( "Error" );
}
if ( fh ) fclose( fh );
} |
|
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
max
Зарегистрирован: 01.08.2008
Сообщения: 253
|
круто!
а как можно было бы вывести изменения определенных индикаторов на каждом баре между входом и выходом???
Пример: система вошла на баре 0 и вышла через 5. Хочу вывести клоуз каждого бара и ATR на каждом баре с 0 по 5 включительно - 10 колонок
наверняка есть какое-то готовое решение |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
000
Site Admin
![](images/avatars/183029264847fb5337d4ea4.gif)
Зарегистрирован: 10.12.2007
Сообщения: 9106
|
Ищи в хелпере How to add user-defined metrics to backtest/optimization report
Я сам не очень ориентируюсь, но в случае чего немного подсказать смогу если будут вопросы. |
_________________ ceterum censeo carthaginem esse delendam
Удачи. Олег. |
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
igorgusinffv
Зарегистрирован: 28.04.2023
Сообщения: 1
Откуда: Москва
|
000 писал(а): |
Ищи в хелпере How to add user-defined metrics to backtest/optimization report
Я сам не очень ориентируюсь, но в случае чего немного подсказать смогу если будут вопросы. |
Спасибо! |
|
|
Посмотреть профиль Отправить личное сообщение Посетить сайт автора |
![](images/spacer.gif) |
konstb
Зарегистрирован: 17.11.2019
Сообщения: 8
|
//----- 2 (ФАЗА-2) Блок кода для создания своих показателей тестирования
SetCustomBacktestProc("");
if( Status("action")== actionPortfolio )
{
bo = GetBacktesterObject();
bo.Backtest();
st = bo.GetPerformanceStats(0);
nTrades = 12;
//----- MDD% level
mddPer = 10;//
myNetP_RF_Kr = 100 * st.GetValue("NetProfitPercent") * st.GetValue("RecoveryFactor") * st.GetValue("KRatio");
if (st.GetValue("MaxSystemDrawdownPercent") < -1 * mddPer OR st.GetValue("RecoveryFactor") < 0 OR st.GetValue("KRatio") < 0 ) myNetP_RF_Kr = -1;
bo.AddCustomMetric( "myNetP_RF_Kr", myNetP_RF_Kr );
myNetP_RF = st.GetValue("NetProfitPercent") * st.GetValue("RecoveryFactor") ;
if ( st.GetValue("RecoveryFactor") < 0 ) myNetP_RF = 0;
bo.AddCustomMetric( "myNetP_RF", myNetP_RF );
myNetP_Kr = st.GetValue("NetProfitPercent") * st.GetValue("KRatio") ;
if (st.GetValue("MaxSystemDrawdownPercent") < -1 * mddPer OR st.GetValue("KRatio") < 0 ) myNetP_Kr = 0;
bo.AddCustomMetric( "myNetP_Kr", myNetP_Kr );
myNetP = st.GetValue("NetProfitPercent") ;
if (st.GetValue("MaxSystemDrawdownPercent") < -1 * mddPer ) myNetP = 0;
bo.AddCustomMetric( "myNetP", myNetP );
myNetPTrades = st.GetValue("NetProfitPercent") ;
if (st.GetValue("MaxSystemDrawdownPercent") < -1 * mddPer OR st.GetValue("AllQty") < nTrades ) myNetPTrades = 0;
bo.AddCustomMetric( "myNetPTrades", myNetPTrades );
myRF_Trades = st.GetValue("RecoveryFactor") ;
if (st.GetValue("RecoveryFactor") < 0 OR st.GetValue("AllQty") < nTrades ) myRF_Trades = -1;
bo.AddCustomMetric( "myRF_Trades", myRF_Trades );
//*/
/*
myRF = st.GetValue("RecoveryFactor") ;
if (st.GetValue("MaxSystemDrawdownPercent") < -1 * mddPer OR st.GetValue("RecoveryFactor") < 0 ) myRF = 0;
bo.AddCustomMetric( "myRF", myRF );
//*/
/*
myNetP_RF_Kr = st.GetValue("NetProfitPercent") * st.GetValue("RecoveryFactor") * st.GetValue("KRatio") ;
if (st.GetValue("MaxSystemDrawdownPercent") < -1 * mddPer OR st.GetValue("RecoveryFactor") < 0 OR st.GetValue("KRatio") < 0 ) myNetP_RF_Kr = 0;
bo.AddCustomMetric( "myNetP_RF_Kr", myNetP_RF_Kr );
// */
/*
myNetP_RF = st.GetValue("NetProfitPercent") * st.GetValue("RecoveryFactor") ;
if (st.GetValue("MaxSystemDrawdownPercent") < -1 * mddPer OR st.GetValue("RecoveryFactor") < 0 OR st.GetValue("KRatio") < 0 ) myNetP_RF = 0;
bo.AddCustomMetric( "myNetP_RF", myNetP_RF );
*/
/*
myNetP_RF_RRR = st.GetValue("NetProfitPercent") * st.GetValue("RecoveryFactor") * st.GetValue("RRR") ;
if (st.GetValue("MaxSystemDrawdownPercent") < -1 * mddPer OR st.GetValue("RecoveryFactor") < 0 OR st.GetValue("RRR") < 0 ) myNetP_RF_RRR = 0;
bo.AddCustomMetric( "myNetP_RF_RRR", myNetP_RF_RRR );
//*/
/*
CAR2MDD = st.GetValue("CAR") * st.GetValue("CAR/MDD") ;
if (st.GetValue("CAR") < 0 OR st.GetValue("AllQty") < nTrades) CAR2MDD = 0;
bo.AddCustomMetric( "CAR2MDD", CAR2MDD );
myRF = st.GetValue("RecoveryFactor");
if (st.GetValue("RecoveryFactor") < 0 OR st.GetValue("AllQty") < nTrades) myRF = 0;
bo.AddCustomMetric( "myRF", myRF );
myNetPRF = st.GetValue("NetProfitPercent") * st.GetValue("RecoveryFactor") ;
if (st.GetValue("MaxSystemDrawdownPercent" ) < -1 * mddPer OR st.GetValue("RecoveryFactor") < 0) myNetPRF = 0;
bo.AddCustomMetric( "myNetPRF", myNetPRF );
myNetPRF2 = st.GetValue("NetProfitPercent") * st.GetValue("RecoveryFactor") * st.GetValue("RecoveryFactor") ;
if (st.GetValue("MaxSystemDrawdownPercent") < -1 * mddPer ) myNetPRF2 = 0;
bo.AddCustomMetric( "myNetPRF2", myNetPRF2 );
myNetPRFKr = st.GetValue("NetProfitPercent") * st.GetValue("RecoveryFactor") * st.GetValue("KRatio") ;
if (st.GetValue("MaxSystemDrawdownPercent") < -1 * mddPer OR st.GetValue("RecoveryFactor") < 0 OR st.GetValue("KRatio") < 0 ) myNetPRFKr = 0;
bo.AddCustomMetric( "myNetPRFKr", myNetPRFKr );
myNet = st.GetValue("NetProfit");
if (st.GetValue("MaxSystemDrawdownPercent") < -1 * mddPer) myNet = 0;
bo.AddCustomMetric( "myNet", myNet );
myNetP = st.GetValue("NetProfitPercent");
if (st.GetValue("MaxSystemDrawdownPercent") < -1 * mddPer ) myNetP = 0;//OR st.GetValue("AllQty") < nTrades
bo.AddCustomMetric( "myNetP", myNetP );
myUi = st.GetValue("UlcerPerformanceIndex");
if (st.GetValue("MaxSystemDrawdownPercent") < -1 * mddPer) myUi = 0;
bo.AddCustomMetric( "myUi", myUi );
myKr = st.GetValue("KRatio");
if (st.GetValue("MaxSystemDrawdownPercent") < -1 * mddPer OR st.GetValue("AllQty") < nTrades) myKr = 0;
bo.AddCustomMetric( "myKr", myKr );
myNetPKr = st.GetValue("NetProfitPercent") * st.GetValue("KRatio") ;
if (st.GetValue("MaxSystemDrawdownPercent") < -1 * mddPer OR st.GetValue("KRatio") < 0 ) myNetPKr = 0;
bo.AddCustomMetric( "myNetPKr", myNetPKr );
myNetPKr2 = st.GetValue("NetProfitPercent") * st.GetValue("KRatio") * st.GetValue("KRatio") ;
if (st.GetValue("MaxSystemDrawdownPercent") < -1 * mddPer ) myNetPKr2 = 0;
bo.AddCustomMetric( "myNetPKr2", myNetPKr2 );
/*
myRRR = st.GetValue("RRR");
if (st.GetValue("MaxSystemDrawdownPercent") < -1 * mddPer) myRRR = 0;
bo.AddCustomMetric( "myRRR", myRRR );
myNetPRF = st.GetValue("NetProfitPercent") * st.GetValue("RecoveryFactor") ;
if (st.GetValue("MaxSystemDrawdownPercent") < -1 * mddPer ) myNetPRF = 0;
bo.AddCustomMetric( "myNetPRF", myNetPRF );
*/
} |
|
|
Посмотреть профиль Отправить личное сообщение |
![](images/spacer.gif) |
|