Chiến lược giao thoa TSI

TSI EMA ATR TEMA
Ngày tạo: 2024-06-07 16:36:24 sửa đổi lần cuối: 2024-06-07 16:36:24
sao chép: 7 Số nhấp chuột: 628
1
tập trung vào
1617
Người theo dõi

Chiến lược giao thoa TSI

Tổng quan

Chiến lược sử dụng chỉ số TSI làm tín hiệu giao dịch chính. Chiến lược tạo ra tín hiệu mở vị trí khi chỉ số TSI giao nhau với đường tín hiệu của nó và chỉ số TSI ở dưới giới hạn thấp hơn hoặc cao hơn giới hạn. Chiến lược cũng sử dụng các chỉ số như EMA và ATR để tối ưu hóa hiệu suất của chiến lược. Chiến lược chỉ hoạt động trong một khoảng thời gian giao dịch cụ thể và đặt tần số giao dịch tối thiểu để kiểm soát giao dịch quá mức.

Nguyên tắc chiến lược

  1. Tính toán giá trị chỉ số TSI và giá trị đường tín hiệu.
  2. Xác định liệu hiện tại có nằm trong phạm vi thời gian cho phép giao dịch, và liệu hiện tại có nằm cách giao dịch trước ít nhất một số bar nhất định không.
  3. Nếu chỉ số TSI đi qua đường tín hiệu từ dưới lên và đường tín hiệu ở thời điểm này thấp hơn giới hạn thấp nhất được chỉ định, thì sẽ tạo ra tín hiệu đa.
  4. Nếu chỉ số TSI đi qua đường tín hiệu từ trên xuống, và đường tín hiệu ở thời điểm này cao hơn giới hạn trên được chỉ định, một tín hiệu trống sẽ được tạo ra.
  5. Nếu hiện tại đang nắm giữ nhiều vị trí đầu, một khi chỉ số TSI đi qua đường tín hiệu từ trên xuống, thì sẽ xóa tất cả các vị trí đầu.
  6. Nếu hiện tại đang nắm giữ các vị trí trống, hãy xóa tất cả các vị trí trống khi chỉ số TSI đi qua đường tín hiệu từ dưới lên.

Phân tích lợi thế

  1. Lập luận chiến lược rõ ràng, sử dụng chéo của chỉ số TSI như là điều kiện duy nhất để mở vị trí mở, đơn giản và dễ hiểu.
  2. Việc hạn chế thời gian giao dịch và tần suất giao dịch sẽ giúp kiểm soát rủi ro giao dịch quá mức.
  3. Đặt lệnh dừng lỗ kịp thời, cắt ngang ngay khi có tín hiệu ngược lại, kiểm soát lỗ hổng rủi ro của một giao dịch.
  4. Sử dụng nhiều chỉ số để hỗ trợ phán đoán, như EMA, ATR, v.v., tăng cường tính ổn định của chiến lược.

Phân tích rủi ro

  1. Chiến lược này rất nhạy cảm với sự lựa chọn tham số của chỉ số TSI, các tham số khác nhau có thể mang lại sự khác biệt lớn về hiệu suất, cần phải lựa chọn cẩn thận.
  2. Các điều kiện mở và đặt vị trí đều khá đơn giản, không có phán đoán xu hướng và hạn chế tỷ lệ biến động, có thể có tổn thất trong tình huống chấn động.
  3. Thiếu quản lý vị trí và quản lý tài chính, khó kiểm soát rút tiền, một lần thua lỗ liên tục sẽ dẫn đến rút tiền lớn.
  4. Theo đó, nếu bạn chỉ có thể quay ngược một cách vô hiệu mà không theo dõi xu hướng, bạn sẽ bỏ lỡ rất nhiều cơ hội để theo dõi xu hướng.

Hướng tối ưu hóa

  1. Tối ưu hóa các tham số của chỉ số TSI để tìm ra một sự kết hợp các tham số vững chắc hơn. Các phương pháp như thuật toán di truyền có thể được sử dụng để tự động tìm kiếm sự tối ưu.
  2. Thêm các chỉ số định hướng, như MA hoặc MACD, để chọn hướng đi khi mở vị trí, tăng tỷ lệ thành công.
  3. Thêm một chỉ số biến động, chẳng hạn như ATR, để giảm số lần giao dịch trong môi trường thị trường biến động cao.
  4. Giới thiệu mô hình quản lý vị trí, điều chỉnh kích thước vị trí của mỗi giao dịch theo các động thái như hiệu suất thị trường gần đây và giá trị tài khoản ròng.
  5. Có thể tăng thêm logic để theo dõi xu hướng, tiếp tục giữ vị trí trong xu hướng và cải thiện khả năng của chiến lược để nắm bắt các xu hướng lớn.

Tóm tắt

Chiến lược này dựa trên chỉ số TSI làm trung tâm, tạo ra tín hiệu giao dịch thông qua giao thoa giữa TSI và đường tín hiệu. Đồng thời giới hạn thời gian giao dịch và tần số giao dịch để kiểm soát rủi ro. Ưu điểm của chiến lược là logic đơn giản và rõ ràng, dừng lỗ kịp thời.

Mã nguồn chiến lược
/*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)