Stock Portfolio Organizer
The ultimate porfolio management solution.
Shares, Margin, CFD's, Futures and Forex
EOD and Realtime
Dividends and Trust Distributions
And Much More ....
WiseTrader Toolbox
#1 Selling Amibroker Plugin featuring:
Advanced Adaptive Indicators
Advanced Pattern Exploration
Neural Networks
And Much More ....
Ed Saykota EMA for Amibroker (AFL)
Copy & Paste Friendly
Back
/*============================================================================== Global Settings ==============================================================================*/ SetOption("InitialEquity", 1000000); SetOption("MinShares", 50); SetOption("NoDefaultColumns", True ); SetOption("CommissionMode", 2); //$$ per trade SetOption("CommissionAmount", 0); // commission is accounted for in skid SetOption("MarginRequirement", 10); SetOption("UsePrevBarEquityForPosSizing", True); SetOption("UseCustomBacktestProc", True ); SetTradeDelays( 1, 1, 1, 1 ); /*============================================================================== User-defined Functions ==============================================================================*/ function EMA0(A, p) { r[0] = a[0]; ep = 2/(p+1); for(i = 1; i < BarCount; i++) { r[i] = r[i-1] + (a[i] - r[i-1]) * ep; } return r; } function OptimizeNot(a1, a2, a3, a4, a5) { return a2; } /*============================================================================== Entry and Exit Rules ==============================================================================*/ tr = Max(H-L, Max(abs(H-Ref(C, -1)), abs(Ref(C, -1)-L))); tr[0] = H[0] - L[0]; fast = EMA0(C, Optimize("FastEMA", 15, 20, 140, 5)); slow = EMA0(C, Optimize("SlowEMA", 150, 150, 1000, 10)); Buy = Cross(fast, slow); Sell = Cross(slow, fast); Buy[1] = 0; // to avoid false signal at the beginning //ApplyStop(stopTypeLoss, stopModePoint, ATR_multi*Ref(ATR0, -1), True, True); /*============================================================================== Skid of Executions ==============================================================================*/ BuyPrice = (H+O)/2; SellPrice = (L+O)/2; /*============================================================================== Position Sizing ==============================================================================*/ ATR_multi = OptimizeNot("ATP Multi", 5, 1, 9, 1); ATR0 = EMA0(tr, 20); Risk_Per_Share = Ref(ATR0, -1) * ATR_multi; Heat = OptimizeNot("Heat", 0.10, 0.01, 0.50, 0.01); PosSizeFactor = Heat / Risk_Per_Share; // the real position size value is calculated within CBT SetPositionSize(PosSizeFactor, spsValue); /*============================================================================== Automatic Analysis Action Options ==============================================================================*/ AAAction = Status("action"); if(AAAction == actionIndicator) { Plot(fast, "FastEMA", colorRed); Plot(slow, "SlowEMA", colorYellow); } else if(AAAction == actionExplore) { Filter = 1; AddColumn( DateTime(), "Date", formatDateTime ); //AddColumn(DayOfWeek(), "DayOfWeek", 1); AddColumn(O, "Open"); AddColumn(H, "High"); AddColumn(L, "Low"); AddColumn(C, "Close"); //AddColumn(Avg, "AVG"); AddColumn(fast, "FastEMA", 1.3); AddColumn(slow, "SlowEMA", 1.3); AddColumn(ATR0, "ATR", 1.3); //AddColumn(Risk_Per_Share, "Risk/Share"); AddColumn(IIf(Buy, 111, IIf(Sell, 222, 0)) , "Buy1Sell2", 1); AddColumn(PosSize, "PosSize%Eq"); AddColumn(Equity() , "Equity"); } else if(AAAction == actionPortfolio) { bo = GetBacktesterObject(); bo.PreProcess(); // Initialize backtester for( bar=0; bar < BarCount; bar++) { eq = bo.Equity; for ( sig=bo.GetFirstSignal(bar); sig; sig=bo.GetNextSignal(bar) ) { if (sig.isExit()) { if(bo.ExitTrade(bar,sig.symbol,sig.Price)) { _TRACE("EXIT: " + sig.symbol + "@" + sig.Price); } } } // update stats after closing trades bo.UpdateStats(bar, 1 ); for ( sig=bo.GetFirstSignal(bar); sig; sig=bo.GetNextSignal(bar)) { if (sig.isEntry()) { // sig.PosSize is passed from Phase I. ps = round(( eq * sig.PosSize)/250)*250 * sig.Price; if(bo.EnterTrade(bar, sig.symbol, True, sig.Price, ps, sig.PosScore,sig.RoundLotSize)) { _TRACE("ENTRY: " + sig.symbol + " @" + sig.Price + " PosScore=" + sig.PosScore + " PosSize=" + ps); } } } //bo.HandleStops(bar); // MUST BE PLACED HERE TO WORK FOR N-BAR STOPS (not before enter/exit trades) bo.UpdateStats(bar,1); // MAE/MFE is updated when timeinbar is set to 1. bo.UpdateStats(bar,2); } bo.PostProcess(); // Finalize backtester } /*============================================================================== End of Formula ==============================================================================*/ _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();