조커 이동 중지 전략은 이동 평균을 기반으로 한 트렌드 추적 전략이다. 그것은 이동 중지 및 이동 중지의 특성을 결합하여, 시장이 우호적인 방향으로 발전 할 때 수익을 최대한 잠금하는 것을 목표로하고, 또한 시장이 불리하게 변할 때 가능한 빨리 손실을 중단 할 수 있다.
이 전략은 빠른 이동 평균과 느린 이동 평균을 사용하여 트렌드 필터를 구축한다. 빠른 이동 평균 위에 느린 이동 평균을 통과할 때, 더 많이 하고, 빠른 이동 평균 아래에 느린 이동 평균을 통과할 때, 공백을 한다.
전략은 먼저 구성된 스톱퍼센티지 기준으로 포지션을 개시한 후의 첫 번째 스톱 가격을 계산한다. 이동 스톱 기능이 활성화되어 있다면 거래 품종의 최소 변동 가격과 구성된 이동 스톱퍼센티지 기준으로 이동 스톱의 단계 크기를 계산한다.
포지션 보유 방향이 신호 방향과 일치할 때, 모바일 스톱이 활성화되지 않은 경우, 제한 가격 단독 서미터 방식을 사용하여 스톱을 중지합니다. 모바일 스톱이 활성화 된 경우, 추적 스톱 방식을 사용하여 스톱 가격을 단계 크기에 따라 계속 조정합니다.
이동 평균을 사용하여 주요 트렌드 방향을 판단하여 시장 Noise가 전략에 너무 많은 방해를 주지 않도록하십시오.
모바일 스톱을 활성화하면 시장의 움직임에 따라 스톱 위치를 조정할 수 있으며, 스톱 위치가 항상 가격에 가깝게 유지되도록 보장합니다. 이것은 고정된 스톱 가격을 설정하는 것보다 더 유연하고 효율적입니다.
이동식 스톱은 더 많은 수익을 잠금할 수 있고, 전략적 낙점의 위험을 줄일 수 있다. 또한 고정식 스톱만 설정하면 발생할 수 있는 스톱 위치가 너무 보수적이어서 수익을 조기에 잠금하는 문제를 피할 수 있다.
모바일 스톱은 상쇄 스톱의 장점을 유지하며, 상황이 불리하게 변할 때 가능한 한 빨리 상쇄 할 수 있습니다.
이동 평균은 가격이 급격히 변동할 때 잘못된 신호 또는 신호 지연이 발생할 수 있습니다. 이것은 전략 역설계 손실을 초래할 수 있습니다. 이동 평균 파라미터를 적절히 조정하거나 필터를 추가하여 최적화 할 수 있습니다.
스톱 비율이 너무 커 설정되면 전략 지분 시간이 증가하고 실제 스톱 가격과 이론 가격의 편차가 증가합니다. 스톱 비율을 적절하게 낮출 수 있으므로이 위험을 줄일 수 있습니다.
모바일 스톱의 스텝 비율이 너무 작게 설정되면, 이동 빈도가 너무 높게 되고 거래비용과 슬라이드 포인트 위험이 증가한다. 모바일 스톱 스텝을 적절히 조정하여 최적화할 수 있다.
이동 스톱은 단방향 이동만을 고려하고, 회귀를 고려하지 않는다. 이것은 가격이 다시 회귀하고, 이동 스톱은 하향 조정하지 않는다는 것을 의미한다. 이것은 스톱의 최종 실행 가격이 이론 가격에서 벗어나는 것을 초래한다. 양방향 이동 스톱 메커니즘을 고려하여 최적화 할 수 있다.
시장의 변동율에 따라 이동 평균 파라미터를 조정하는 것을 고려할 수 있으며, 변동이 커질 때 주기적으로 커지고, 변동이 작아질 때 주기적으로 줄일 수 있다.
다양한 품종과 시장의 특성을 연구할 수 있고, 다른 기본 정지 비율을 설정하여 정지 편향의 위험을 줄일 수 있다.
양방향 이동 스톱 메커니즘을 연구할 수 있는데, 가격이 새로운 최고점을 도달했을 때 상향으로 이동하는 스톱, 회귀가 발생했을 때 하향으로 이동하는 스톱으로 스톱을 가격에 더 가깝게 만든다.
트렌드 강도 지표와 결합하여, 트렌드 강도가 약할 때 정지 비율을 줄이고, 트렌드 강도가 강할 때 정지 비율을 증가시키는 것을 고려할 수 있다.
기계 학습 모델과 결합하여, 모델이 예측한 가격 범위를 사용하여 스톱 비율을 동적으로 설정하는 것을 고려할 수 있습니다.
조커 이동식 스톱 전략은 전체적인 구조가 명확하며, 이동식 평균을 사용하여 트렌드 방향을 판단하고, 그 다음 동적으로 스톱 위치를 조정하여 수익을 고정한다. 그것은 이동식 스톱과 이동식 스톱의 장점을 모두 갖추고, 트렌드를 효과적으로 추적하면서 위험을 제어한다. 파라미터 조정 및 스톱 메커니즘 개선으로 전략을 더욱 개선하여 더 복잡한 시장 환경에 적응할 수 있다.
/*backtest
start: 2023-08-23 00:00:00
end: 2023-09-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy(title='Joker Trailing TP Bot', shorttitle='Joker TTP Bot', overlay=true, pyramiding=0, process_orders_on_close=false, close_entries_rule='ANY', calc_on_every_tick=false, calc_on_order_fills=false, commission_type=strategy.commission.percent, commission_value=0.07, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=1000, currency=currency.USD) //, max_labels_count=500)
fromDate = input(timestamp('01 Jan 2021 00:00 UTC'), 'From Date')
toDate = input(timestamp('31 Dec 2121 23:59 UTC'), 'To Date')
fastMALen = input.int(23, 'Fast SMA Length')
slowMALen = input.int(50, 'Slow SMA Length')
longTakeProfitPerc = input.float(0.5, 'Long Take Profit %', minval=0.05, step=0.05) * 0.01
shortTakeProfitPerc = input.float(0.5, 'Short Take Profit %', minval=0.05, step=0.05) * 0.01
enableTrailing = input.bool(true, 'Enable Trailing')
trailingTakeProfitPerc = input.float(0.01, 'Trailing Take Profit %', minval=0.01, maxval=100, step=0.01) * 0.01
float fastMA = ta.sma(close, fastMALen)
float slowMA = ta.sma(close, slowMALen)
bool isWithinPeriod = true
bool openLongPosition = isWithinPeriod and ta.crossover(fastMA, slowMA)
bool openShortPosition = isWithinPeriod and ta.crossunder(fastMA, slowMA)
bool longIsActive = openLongPosition or strategy.position_size > 0
bool shortIsActive = openShortPosition or strategy.position_size < 0
float longTakeProfitPrice = na
longTakeProfitPrice := if longIsActive
if openLongPosition and not (strategy.position_size > 0)
close * (1 + longTakeProfitPerc)
else
nz(longTakeProfitPrice[1], close * (1 + longTakeProfitPerc))
else
na
float shortTakeProfitPrice = na
shortTakeProfitPrice := if shortIsActive
if openShortPosition and not (strategy.position_size < 0)
close * (1 - shortTakeProfitPerc)
else
nz(shortTakeProfitPrice[1], close * (1 - shortTakeProfitPrice))
else
na
float longTrailingTakeProfitStepTicks = longTakeProfitPrice * trailingTakeProfitPerc / syminfo.mintick
float shortTrailingTakeProfitStepTicks = shortTakeProfitPrice * trailingTakeProfitPerc / syminfo.mintick
strategy.entry(id = 'Long Entry', direction = strategy.long, when = openLongPosition, alert_message = 'Long(' + syminfo.ticker + '): Started')
strategy.entry(id = 'Short Entry', direction = strategy.short, when = openShortPosition, alert_message = 'Short(' + syminfo.ticker + '): Started')
strategy.exit(id = 'Long Take Profit', from_entry = 'Long Entry', limit = enableTrailing ? na : longTakeProfitPrice, trail_price = enableTrailing ? longTakeProfitPrice : na, trail_offset = enableTrailing ? longTrailingTakeProfitStepTicks : na, when = longIsActive, alert_message = 'Long(' + syminfo.ticker + '): Take Profit activated')
strategy.exit(id = 'Short Take Profit', from_entry = 'Short Entry', limit = enableTrailing ? na : shortTakeProfitPrice, trail_price = enableTrailing ? shortTakeProfitPrice : na, trail_offset = enableTrailing ? shortTrailingTakeProfitStepTicks : na, when = shortIsActive, alert_message = 'Short(' + syminfo.ticker + '): Take Profit activated')
plot(series = fastMA, title='Fast SMA', color = color.blue, linewidth = 1, style = plot.style_line)
plot(series = slowMA, title='Slow SMA', color = color.orange, linewidth = 1, style = plot.style_line)
plot(series = longTakeProfitPrice, title='Long Take Profit', color = color.green, linewidth = 1, style = plot.style_cross, offset = 1)
plot(series = shortTakeProfitPrice, title='Short Take Profit', color = color.red, linewidth = 1, style = plot.style_cross, offset = 1)
plot(series = strategy.position_avg_price, title='Position', color = color.white, linewidth = 1, style = plot.style_linebr)