
이 전략은 이동 평균선에 기반한 트래킹 스톱 손실 거래 전략이다. 이 전략은 두 개의 다른 주기의 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)))