
이 전략은 TSI 지표를 주요 거래 신호로 사용한다. TSI 지표가 신호선과 교차하고 TSI 지표가 하계 또는 상계보다 높을 때 전략은 포지션 개설 신호를 발생시킨다. 이 전략은 또한 EMA 및 ATR과 같은 지표를 사용하여 전략의 성능을 최적화한다. 전략은 특정 거래 시간 내에만 작동하며 과도한 거래를 제어하기 위해 최소 거래 주파수를 설정한다.
이 전략은 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)