Được tạo ra theo yêu cầu: Đây là một chiến lược giao dịch xu hướng sử dụng các tín hiệu phát hiện chênh lệch giá được xác nhận bởi
Mã chiến lược dựa trên:
Máy phát hiện chênh lệch giá V2 của RicardoSantos
UCS_Murrey
backtest
/*backtest start: 2022-04-30 00:00:00 end: 2022-05-29 23:59:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // // Title: [STRATEGY][UL]Price Divergence Strategy V1.1 // Author: JustUncleL // Date: 23-Oct-2016 // Version: v1.1 // // Description: // A trend trading strategy the uses Price Divergence detection signals, that // are confirmed by the "Murrey's Math Oscillator" (Donchanin Channel based). // // *** USE AT YOUR OWN RISK *** // // Mofidifications: // 1.0 - original // 1.1 - Pinescript V4 update 21-Aug-2021 // // References: // Strategy Based on: // - [RS]Price Divergence Detector V2 by RicardoSantos // - UCS_Murrey's Math Oscillator by Ucsgears // Some Code borrowed from: // - "Strategy Code Example by JayRogers" // Information on Divergence Trading: // - http://www.babypips.com/school/high-school/trading-divergences // strategy(title='[STRATEGY][UL]Price Divergence Strategy v1.1', pyramiding=0, overlay=true, initial_capital=10000, calc_on_every_tick=false, currency=currency.USD, default_qty_type=strategy.percent_of_equity, default_qty_value=10) // || General Input: method = input(title='Method (0=rsi, 1=macd, 2=stoch, 3=volume, 4=acc/dist, 5=fisher, 6=cci):', type=input.integer, defval=1, minval=0, maxval=6) SHOW_LABEL = input(title='Show Labels', type=input.bool, defval=true) SHOW_CHANNEL = input(title='Show Channel', type=input.bool, defval=false) uHid = input(true, title="Use Hidden Divergence in Strategy") uReg = input(true, title="Use Regular Divergence in Strategy") // || RSI / STOCH / VOLUME / ACC/DIST Input: rsi_smooth = input(title='RSI/STOCH/Volume/ACC-DIST/Fisher/cci Smooth:', type=input.integer, defval=5) // || MACD Input: macd_src = input(title='MACD Source:', type=input.source, defval=close) macd_fast = input(title='MACD Fast:', type=input.integer, defval=12) macd_slow = input(title='MACD Slow:', type=input.integer, defval=26) macd_smooth = input(title='MACD Smooth Signal:', type=input.integer, defval=9) // || Functions: f_top_fractal(_src) => _src[4] < _src[2] and _src[3] < _src[2] and _src[2] > _src[1] and _src[2] > _src[0] f_bot_fractal(_src) => _src[4] > _src[2] and _src[3] > _src[2] and _src[2] < _src[1] and _src[2] < _src[0] f_fractalize(_src) => f_bot_fractal__1 = f_bot_fractal(_src) f_top_fractal(_src) ? 1 : f_bot_fractal__1 ? -1 : 0 // ||••> START MACD FUNCTION f_macd(_src, _fast, _slow, _smooth) => _fast_ma = sma(_src, _fast) _slow_ma = sma(_src, _slow) _macd = _fast_ma - _slow_ma _signal = ema(_macd, _smooth) _hist = _macd - _signal _hist // ||<•• END MACD FUNCTION // ||••> START ACC/DIST FUNCTION f_accdist(_smooth) => _return = sma(cum(close == high and close == low or high == low ? 0 : (2 * close - low - high) / (high - low) * volume), _smooth) _return // ||<•• END ACC/DIST FUNCTION // ||••> START FISHER FUNCTION f_fisher(_src, _window) => _h = highest(_src, _window) _l = lowest(_src, _window) _value0 = 0.0 _fisher = 0.0 _value0 := .66 * ((_src - _l) / max(_h - _l, .001) - .5) + .67 * nz(_value0[1]) _value1 = _value0 > .99 ? .999 : _value0 < -.99 ? -.999 : _value0 _fisher := .5 * log((1 + _value1) / max(1 - _value1, .001)) + .5 * nz(_fisher[1]) _fisher // ||<•• END FISHER FUNCTION rsi_1 = rsi(high, rsi_smooth) f_macd__1 = f_macd(macd_src, macd_fast, macd_slow, macd_smooth) stoch_1 = stoch(close, high, low, rsi_smooth) sma_1 = sma(volume, rsi_smooth) f_accdist__1 = f_accdist(rsi_smooth) f_fisher__1 = f_fisher(high, rsi_smooth) cci_1 = cci(high, rsi_smooth) method_high = method == 0 ? rsi_1 : method == 1 ? f_macd__1 : method == 2 ? stoch_1 : method == 3 ? sma_1 : method == 4 ? f_accdist__1 : method == 5 ? f_fisher__1 : method == 6 ? cci_1 : na rsi_2 = rsi(low, rsi_smooth) f_macd__2 = f_macd(macd_src, macd_fast, macd_slow, macd_smooth) stoch_2 = stoch(close, high, low, rsi_smooth) sma_2 = sma(volume, rsi_smooth) f_accdist__2 = f_accdist(rsi_smooth) f_fisher__2 = f_fisher(low, rsi_smooth) cci_2 = cci(low, rsi_smooth) method_low = method == 0 ? rsi_2 : method == 1 ? f_macd__2 : method == 2 ? stoch_2 : method == 3 ? sma_2 : method == 4 ? f_accdist__2 : method == 5 ? f_fisher__2 : method == 6 ? cci_2 : na fractal_top = f_fractalize(method_high) > 0 ? method_high[2] : na fractal_bot = f_fractalize(method_low) < 0 ? method_low[2] : na high_prev = valuewhen(fractal_top, method_high[2], 1) high_price = valuewhen(fractal_top, high[2], 1) low_prev = valuewhen(fractal_bot, method_low[2], 1) low_price = valuewhen(fractal_bot, low[2], 1) regular_bearish_div = fractal_top and high[2] > high_price and method_high[2] < high_prev hidden_bearish_div = fractal_top and high[2] < high_price and method_high[2] > high_prev regular_bullish_div = fractal_bot and low[2] < low_price and method_low[2] > low_prev hidden_bullish_div = fractal_bot and low[2] > low_price and method_low[2] < low_prev plot(title='H F', series=fractal_top ? high[2] : na, color=regular_bearish_div or hidden_bearish_div ? color.maroon : not SHOW_CHANNEL ? na : color.silver, offset=-2) plot(title='L F', series=fractal_bot ? low[2] : na, color=regular_bullish_div or hidden_bullish_div ? color.green : not SHOW_CHANNEL ? na : color.silver, offset=-2) plot(title='H D', series=fractal_top ? high[2] : na, style=plot.style_circles, color=regular_bearish_div or hidden_bearish_div ? color.maroon : not SHOW_CHANNEL ? na : color.silver, linewidth=3, offset=-2) plot(title='L D', series=fractal_bot ? low[2] : na, style=plot.style_circles, color=regular_bullish_div or hidden_bullish_div ? color.green : not SHOW_CHANNEL ? na : color.silver, linewidth=3, offset=-2) plotshape(title='+RBD', series=not SHOW_LABEL ? na : regular_bearish_div ? high[2] : na, text='R', style=shape.labeldown, location=location.absolute, color=color.maroon, textcolor=color.white, offset=-2) plotshape(title='+HBD', series=not SHOW_LABEL ? na : hidden_bearish_div ? high[2] : na, text='H', style=shape.labeldown, location=location.absolute, color=color.maroon, textcolor=color.white, offset=-2) plotshape(title='-RBD', series=not SHOW_LABEL ? na : regular_bullish_div ? low[2] : na, text='R', style=shape.labelup, location=location.absolute, color=color.green, textcolor=color.white, offset=-2) plotshape(title='-HBD', series=not SHOW_LABEL ? na : hidden_bullish_div ? low[2] : na, text='H', style=shape.labelup, location=location.absolute, color=color.green, textcolor=color.white, offset=-2) // Code borrowed from UCS_Murrey's Math Oscillator by Ucsgears // - UCS_MMLO // Inputs length = input(100, minval=10, title="MMLO Look back Length") quad = input(2, minval=1, maxval=4, step=1, title="Mininum Quadrant for MMLO Support") mult = 0.125 // Donchanin Channel hi = highest(high, length) lo = lowest(low, length) range = hi - lo multiplier = range * mult midline = lo + multiplier * 4 oscillator = (close - midline) / (range / 2) a = oscillator > 0 b = oscillator > 0 and oscillator > mult * 2 c = oscillator > 0 and oscillator > mult * 4 d = oscillator > 0 and oscillator > mult * 6 z = oscillator < 0 y = oscillator < 0 and oscillator < -mult * 2 x = oscillator < 0 and oscillator < -mult * 4 w = oscillator < 0 and oscillator < -mult * 6 // Strategy: (Thanks to JayRogers) // === STRATEGY RELATED INPUTS === //tradeInvert = input(defval = false, title = "Invert Trade Direction?") // the risk management inputs inpTakeProfit = input(defval=0, title="Take Profit Points", minval=0) inpStopLoss = input(defval=0, title="Stop Loss Points", minval=0) inpTrailStop = input(defval=100, title="Trailing Stop Loss Points", minval=0) inpTrailOffset = input(defval=0, title="Trailing Stop Loss Offset Points", minval=0) // === RISK MANAGEMENT VALUE PREP === // if an input is less than 1, assuming not wanted so we assign 'na' value to disable it. useTakeProfit = inpTakeProfit >= 1 ? inpTakeProfit : na useStopLoss = inpStopLoss >= 1 ? inpStopLoss : na useTrailStop = inpTrailStop >= 1 ? inpTrailStop : na useTrailOffset = inpTrailOffset >= 1 ? inpTrailOffset : na // === STRATEGY - LONG POSITION EXECUTION === enterLong() => // functions can be used to wrap up and work out complex conditions (uReg and regular_bullish_div or uHid and hidden_bullish_div) and (quad == 1 ? a[1] : quad == 2 ? b[1] : quad == 3 ? c[1] : quad == 4 ? d[1] : false) exitLong() => oscillator <= 0 strategy.entry(id="Buy", long=true, when=enterLong()) // use function or simple condition to decide when to get in strategy.close(id="Buy", when=exitLong()) // ...and when to get out // === STRATEGY - SHORT POSITION EXECUTION === enterShort() => (uReg and regular_bearish_div or uHid and hidden_bearish_div) and (quad == 1 ? z[1] : quad == 2 ? y[1] : quad == 3 ? x[1] : quad == 4 ? w[1] : false) exitShort() => oscillator >= 0 strategy.entry(id="Sell", long=false, when=enterShort()) strategy.close(id="Sell", when=exitShort()) // === STRATEGY RISK MANAGEMENT EXECUTION === // finally, make use of all the earlier values we got prepped strategy.exit("Exit Buy", from_entry="Buy", profit=useTakeProfit, loss=useStopLoss, trail_points=useTrailStop, trail_offset=useTrailOffset) strategy.exit("Exit Sell", from_entry="Sell", profit=useTakeProfit, loss=useStopLoss, trail_points=useTrailStop, trail_offset=useTrailOffset) //EOF