이것은 이동 평균에 기반한 추적 스톱 로스 거래 전략이다. 그것은 긴 거래와 짧은 거래에 대한 골든 크로스 및 데드 크로스 신호를 생성하기 위해 서로 다른 기간을 가진 두 개의 EMA 라인을 사용합니다. 한편, 전략은 스톱 로스를 추적하고 수익 수준을 취하기 위해 퍼센트 또는 고정 포인트 방법을 사용합니다. 이것은 전략이 위험을 효과적으로 제어하면서 이익을 잠금 할 수있게합니다.
이 전략은 빠른 EMA와 느린 EMA를 사용한다. 빠른 EMA는 민감하게 반응하고 느린 EMA는 더 안정적으로 움직인다. 두 선이 교차하기 위해 올라갈 때 황금 교차가 형성되어 구매 신호를 생성한다. 죽은 교차는 아래로 교차할 때 발생하여 판매 신호를 촉구한다. 이것은 움직이는 평균 전략의 근본적인 논리이다.
그 위에, 전략 트레일 스톱 손실 및 이익 목표 한 번 무역에 입력됩니다. 구체적으로, 스톱 손실 및 이익 목표 수준은 가격 변동에 따라 유리한 방향으로 조정됩니다. 이것은 위험을 제한하는 동안 이익을 잠금 할 수 있습니다. 후속 속도는 비율 또는 고정 포인트를 사용하여 구성 할 수 있습니다. 이것은 스톱 손실을 만듭니다. 그리고 이익 메커니즘을 더 유연하고 지능적입니다.
이 전략은 이동 평균 신호 및 트렌드 추적 기법의 강점을 통합합니다. 장기적으로 안정적이고 뛰어난 성능을 보여주고 라이브 거래에 실용적인 가치를 가지고 있습니다. 매개 변수 조정 및 조합 최적화로 추가 개선이 가능합니다. 전략은 실제 세계 검증을받을 가치가 있습니다.
/*backtest start: 2023-01-31 00:00:00 end: 2024-01-31 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © Sharad_Gaikwad //@version=5 strategy("Traling.SL.Target", overlay=true, process_orders_on_close = true, max_labels_count = 500) // << Parameters section { _1 = input.bool(title = "━━━━━━━ ↓ Pivot parameters for trade ↓ ━━━━━━━", defval = false) fast_len = input.int(title = 'Fast len', defval = 20) slow_len = input.int(title = 'Slow len', defval = 50) label_bg_color = input.color(title = 'BG color for ongoing trade SL/Target label', defval=color.white) sl_target_method = input.string(title = 'Method to be used for SL/Target trailing', defval='% Based Target and SL', options = ['% Based Target and SL','Fix point Based Target and SL']) _2 = input.bool(title = "━━━━━━━ ↓ % Based Target and SL ↓ ━━━━━━━", defval = true) initial_profit_percent = input.float(title = 'Inital profit %', defval = 1) / 100 initial_sl_percent = input.float(title = 'Inital SL %', defval = 1) / 100 initiate_trailing_percent = input.float(title = 'Initiate trailing %', defval = 0.5, tooltip = 'Initiate trailing of target and SL after change in price in % after taking trade') / 100 trail_profit_percent = input.float(title = 'Trail profit by %', defval = 0.3) / 100 trail_sl_percent = input.float(title = 'Trail SL by %', defval = 0.3) / 100 _3 = input.bool(title = "━━━━━━━ ↓ Fix point Based Target and SL ↓ ━━━━━━━", defval = false) initial_profit_points = input.float(title = 'Inital profit target points', defval = 100) initial_sl_points = input.float(title = 'Inital SL points', defval = 50) initiate_trailing_points = input.float(title = 'Initiate trailing points', defval = 60, tooltip = 'Initiate trailing of target and SL after change in price in points after taking trade') trail_profit_points = input.float(title = 'Trail profit by points', defval = 25) trail_sl_points = input.float(title = 'Trail SL by %', defval = 30) // } Parameters section >> // } << Common function { tab = table.new(position=position.bottom_right, columns=7, rows=200,frame_color = color.yellow, frame_width = 1) msg(int row, int col, string msg_str, clr=color.blue) => table.cell(table_id=tab, column=col, row=row, text=msg_str, text_color=clr) getVal(val) => ret_val = na(val) ? 0 : val t(val) => str.tostring(val, "0.00") timeToString(int _t) => str.tostring(dayofmonth(_t), '00') + '/' + str.tostring(month(_t), '00') + '/' + str.tostring(year(_t), '0000') + ' ' + str.tostring(hour(_t), '00') + ':' + str.tostring(minute(_t), '00') + ':' + str.tostring(second(_t), '00') // } Common functions>> // Variable declarations { percent_based = sl_target_method == '% Based Target and SL' ? true : false var initial_long_entry_price = float(na) var initial_short_entry_price = float(na) var long_target = float(na) var long_sl = float(na) var short_target = float(na) var short_sl = float(na) var long_entry_price = float(na) var short_entry_price = float(na) var initial_long_percent_target = float(na) var initial_long_percent_sl = float(na) var initial_long_point_target = float(na) var initial_long_point_sl = float(na) var initial_short_percent_target = float(na) var initial_short_percent_sl = float(na) var initial_short_point_target = float(na) var initial_short_point_sl = float(na) var is_long = bool(na) var is_short = bool(na) var trail_long_iteration = int(na) var trail_short_iteration = int(na) // } // derive important variable values // Strategy logic fast_ema = ta.ema(close, fast_len) slow_ema = ta.ema(close, slow_len) plot(fast_ema, color = color.red) plot(slow_ema, color = color.green) go_long = ta.crossover(fast_ema, slow_ema) and strategy.position_size == 0 go_short = ta.crossunder(fast_ema, slow_ema) and strategy.position_size == 0 // barcolor(ph ? color.purple : na, offset = -lb) // barcolor(pl ? color.yellow : na, offset = -lb) // barcolor(ph ? color.white : na) // barcolor(pl ? color.blue : na) // //trailing logic for long long_trailing_point = percent_based ? (close >= long_entry_price + (long_entry_price * initiate_trailing_percent)) : (close >= long_entry_price + initiate_trailing_points) short_trailing_point = percent_based ? (close <= short_entry_price - (short_entry_price * initiate_trailing_percent)) : (close >= short_entry_price - initiate_trailing_points) if(is_long and long_trailing_point) // initial_long_percent_target = initial_long_percent_target + (initial_long_percent_target * trail_profit_percent) // initial_long_percent_sl = initial_long_percent_sl - (initial_long_percent_sl * trail_sl_percent) // initial_long_point_target = initial_long_point_target + trail_profit_points // initial_long_point_sl = initial_long_point_sl - trail_sl_points trail_long_iteration := trail_long_iteration + 1 long_target := percent_based ? (long_target + (long_target * trail_profit_percent)) : (long_target + trail_profit_points) long_sl := percent_based ? (long_sl + (long_sl * trail_sl_percent)) : (long_sl + trail_sl_points) long_entry_price := percent_based ? (long_entry_price + (long_entry_price * initiate_trailing_percent)) : (long_entry_price + initiate_trailing_points) if(is_short and short_trailing_point) // initial_short_percent_target = initial_short_percent_target - (initial_short_percent_target * trail_profit_percent) // initial_short_percent_sl = initial_short_percent_sl + (initial_short_percent_sl * trail_sl_percent) // initial_short_point_target = initial_short_point_target - trail_profit_points // initial_short_point_sl = initial_short_point_sl + trail_sl_points trail_short_iteration := trail_short_iteration + 1 short_target := percent_based ? (short_target - (short_target * trail_profit_percent)) : (short_target - trail_profit_points) short_sl := percent_based ? (short_sl - (short_sl * trail_sl_percent)) : (short_sl - trail_sl_points) short_entry_price := percent_based ? (short_entry_price - (short_entry_price * initiate_trailing_percent)) : (short_entry_price - initiate_trailing_points) if(go_long) is_long := true is_short := false trail_long_iteration := 0 trail_short_iteration := 0 initial_long_entry_price := close long_entry_price := close initial_long_percent_target := close + (close * initial_profit_percent) initial_long_percent_sl := close - (close * initial_sl_percent) initial_long_point_target := close + initial_profit_points initial_long_point_sl := close - initial_sl_points long_target := percent_based ? initial_long_percent_target : initial_long_point_target long_sl := percent_based ? initial_long_percent_sl : initial_long_point_sl strategy.entry(id = 'Long', direction = strategy.long) if(go_short) is_long := false is_short := true trail_long_iteration := 0 trail_short_iteration := 0 initial_short_entry_price := close short_entry_price := close initial_short_percent_target := close - (close * initial_profit_percent) initial_short_percent_sl := close + (close * initial_sl_percent) initial_short_point_target := close - initial_profit_points initial_short_point_sl := close + initial_sl_points short_target := percent_based ? initial_short_percent_target : initial_short_point_target short_sl := percent_based ? initial_short_percent_sl : initial_short_point_sl strategy.entry(id = 'Short', direction = strategy.short) method = percent_based ? '% Based' : 'Fixed Points' long_tooltip = 'Long @ ' + timeToString(time) + '\n' + 'Method : ' + method + '\n' + 'Initial Trade Price: ' + t(initial_long_entry_price) + '\n' + 'Inital Target : ' + t(long_target) + '\n' + 'Inital SL : ' + t(long_sl) short_tooltip = 'Short @ ' + timeToString(time) + '\n' + 'Method : ' + method + '\n' + 'Initial Trade Price: ' + t(initial_short_entry_price) + '\n' + 'Inital Target : ' + t(short_target) + '\n' + 'Inital SL : ' + t(short_sl) label.new(go_long ? bar_index : na, go_long ? bar_index : na, style = label.style_diamond, yloc = yloc.belowbar, color = color.green, size=size.tiny, tooltip = long_tooltip) label.new(go_short ? bar_index : na, go_short ? bar_index : na, style = label.style_diamond, yloc = yloc.abovebar, color = color.red, size=size.tiny, tooltip = short_tooltip) trail_long_tooltip = 'Trail @ ' + timeToString(time) + '\n' + 'Iteration no : ' + t(trail_long_iteration) + '\n' + 'New Target : ' + t(long_target) + '\n' + 'New SL : ' + t(long_sl) trail_short_tooltip = 'Trail @ ' + timeToString(time) + '\n' + 'Iteration no : ' + t(trail_short_iteration) + '\n' + 'New Target : ' + t(short_target) + '\n' + 'New SL : ' + t(short_sl) label.new(is_long and long_trailing_point and strategy.position_size > 0 ? bar_index : na, is_long and long_trailing_point and strategy.position_size > 0 ? bar_index : na, text = str.tostring(trail_long_iteration), style = label.style_circle, textcolor = color.white, yloc = yloc.belowbar, color = color.green, size=size.tiny, tooltip = trail_long_tooltip) label.new(is_short and short_trailing_point and strategy.position_size < 0 ? bar_index : na, is_short and short_trailing_point and strategy.position_size < 0 ? bar_index : na, text = str.tostring(trail_short_iteration), style = label.style_circle, textcolor = color.white, yloc = yloc.abovebar, color = color.red, size=size.tiny, tooltip = trail_short_tooltip) strategy.close(id = 'Long', when = close <= long_sl, comment = 'SL') strategy.close(id = 'Short', when = close >= short_sl, comment = 'SL') strategy.close(id = 'Long', when = close >= long_target, comment = 'Target') strategy.close(id = 'Short', when = close <= short_target, comment = 'Target') // no_of_labels = 1 // label_q(_array, _val) => // array.push(_array, _val) // _return = array.shift(_array) // var target_label = float(na) // var sl_label = float(na) // if(strategy.position_size > 0) // target_label := long_target // sl_label := long_sl // else if(strategy.position_size < 0) // target_label := short_target // sl_label := short_sl // else // target_label := float(na) // sl_label := float(na) // var label[] target_array = array.new_label(no_of_labels) // label.delete(label_q(target_array, label.new(bar_index, target_label, "Target:"+t(target_label), style = label.style_label_down, color = label_bg_color, size=size.small, textcolor = color.green))) // var label[] sl_array = array.new_label(no_of_labels) // label.delete(label_q(sl_array, label.new(bar_index, sl_label, "SL:"+t(sl_label), style = label.style_label_up, color = label_bg_color, size=size.small, textcolor = color.red)))