Jh. " 각 지표에 대한 크레딧은 그들에게 속합니다. 나는 단지 몇 가지 추가 옵션, 설정, 등을 추가하기 위해 변경, 또한 PineScript 5에 모든 코드를 업데이트했습니다.
=== 전략 === 기본 설정은 이미 트레이드 킹이 요구하는 대로, 그래서 당신은 아무것도 변경할 필요가 없습니다. FOR LONGS (녹색 배경에는 LONG 항목이 표시됩니다.)
SHORTS (붉은 배경에는 SHORT 항목이 표시됩니다.)
더 많은 정보를 얻기 위해 트레이드 킹의 유튜브 채널을 확인하십시오.
=== 일반 개선 === 파인스크립트 5로 업그레이드 몇 가지 성능 개선.
=== 개인 메모 === 이 전략의 저자는 5M 차트를 권장하지만 4H는 가장 좋습니다.
이 스크립트를 구성하는 지표의 저자와 이 전략을 만든 TRADE KING에게 다시 한 번 감사드립니다.
백테스트
/*backtest start: 2022-04-09 00:00:00 end: 2022-05-08 23:59:00 period: 3m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // © JoseMetal //@version=5 // //== Constantes c_verde_radiactivo = color.rgb(0, 255, 0, 0) c_verde = color.rgb(0, 128, 0, 0) c_verde_oscuro = color.rgb(0, 80, 0, 0) c_rojo_radiactivo = color.rgb(255, 0, 0, 0) c_rojo = color.rgb(128, 0, 0, 0) c_rojo_oscuro = color.rgb(80, 0, 0, 0) //== Funciones //== Declarar estrategia y período de testeo //strategy("EMA + AROON + ASH (TRADE KING's STRATEGY)", shorttitle="EMA + AROON + ASH (TRADE KING's STRATEGY)", overlay=true, initial_capital=10000, pyramiding=0, default_qty_value=10, default_qty_type=strategy.percent_of_equity, commission_type=strategy.commission.percent, commission_value=0.00075, max_labels_count=500, max_bars_back=1000) //fecha_inicio = input.time(timestamp("1 Jan 2000"), title="• Start date", group="Test period", inline="periodo_de_pruebas") vela_en_fecha = true posicion_abierta = strategy.position_size != 0 LONG_abierto = strategy.position_size > 0 SHORT_abierto = strategy.position_size < 0 //== Condiciones de entrada y salida de estrategia GRUPO_P = "Positions" P_permitir_LONGS = input.bool(title="¿LONGS?", group=GRUPO_P, defval=true) P_permitir_SHORTS = input.bool(title="¿SHORTS?", group=GRUPO_P, defval=true) GRUPO_TPSL = "TP y SL" TPSL_TP_pivot_lookback = input.int(title="• SL lookback for pivot / Mult. TP", group=GRUPO_TPSL, defval=20, minval=1, step=1, inline="tp_sl") TPSL_SL_mult = input.float(title="", group=GRUPO_TPSL, defval=2.0, minval=0.1, step=0.2, inline="tp_sl") //== Inputs de indicadores // EMA GRUPO_EMA = "Exponential Moving Average (EMA)" EMA_length = input.int(200, minval=1, title="Length", group=GRUPO_EMA) EMA_src = input(close, title="Source", group=GRUPO_EMA) EMA = ta.ema(EMA_src, EMA_length) // Aroon GRUPO_Aroon = "Aroon" Aroon_length = input.int(title="• Length", group=GRUPO_Aroon, defval=20, minval=1) Aroon_upper = 100 * (ta.highestbars(high, Aroon_length+1) + Aroon_length) / Aroon_length Aroon_lower = 100 * (ta.lowestbars(low, Aroon_length+1) + Aroon_length) / Aroon_length // ASH GRUPO_ASH = "Absolute Strength Histogram v2 | jh" ASH_Length = input(9, title='Period of Evaluation', group=GRUPO_ASH) ASH_Smooth = input(3, title='Period of Smoothing', group=GRUPO_ASH) ASH_src = input(close, title='Source') ASH_Mode = input.string(title='Indicator Method', defval='RSI', options=['RSI', 'STOCHASTIC', 'ADX']) ASH_ma_type = input.string(title='MA', defval='WMA', options=['ALMA', 'EMA', 'WMA', 'SMA', 'SMMA', 'HMA']) ASH_alma_offset = input.float(defval=0.85, title='* Arnaud Legoux (ALMA) Only - Offset Value', minval=0, step=0.01) ASH_alma_sigma = input.int(defval=6, title='* Arnaud Legoux (ALMA) Only - Sigma Value', minval=0) _MA(type, src, len) => float result = 0 if type == 'SMA' // Simple result := ta.sma(src, len) result if type == 'EMA' // Exponential result := ta.ema(src, len) result if type == 'WMA' // Weighted result := ta.wma(src, len) result if type == 'SMMA' // Smoothed w = ta.wma(src, len) result := na(w[1]) ? ta.sma(src, len) : (w[1] * (len - 1) + src) / len result if type == 'HMA' // Hull result := ta.wma(2 * ta.wma(src, len / 2) - ta.wma(src, len), math.round(math.sqrt(len))) result if type == 'ALMA' // Arnaud Legoux result := ta.alma(src, len, ASH_alma_offset, ASH_alma_sigma) result result Price1 = _MA('SMA', ASH_src, 1) Price2 = _MA('SMA', ASH_src[1], 1) // RSI Bulls0 = 0.5 * (math.abs(Price1 - Price2) + Price1 - Price2) Bears0 = 0.5 * (math.abs(Price1 - Price2) - (Price1 - Price2)) // STOCHASTIC Bulls1 = Price1 - ta.lowest(Price1, ASH_Length) Bears1 = ta.highest(Price1, ASH_Length) - Price1 // ADX Bulls2 = 0.5 * (math.abs(high - high[1]) + high - high[1]) Bears2 = 0.5 * (math.abs(low[1] - low) + low[1] - low) Bulls = ASH_Mode == 'RSI' ? Bulls0 : ASH_Mode == 'STOCHASTIC' ? Bulls1 : Bulls2 Bears = ASH_Mode == 'RSI' ? Bears0 : ASH_Mode == 'STOCHASTIC' ? Bears1 : Bears2 AvgBulls = _MA(ASH_ma_type, Bulls, ASH_Length) AvgBears = _MA(ASH_ma_type, Bears, ASH_Length) SmthBulls = _MA(ASH_ma_type, AvgBulls, ASH_Smooth) SmthBears = _MA(ASH_ma_type, AvgBears, ASH_Smooth) difference = math.abs(SmthBulls - SmthBears) //== Cálculo de condiciones EMA_alcista = close > EMA EMA_bajista = close < EMA Aroon_cruce_alcista = ta.crossover(Aroon_upper, Aroon_lower) Aroon_cruce_bajista = ta.crossunder(Aroon_upper, Aroon_lower) ASH_alcista = SmthBulls > SmthBears ASH_bajista = SmthBulls < SmthBears //== Entrada (deben cumplirse todas para entrar) longCondition1 = EMA_alcista longCondition2 = Aroon_cruce_alcista longCondition3 = ASH_alcista long_conditions = longCondition1 and longCondition2 and longCondition3 entrar_en_LONG = P_permitir_LONGS and long_conditions and vela_en_fecha and not posicion_abierta shortCondition1 = EMA_bajista shortCondition2 = Aroon_cruce_bajista shortCondition3 = ASH_bajista short_conditions = shortCondition1 and shortCondition2 and shortCondition3 entrar_en_SHORT = P_permitir_SHORTS and short_conditions and vela_en_fecha and not posicion_abierta var LONG_stop_loss = 0.0 var LONG_take_profit = 0.0 var SHORT_stop_loss = 0.0 var SHORT_take_profit = 0.0 //psl = ta.pivotlow(TPSL_TP_pivot_lookback, TPSL_TP_pivot_lookback) //psh = ta.pivothigh(TPSL_TP_pivot_lookback, TPSL_TP_pivot_lookback) psl = ta.lowest(TPSL_TP_pivot_lookback) psh = ta.highest(TPSL_TP_pivot_lookback) if (entrar_en_LONG) LONG_stop_loss := psl - close*0.001 LONG_take_profit := close + ((close - LONG_stop_loss) * TPSL_SL_mult) strategy.entry("+ Long", strategy.long) strategy.exit("- Long", "+ Long", limit=LONG_take_profit, stop=LONG_stop_loss) if (entrar_en_SHORT) SHORT_stop_loss := psh + close*0.001 SHORT_take_profit := close - ((SHORT_stop_loss - close) * TPSL_SL_mult) strategy.entry("+ Short", strategy.short) strategy.exit("- Short", "+ Short", limit=SHORT_take_profit, stop=SHORT_stop_loss) //== Ploteo en pantalla // EMA plot(EMA, color=color.white, linewidth=2) // Símbolo de entrada (entre o no en compra) bgcolor = color.new(color.black, 100) if (entrar_en_LONG or entrar_en_SHORT) bgcolor := color.new(color.green, 90) bgcolor(bgcolor) // Precio de compra, Take Profit, Stop Loss y relleno avg_position_price_plot = plot(series=posicion_abierta ? strategy.position_avg_price : na, color=color.new(color.white, 25), style=plot.style_linebr, linewidth=2, title="Precio Entrada") LONG_tp_plot = plot(LONG_abierto and LONG_take_profit > 0.0 ? LONG_take_profit : na, color=color.new(color.lime, 25), style=plot.style_linebr, linewidth=3, title="LONG Take Profit") LONG_sl_plot = plot(LONG_abierto and LONG_stop_loss > 0.0 ? LONG_stop_loss : na, color=color.new(color.red, 25), style=plot.style_linebr, linewidth=3, title="Long Stop Loss") fill(avg_position_price_plot, LONG_tp_plot, color=color.new(color.olive, 85)) fill(avg_position_price_plot, LONG_sl_plot, color=color.new(color.maroon, 85)) SHORT_tp_plot = plot(SHORT_abierto and SHORT_take_profit > 0.0 ? SHORT_take_profit : na, color=color.new(color.lime, 25), style=plot.style_linebr, linewidth=3, title="SHORT Take Profit") SHORT_sl_plot = plot(SHORT_abierto and SHORT_stop_loss > 0.0 ? SHORT_stop_loss : na, color=color.new(color.red, 25), style=plot.style_linebr, linewidth=3, title="Short Stop Loss") fill(avg_position_price_plot, SHORT_tp_plot, color=color.new(color.olive, 85)) fill(avg_position_price_plot, SHORT_sl_plot, color=color.new(color.maroon, 85))