Major Support Resistance Lines |
//www.aflcode.com SetOption("InitialEquity", 1000000); SetOption("NoDefaultColumns", True ); SetOption("CommissionMode", 2); //$$ per trade SetOption("CommissionAmount", 0); SetOption("MarginRequirement", 10); SetOption("UsePrevBarEquityForPosSizing", True); SetOption("UseCustomBacktestProc", True ); SetTradeDelays( 0, 0, 0, 0 ); /*============================================================================== User-defined Functions ==============================================================================*/ function Support(p) { sup = LLV(Low, p); sup[0] = Low[0]; for (i = 1; i < p; i++) { if(Low[i] < sup[i-1]) sup[i] = Low[i]; else sup[i] = sup[i-1]; } return sup; } function Resistance(p) { res = HHV(High, p); res[0] = High[0]; for (i = 1; i < p; i++) { if(High[i] > res[i-1]) res[i] = High[i]; else res[i] = res[i-1]; } return res; } function OptimizeNot(a1, a2, a3, a4, a5) { return a2; } /*============================================================================== Entry and Exit Rules ==============================================================================*/ fast = Optimize("Fast", 20, 5, 105, 5); slow = Optimize("Slow", 140, 20, 420, 20); FastRes = Resistance(fast); FastSup = Support(fast); SlowRes = Resistance(slow); SlowSup = Support(slow); heat = 0.05; // determine longer term trend // Note: could have problem if current bar is outside of all previous bars trend[0] = 0; for(bar= 1; bar < BarCount; bar++) { if(High[bar] > SlowRes[bar-1]) trend[bar] = 1; else if(Low[bar] < SlowSup[bar-1]) trend[bar] = -1; else trend[bar] = trend[bar-1]; } LastPosition = 0; // 1 - long; -1 - short PositionRiskStop = 0; Buy = Sell = Short = Cover = 0; for(bar = 5; bar < BarCount-1; bar++) { // Exit position by protection stop if(LastPosition == 1) { // Sell at stop if(PositionRiskStop > Low[bar] ) // skip if the signal price only touch (=) the low { // We just calculate the exact price to simulate Ed's skid stopPrice = PositionRiskStop; ff = Min(Open[bar], stopPrice) - Low[bar]; stopPrice = Min(Open[bar], stopPrice) - 0.5*ff; Sell[bar] = 1; SellPrice[bar] = stopPrice; TradePrice[bar] = stopPrice; LastPosition = 0; } } else if(LastPosition == -1) { // Cover at stop if(PositionRiskStop < High[bar]) // skip if the signal price only touch (=) the high { stopPrice = PositionRiskStop; ff = High[bar] - Max(Open[bar], stopPrice); stopPrice = Max(Open[bar], stopPrice) + 0.5*ff; Cover[bar] = 1; CoverPrice[bar] = stopPrice; TradePrice[bar] = stopPrice; LastPosition = 0; } } // move the protection stop if(LastPosition == 1) { PositionRiskStop = FastSup[bar]; } else if(LastPosition == -1) { PositionRiskStop = FastRes[bar]; } else { // Enter position only when last position has been closed if(trend[bar] == 1) { // buy at stop if( fastRes[bar] < High[bar+1]) { ff = High[bar+1] - Max(Open[bar+1], fastRes[bar]); stopPrice = Max(Open[bar+1], FastRes[bar]) + 0.5*ff; f = heat/(FastRes[bar] - FastSup[bar]); Buy[bar+1] = 1; BuyPrice[bar+1] = stopPrice; PositionSize[bar+1] = f; //this value is passed to CBT for position sizing LastPosition = 1; PositionRiskStop = FastSup[bar+1]; TradePrice[bar+1] = stopPrice; bar ++; // skip one bar since next bar has been handled } } else if(trend[bar] == -1) { // short at stop if( fastSup[bar] > Low[bar+1]) { ff = Min(Open[bar+1], FastSup[bar]) - Low[bar+1]; stopPrice = Min(Open[bar+1], FastSup[bar]) - 0.5*ff; f = heat/(FastRes[bar] - FastSup[bar]); Short[bar+1] = 1; ShortPrice[bar+1] = stopPrice; PositionSize[bar+1] = f; //this value is passed to CBT for position sizing LastPosition = -1; PositionRiskStop = FastRes[bar+1]; TradePrice[bar+1] = stopPrice; bar ++; // skip one bar since next bar has been handled } } } } // close final day for accounting purpose bar = BarCount-1; if(LastPosition == 1) { Sell[bar] = 1; SellPrice[bar] = (Low[bar]+Close[bar])/2; } else if(LastPosition == -1) { Cover[bar] = 1; CoverPrice[bar] = (High[bar]+Close[bar])/2; } /*============================================================================== Automatic Analysis Action Options ==============================================================================*/ AAAction = Status("action"); if(AAAction == actionIndicator) { Plot(FastRes, "FastRes", colorRed); Plot(SlowRes, "SlowRes", colorPink); Plot(FastSup, "FastSup", colorGreen); Plot(SlowSup, "SlowSup", colorBlue); } else if(AAAction == actionExplore) { Filter = 1; AddColumn( DateTime(), "Date", formatDateTime ); AddColumn(O, "Open"); AddColumn(H, "High"); AddColumn(L, "Low"); AddColumn(C, "Close"); AddColumn(FastRes, "FastRes"); AddColumn(SlowRes, "SlowRes"); AddColumn(FastSup, "FastSup"); AddColumn(SlowSup, "SlowSup"); AddColumn(Trend, "Trend"); AddColumn(IIf(Buy, Asc("B"), IIf(Sell, Asc("S"), IIf(Short, Asc("H"), IIf(Cover, Asc("C"), 0)))) , "Signal", formatChar); AddColumn(TradePrice, "TradePrice"); } 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. shares = round((eq*sig.PosSize)/100)*100; ps = shares * sig.Price; if(bo.EnterTrade(bar, sig.symbol, sig.IsLong, sig.Price, ps, sig.PosScore,sig.RoundLotSize)) { _TRACE("ENTRY: " + sig.symbol + " @" + sig.Price + " PosScore=" + sig.PosScore + " PosSize=" + ps); } } } 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 ==============================================================================*/
Sign up here with your email
ConversionConversion EmoticonEmoticon