리소스 로딩... 로딩...

횡단 전략

저자:차오장, 날짜: 2024-06-07 16:36:24
태그:TSIEMAATR테마

img

전반적인 설명

이 전략은 TSI 지표를 주요 거래 신호로 사용합니다. TSI 지표가 신호선을 넘어서 TSI 지표가 하위 한계 이하 또는 상위 한계 이상이면 전략은 오픈 포지션 신호를 생성합니다. 동시에 전략 성능을 최적화하기 위해 EMA 및 ATR와 같은 지표를 사용합니다. 전략은 특정 거래 세션 내에서만 실행되며 과잉 거래를 제어하기 위해 최소 거래 빈도를 설정합니다.

전략 원칙

  1. TSI 지표 값과 신호 라인 값을 계산합니다.
  2. 현재 시간이 허용되는 거래 범위 내에 있는지 확인하고 현재 바는 적어도 마지막 거래에서 지정된 최소 바 수와 같습니다.
  3. 만약 TSI 표시기가 아래로부터 신호선을 넘어서면 신호선이 지정된 하위 경계보다 낮으면 긴 신호가 생성됩니다.
  4. 만약 TSI 표시기가 상단에서 신호선 아래를 가로지르고 신호선이 지정된 상한을 넘으면 짧은 신호가 생성됩니다.
  5. 현재 긴 포지션을 유지한다면, TSI 표시기가 상에서 신호선을 넘어가면 모든 긴 포지션을 닫습니다.
  6. 현재 짧은 포지션을 유지한다면, TSI 표시기가 아래로부터 신호선을 넘으면 모든 짧은 포지션을 닫습니다.

이점 분석

  1. 전략 논리는 명확하고, TSI 지표의 십자 표시가 포지션 개설 및 폐쇄의 유일한 조건으로 사용되며, 이는 간단하고 이해하기 쉽습니다.
  2. 거래 세션과 거래 빈도를 제한함으로써 과잉 거래 위험이 효과적으로 통제됩니다.
  3. 적시에 손실을 멈추고 수익을 멈추고, 반대 신호가 나타나면 단 하나의 거래의 위험 노출을 제어하여 결정적으로 포지션을 닫습니다.
  4. 판단을 돕기 위해 EMA, ATR 등 여러 지표가 사용되며 전략의 안정성을 강화합니다.

위험 분석

  1. 이 전략은 TSI 지표 매개 변수 선택에 매우 민감하며, 다른 매개 변수들은 큰 성능 차이를 가져오므로 신중하게 선택되어야 합니다.
  2. 개시 및 종료 조건은 상대적으로 간단하며, 추세 판단과 변동성 제약이 없으며, 변동 시장에서 손실을 초래할 수 있습니다.
  3. 포지션 관리와 펀드 관리가 부족하기 때문에 마감을 통제하기가 어렵습니다. 지속적인 손실이 큰 마감으로 이어질 때.
  4. 트렌드 추적이 아닌 단기 반전만 하면 많은 트렌드 기회를 놓칠 수 있습니다.

최적화 방향

  1. 보다 탄탄한 매개 변수 조합을 찾기 위해 TSI 지표의 매개 변수를 최적화합니다. 유전자 알고리즘과 같은 자동 최적화 방법을 사용할 수 있습니다.
  2. 성공률을 높이기 위해 포지션을 열 때 MA 또는 MACD와 같은 트렌드 판단 지표를 추가하여 트렌드 방향을 선택합니다.
  3. 높은 변동성 시장 환경에서 거래 수를 줄이기 위해 ATR과 같은 변동성 지표를 추가합니다.
  4. 최근 시장 성과 및 계좌 순액에 따라 각 거래의 포지션 크기를 동적으로 조정하는 포지션 관리 모델을 도입합니다.
  5. 트렌드 추적 로직은 트렌드 시장에서 포지션을 계속 유지하기 위해 추가 될 수 있습니다. 큰 트렌드를 포착하는 전략의 능력을 향상시키기 위해.

요약

