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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | /*============================================================================== 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 (); |