
이 전략은 인덱스 이동 평균 크로스 시스템과 해파리 거래 시스템 두 가지의 인기있는 시스템 거래 전략을 통합합니다. 이 시스템은 태양계 시간 프레임에 전용되어 있으며, 동적으로 포지션을 조정하여 실시간으로 시장 추세를 추적하며, 강력한 추적 능력을 가지고 있습니다.
이 전략은 두 가지 세드 전략을 포함하고 있습니다: 트렌드 전략과 브레이크 전략
트렌드 전략은 빠른 EMA와 느린 EMA의 교차를 거래 신호로 사용합니다. 빠른 EMA 주기의 길이는 사용자에 의해 설정되며, 느린 EMA 주기의 길이는 빠른 EMA의 5배입니다. 신호는 빠른 EMA의 미분값을 252 주기의 수익률의 표준 차로 나누어서 얻을 수 있습니다. 변동률 조정 후 더 신뢰할 수있는 거래 신호를 생성합니다. 새로운 트렌드가 감지되면 추가하거나 공백하십시오.
브레이크 전략은 고정된 주기 최고 가격과 최저 가격의 평균을 기준선으로 사용한다. 가격이 상대적으로 기준선 위로 올라가거나 내려가 특정 범위를 초과할 때, 더 많은 것을 하거나 더 적은 것을 하는 신호를 생성한다.
포지션 조정은 최근 가격 변동성과 사용자가 설정한 연간 위험 목표에 따라 계산된다. 변동성이 적으면 포지션이 더 커지고, 변동성이 커지면 포지션이 더 작아, 위험 조정을 거쳐 역동적인 포지션 관리를 구현한다.
스톱로드는 실제 파장의 배수값을 기준으로 설정한다. 스톱로드는 최고 가격과 최저 가격의 이동 회수값을 기준으로 추적한다.
이 전략은 다음과 같은 장점을 가지고 있습니다.
트렌드 추적과 브레이크를 결합한 2개의 하위 전략으로, 다양한 시장 환경에서 적응적 전환을 할 수 있으며, 강력한 거친성을 갖는다.
고급 포지션 관리 및 위험 제어 기술을 적용하여 포지션을 동적으로 조정하여 위험을 효과적으로 제어 할 수 있습니다.
실제 변동성 및 연도화 위험 목표를 활용하여 포지션을 조정하여 높은 낮은 변동성 시장에서 비교적 안정적인 포지션 위험 수준을 얻을 수 있습니다.
가격의 실제 변동에 따라 스톱로스를 설정하면 스톱로스 필드에서 불필요한 작은 손실을 효과적으로 피할 수 있습니다.
실시간 조정 트래킹 중지 위치, 유연하게 트렌드를 추적 수익, 적시에 중지 손실 퇴장.
이 전략의 주요 위험은 다음과 같습니다.
매개 변수 최적화에 따라, 다양한 매개 변수가 전략 성능에 큰 영향을 미치며, 최적의 매개 변수를 얻기 위해 전체적인 테스트가 필요합니다.
트래킹 스톱은 진동 추세에서 너무 자주 스톱을 벗어날 수 있습니다. 스톱의 폭을 적절히 완화하고 스톱 메커니즘을 최적화 할 수 있습니다.
포지션 관리 및 위험 제어 기술은 초기 자본과 거래 비용에 민감하다. 초기 자본이 너무 적고 거래 비용이 너무 높으면 전략의 수익성이 영향을 받는다.
연간 위험 목표와 최대 레버리지에 대한 전략의 설정은 제대로 평가된 지표의 변동성에 의존한다. 변동성 평가가 정확하지 않으면 포지션이 너무 크거나 너무 작을 수 있다.
이 전략의 주요 최적화 방향은 다음과 같습니다.
최적의 변수 조합을 찾는다. 더 많은 역사 데이터를 회수하여 최적의 변수 설정을 찾을 수 있다.
손해 제도를 개선한다. 이동 손해, 시간 손해, 흔들림 손해 등의 손해 형태를 테스트하고, 손해 제도를 최적화한다.
포지션 최적화 및 리스크 관리. 최적의 리스크 수익 포트폴리오를 찾기 위해 다양한 리스크 목표를 테스트 할 수 있습니다. 또한 다양한 레버리 수준의 영향을 테스트 할 수 있습니다.
다른 보조 지표를 시도하십시오. 신호의 정확성과 전략의 안정성을 높이기 위해 더 많은 기술적 지표를 추가 할 수 있습니다.
다른 포지션 주기를 테스트하십시오. 포지션配置의 정확성을 높이기 위해 더 높은 주기 보조 결정을 사용할 수 있습니다.
이 전략은 트렌드 추적과 트렌드 돌파 두 가지 유형의 거래 전략을 통합하고, 고급 동적 포지션 관리 기술을 적용하여 위험 조정 후 포지션配置을 구현하고, 위험을 효과적으로 제어 할 수 있으며 동시에 시장 움직임을 추적하고, 수익성이 강하며, 추가 테스트 및 최적화를 할 가치가 있습니다.
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
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/
// © Crunchster1
//@version=5
strategy(title="Crunchster's Turtle and Trend System", shorttitle="Turtle Trend", overlay=true, slippage=10, pyramiding=1, precision = 4, calc_on_order_fills = false, calc_on_every_tick = false, default_qty_value = 0.1, initial_capital = 1000, commission_value = 0.06, process_orders_on_close = true)
// Inputs and Parameters
src = input(close, 'Source', group='Strategy Settings')
length = input.int(title="Lookback period for fast EMA", defval=10, minval=2, group='Strategy Settings', tooltip='This sets the lookback period for the fast exponential moving average. The slow EMA is 5x the fast EMA length')
blength = input.int(title="Lookback period for Breakout", defval=20, minval=5, step=5, group='Strategy Settings')
long = input(true, 'Long', inline='08', group='Strategy toggle')
short = input(true, 'Short', inline='08', group='Strategy toggle', tooltip='Toggle long/short strategy on/off')
EMAwt = input(false, 'Trend', inline='01', group='Strategy toggle')
breakwt = input(true, 'Breakout', inline='01', group='Strategy toggle', tooltip='Toggle trend/breakout strategy on/off')
stopMultiple = input.float(2, 'Stop multiple', step=0.5, group='Risk Management Settings', tooltip='Multiple for ATR, setting hard stop loss from entry price')
trail = input.int(10, 'Trail lookback', step=5, group='Risk Management Settings', tooltip='Lookback period for the trailing stop')
lev = input.float(1, 'Max Leverage', step=0.5, group='Risk Management Settings', tooltip='Max leverage sets maximum allowable leverage of total capital (initial capital + any net profit), capping maximum volatility adjusted position size')
riskT = input.float(15, maxval=75, title='Annualised Volatility Target %', group='Risk Management Settings', tooltip='Specify annual risk target, used to determine volatility adjusted position size. Annualised daily volatility is referenced to this value and position size adjusted accordingly')
comp = input(true, 'Compounding', inline='09', group='Risk Management Settings')
Comppct = input.float(50, '%', step=5, inline='09', group='Risk Management Settings', tooltip='Toggle compounding of profit, and set % of profit to compound')
// Backtesting period
FromDay = input.int(defval=1, title='From Day', minval=1, maxval=31, inline='04', group='Backtest range')
FromMonth = input.int(defval=1, title='From Mon', minval=1, maxval=12, inline='04', group='Backtest range')
FromYear = input.int(defval=2018, title='From Yr', minval=1900, inline='04', group='Backtest range', tooltip='Set start of backtesting period')
ToDay = input.int(defval=1, title='To Day', minval=1, maxval=31, inline='05', group='Backtest range')
ToMonth = input.int(defval=1, title='To Mon', minval=1, maxval=12, inline='05', group='Backtest range')
ToYear = input.int(defval=9999, title='To Yr', minval=1900, inline='05', group='Backtest range', tooltip='Set end of backtesting period')
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)
window = time >= start and time <= finish
// Breakout strategy
lower = ta.lowest(low[1], blength)
upper = ta.highest(high[1], blength)
basis = math.avg(upper, lower)
signal = 20*(close - basis) / (upper - lower)
// Trend strategy
fEMA = ta.ema(close[1], length)
sEMA = ta.ema(close[1], length*5)
emadiff = fEMA - sEMA
nemadiff = 5*emadiff/(ta.stdev(close - close[1], 252))
//Risk Management formulae
strategy.initial_capital = 50000
tr = math.max(high - low, math.abs(high - close), math.abs(low - close)) //True range
stopL = ta.sma(tr, 14) //Average true range
stdev = ta.stdev(close-close[1], 14) //volatility of recent returns
maxcapital = strategy.initial_capital+strategy.netprofit //Maximum capital available to invest - initial capital net of profit
annvol = 100*math.sqrt(365)*stdev/close //converts recent volatility of returns into annualised volatility of returns - assumes daily timeframe
risk = 1.1
if comp
risk := (strategy.initial_capital+(Comppct*strategy.netprofit/100))//adjust investment capital to include compounding
else
risk := strategy.initial_capital
shares = (risk * (riskT/annvol)) / close //calculates volatility adjusted position size, dependent on user specified annualised risk target
if ((shares*close) > lev*maxcapital) //ensures position size does not exceed available capital multiplied by user specified maximum leverage
shares := lev*maxcapital/close
//To set the price at the entry point of trade
Posopen() =>
math.abs(strategy.position_size[1]) <= 0 and math.abs(strategy.position_size) > 0
var float openN = na
if Posopen()
openN := stopL
// Trailing stop
tlower = ta.lowest(low[1], trail)
tupper = ta.highest(high[1], trail)
tbasis = math.avg(tupper, tlower)
tsignal = 20*(close - tbasis) / (tupper - tlower)
// Strategy Rules
if EMAwt
if long
longCondition2 = (nemadiff >2 and nemadiff[1] <2) and window
exitlong = tsignal <= -10
if (longCondition2)
strategy.entry('Trend Long!', strategy.long, qty=shares)
if strategy.position_size > 0
strategy.exit('Stop Long', from_entry = 'Trend Long!', stop=(strategy.opentrades.entry_price(0) - (openN * stopMultiple)))
if (exitlong)
strategy.close('Trend Long!', immediately = true)
if short
shortCondition2 = (nemadiff <-1 and nemadiff[1] >-1) and window
exitshort = tsignal >= 10
if (shortCondition2)
strategy.entry('Trend Short!', strategy.short, qty=shares)
if strategy.position_size < 0
strategy.exit('Stop Short', from_entry = 'Trend Short!', stop=(strategy.opentrades.entry_price(0) + (openN * stopMultiple)))
if (exitshort)
strategy.close('Trend Short!', immediately = true)
if breakwt
if long
longCondition1 = (signal >= 10) and window
exitlong = tsignal <= -10
if (longCondition1)
strategy.entry('Break Long!', strategy.long, qty=shares)
if strategy.position_size > 0
strategy.exit('Stop Long', from_entry = 'Break Long!', stop=(strategy.opentrades.entry_price(0) - (openN * stopMultiple)))
if (exitlong)
strategy.close('Break Long!', immediately = true)
if short
shortCondition1 = (signal <= -10) and window
exitshort = tsignal >= 10
if (shortCondition1)
strategy.entry('Break Short!', strategy.short, qty=shares)
if strategy.position_size < 0
strategy.exit('Stop Short', from_entry = 'Break Short!', stop=(strategy.opentrades.entry_price(0) + (openN * stopMultiple)))
if (exitshort)
strategy.close('Break Short!', immediately = true)
// Visuals of trend and direction
plot(nemadiff, title='EMA Forecast', color=color.black, display=display.none)
plot(ta.sma(ta.median(math.sqrt(math.pow(nemadiff,2)), 700), 350), 'Forecast mean', color=color.rgb(245, 0, 0), display=display.none)
MAColor = fEMA > sEMA ? #00ff00 : #ff0000
MA1 = plot(fEMA, title='Fast EMA', color=MAColor)
MA2 = plot(sEMA, title='Slow EMA', color=MAColor)
fill(MA1, MA2, title='Band Filler', color=MAColor)