Исследуем сделки
Накидал небольшой код, суть его проста: в режиме Exploration добавлять к сделкам сгенерированным из Buy/Sell сигналов, любые характеристики (будь то уровень RSI, соотношение объемов и т.п. до входа в сделку).
Для чего?
Идея простая – повысить эффективность системы, выделив важные признаки характерные для профитных трейдов и для последующей фильтрации уже в коде системы.
Главное, что этот подход позволяет отойти от модели «написал правило – оттестировал – оптимизировал», так скажем новый взгляд – осознанный подход. Это позволяет трейдеру стать имхо более робастным, в поиске закономерностей в системе.
Области применения вижу следующие:
- Анализ существующих систем, для поиска оптимальных стопов/тейков
- Поиск фильтров для систем
- Анализ серий сделок для реализации ММ на основе последовательностей выигрышных и проигрышных сделок
- Определение фазы рынка в котором система может работать наиболее эффективно
- И многое другое
Полученные от Exploration’a данные можно вставить в эксель и обработать как душе угодно, как всегда дальше вы ограничены только своей фантазией.
Данный код исследует только лонги. Для шортовых сделок потребуются небольшие правки. В целях тестирования PositionSize задана строго 1 лот, хотя это не принципиально.
Внимание! Не копируйте код ниже прямо в Ами, могут возникнуть ошибки, из-за особенностей форматирования кода блогом. Лучше скачайте по ссылке ниже.
Buy = Cross(C,MA(C,50));// && V / MA(V,20) >= 1.637 ;
Sell = Cross(MA(C,50),C);
Sell[BarCount-1] = 1;
Buy = ExRem(Buy, Sell);
Sell = ExRem(Sell, Buy);
//Longs Only
bi = BarsSince(Buy);
beg = bi*-1;
Trade = "Long";
profit = SellPrice - Ref(BuyPrice, beg);
percprofit = (SellPrice - Ref(BuyPrice, beg))/ Ref(BuyPrice, beg);
EntryPrice = Ref(BuyPrice, beg);
ClosePrice = SellPrice;
PositionSize = C*(1.01);
intrade = Flip(Buy, Sell);
tradeid = Cum( IIf(Ref(intrade, -1) ==0 && intrade == 1, 1,0));
Plot(C, "Close", colorBlack, 64);
PlotShapes(Buy * shapeHollowUpArrow, colorGreen);
PlotShapes(Sell * shapeHollowDownArrow, colorRed);
SetOption("NoDefaultColumns", True );
Filter = Ref(intrade, -1) && !intrade;
printf("%g",bi);
AddColumn(tradeid-1, "TradeID", 1);
AddTextColumn(Name(), "Ticker");
AddTextColumn(Trade, "Trade");
_tradelow = LLV(L, bi);
_tradehigh = HHV(H, bi);
AddColumn(Ref(DateTime(), beg), "OpenDate",formatDateTime);
//AddColumn(EntryPrice, "Price");
AddColumn(DateTime(), "CloseDate",formatDateTime);
//AddColumn(_tradelow, "Low");
AddColumn(bi+1, "BarsHeld", 1);
AddColumn(Profit, "Profit");
AddColumn(PercProfit*100, "%Profit");
AddColumn(Profit / (bi+1), "Profit/Bar");
AddColumn((_tradelow - EntryPrice ) / EntryPrice*100, "%MAE");
AddColumn((_tradehigh-EntryPrice) / EntryPrice*100, "%MFE");
AddColumn(int(Ref(RSI(), beg)), "RSI");
AddColumn(Ref(C / ATR(15), beg), "ATR");
AddColumn(Ref(V / MA(V,20), beg), "Vol to Avg20");
_SECTION_BEGIN("Price1");
SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));
Plot( C, "Close", ParamColor("Color", colorBlack ), styleNoTitle | ParamStyle("Style") | GetPriceStyle() );
_SECTION_END();
Скачать код Deals Explorer (переименовать в .afl!!!)
Статья по теме:
В поисках edge’a часть 4 (Об эффективности)
Filed under: Amibroker | 2 Comments
Tags: Amibroker, МТС, сделки
Privet Alexander,
U tebia poluchilos kak importirovat’ kotirovki «real-time» iz Quik v Amibroker, ya na danniy moment vivoju kotirovki cherez ODBC v SQL Server, mojet mojno kakto obratno v AmiBroker real-time eto vse?
Regards,
Oleg
Попробую немного продолжить: можно сохранять в композите всю динамику трейда для последующего анализа. В пробном коде сохраняются только параметры свечек.
tradeatbuy=Flip(Buy,Sell);
Trades=TradesO=TradesH=TradesL=TradesC=WinTradesMax=WinTradesMin=Null;
NumInPatt=0;
BuyPrc=0;
NumTrades=0;
WbO=WbH=WbL=WbC=WbV=Null;
for( i = 3; i 0 AND tradeatbuy[i]>0){NumInPatt=0; BuyPrcO=O[i];BuyPrcH=H[i];BuyPrcL=L[i];BuyPrcC=C[i];}
if(tradeatbuy[i]>0){stop[i]=BuyPrc-2*spread*TickSize+WinTradesMin[NumInPatt]; NumInPatt++;
WbO[i]=O[i]; WbH[i]=H[i]; WbL[i]=L[i]; WbC[i]=C[i];WbV[i]=V[i];
// Trades[NumInPatt]=C[i]-BuyPrcO;
TradesO[NumInPatt]=O[i]-BuyPrcO;
TradesH[NumInPatt]=H[i]-BuyPrcH;
TradesL[NumInPatt]=L[i]-BuyPrcL;
TradesC[NumInPatt]=C[i]-BuyPrcC;
}
if(tradeatbuy[i-1]>0 AND tradeatbuy[i]==0)
//if((BuyPrcO+ATRW[i-1])<C[i-1] ) //Good Win Trades
// if(BuyPrcOC[i-1] ) //small win trades
if(BuyPrcO>C[i-1] AND (BuyPrcO-ATRW[i-1])C[i-1] ) //Big Loss trades
{for(k = 0;k<NumInPatt;k++)
{if(IsNull(WinTradesMax[k]))WinTradesMax[k]=Trades[k]; else WinTradesMax[k]=Max(WinTradesMax[k],Trades[k]);
if(IsNull(WinTradesMin[k]))WinTradesMin[k]=Trades[k]; else WinTradesMin[k]=Min(WinTradesMin[k],Trades[k]);}
AddToComposite(TradesO, «~tst»+NumToStr( NumTrades, 1.0), «O» ,1|128); TradesO=Null;
AddToComposite(TradesH, «~tst»+NumToStr( NumTrades, 1.0), «H» ,1|128); TradesH=Null;
AddToComposite(TradesL, «~tst»+NumToStr( NumTrades, 1.0), «L» ,1|128); TradesL=Null;
AddToComposite(TradesC, «~tst»+NumToStr( NumTrades, 1.0), «C» ,1|128); TradesC=Null;
//AddToComposite(Trades, «~tst»+NumToStr( NumTrades, 1.0), «V» ,128); Trades=Null;
NumTrades++;} else for(k = 0;k<=NumInPatt;k++) WbO[i-k]=WbH[i-k]=WbL[i-k]=WbC[i-k]=WbV[i-k]=Null;
}
А потом это можно вывести :
for( i = 0; i 0; k–) {
if (prnL[k]!=0 AND swL>0){swL=0;End[k]=1;};
if (swL==0 ) PRN[k]=prnL[k];
}
Plot( PRN, «L»+NumToStr( i, 1.0), colorRed, 1);
PlotShapes( (End == 1) * shapeSmallCircle, colorRed, 0,PRN,0);
};
PlotText( «Trades » + NumTrades, 3, 0, colorRed, colorYellow );
Проблема одна – нет возможности автоматически удалять уже не нужные композиты.
С уважением Дмитрий