이 전략은 TSI 지표에 기반하여 TSI와 신호선을 가로질러 거래 신호를 생성합니다. 동시에 위험을 제어하기 위해 거래 시간과 주파수를 제한합니다. 전략의 장점은 논리가 간단하고 명확하며 손실과 이익을 적시에 중단한다는 것입니다. 그러나 단점은 트렌드 판단과 위치 관리, TSI 매개 변수에 대한 민감성 부족이며 시장이 놓치고있는 동안 트렌드 역전 시장을 캡처 할 수 있습니다. 미래에는 트렌드 및 변동성 판단, 위치 관리 및 매개 변수 최적화와 같은 측면에서 전략을 개선 할 수 있습니다.


/*backtest
start: 2024-05-30 00:00:00
end: 2024-06-06 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © nikgavalas

//@version=5
strategy("TSI Entries", overlay=true, margin_long=100, margin_short=100)

//
// INPUTS
//

// Define the start and end hours for trading
string sessionInput = input("1000-1530", "Session")

// Day of the week.
string daysInput = input.string("23456", tooltip = "1 = Sunday, 7 = Saturday")

// Minimum number of bar's between entries
requiredBarsBetweenEntries = input.int(12, "Required Bars Between Entries")

// Show debug labels
bool showDebugLabels = input.bool(false, "Show Debug Labels")

//
// FUNCTIONS
//

//@function Define the triple exponential moving average function
tema(src, len) => tema = 3 * ta.ema(src, len) - 3 * ta.ema(ta.ema(src, len), len) + ta.ema(ta.ema(ta.ema(src, len), len), len)

//@function Atr with EMA
atr_ema(length) =>
    trueRange = na(high[1])? high-low : math.max(math.max(high - low, math.abs(high - close[1])), math.abs(low - close[1]))
    //true range can be also calculated with ta.tr(true)
    ta.ema(trueRange, length)

//@function Check if time is in range
timeinrange() => 
    sessionString = sessionInput + ":" + daysInput
    inSession = not na(time(timeframe.period, sessionString, "America/New_York"))

//@function Displays text passed to `txt` when called.
debugLabel(txt, color, y, style) =>
    if (showDebugLabels) 
        label.new(bar_index, y, text = txt, color = color, style = style, textcolor = color.black, size = size.small)


//
// INDICATOR CODE
//

long = input(title="TSI Long Length", defval=8)
short = input(title="TSI Short Length", defval=8)
signal = input(title="TSI Signal Length", defval=3)
lowerLine = input(title="TSI Lower Line", defval=-50)
upperLine = input(title="TSI Upper Line", defval=50)

price = close
double_smooth(src, long, short) =>
	fist_smooth = ta.ema(src, long)
	ta.ema(fist_smooth, short)

pc = ta.change(price)
double_smoothed_pc = double_smooth(pc, long, short)
double_smoothed_abs_pc = double_smooth(math.abs(pc), long, short)
tsiValue = 100 * (double_smoothed_pc / double_smoothed_abs_pc)
signalValue = ta.ema(tsiValue, signal)

//
// COMMON VARIABLES
//

var color trendColor = na
var int lastEntryBar = na

bool tradeAllowed = timeinrange() == true and (na(lastEntryBar) or bar_index - lastEntryBar > requiredBarsBetweenEntries)

// 
// CROSSOVER
//

bool crossOver = ta.crossover(tsiValue, signalValue)
bool crossUnder = ta.crossunder(tsiValue,signalValue)

if (tradeAllowed) 
	if (signalValue < lowerLine and crossOver == true)
		strategy.entry("Up", strategy.long)
		lastEntryBar := bar_index

	else if (signalValue > upperLine and crossUnder == true)

		strategy.entry("Down", strategy.short)
		lastEntryBar := bar_index

// 
// EXITS
// 

if (strategy.position_size > 0 and crossUnder == true)
	strategy.close("Up", qty_percent = 100)

else if (strategy.position_size < 0 and crossOver == true)
	strategy.close("Down", qty_percent = 100)


관련

더 많은