Исследуем сделки

03Июн08

Накидал небольшой код, суть его проста: в режиме 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 (Об эффективности)

Реклама


3 Responses to “Исследуем сделки”

  1. 1 Oleg

    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

  2. 2 Dmitry

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

    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 );

    Проблема одна — нет возможности автоматически удалять уже не нужные композиты.
    С уважением Дмитрий


  1. 1 В поисках edge’a часть 4 (Об эффективности) – Ubertrader

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

w

Connecting to %s


%d такие блоггеры, как: