Tài nguyên đang được tải lên... tải...

Lý thuyết giao dịch năng động: Chiến lược chéo thời gian trung bình chuyển động biểu thức và khối lượng tích lũy

Tác giả:ChaoZhang, Ngày: 2025-01-06 11:45:38
Tags:EMACVPAVWPThời gian bắt đầu

img

Tổng quan

Chiến lược này là một hệ thống giao dịch kết hợp giữa Mức trung bình chuyển động biểu thức (EMA) và Thời gian khối lượng tích lũy (CVP). Nó nắm bắt các điểm đảo ngược xu hướng thị trường bằng cách phân tích sự chéo chéo giữa giá EMA và giá tích lũy theo khối lượng cân nhắc. Chiến lược bao gồm bộ lọc thời gian tích hợp để giới hạn các phiên giao dịch và hỗ trợ đóng vị trí tự động vào cuối các thời gian giao dịch. Nó cung cấp hai phương pháp thoát khác nhau: thoát chéo ngược và thoát CVP tùy chỉnh, cung cấp sự linh hoạt và thích nghi mạnh mẽ.

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

Logic cốt lõi của chiến lược dựa trên các tính toán chính sau:

  1. Tính toán giá trung bình (AVWP): Nâng số trung bình của giá cao, thấp và đóng với khối lượng.
  2. Tính toán giá trị khối lượng tích lũy Thời gian: Tổng hợp các giá được cân nhắc theo khối lượng trong thời gian được thiết lập và chia cho khối lượng tích lũy.
  3. Đánh giá EMA của giá đóng cửa và EMA của CVP riêng biệt.
  4. Tạo tín hiệu dài khi giá EMA vượt qua EMA CVP; tạo tín hiệu ngắn khi giá EMA vượt qua EMA CVP.
  5. Các tín hiệu thoát có thể là tín hiệu chéo ngược hoặc tín hiệu dựa trên các khoảng thời gian CVP tùy chỉnh.

Ưu điểm chiến lược

  1. Hệ thống tín hiệu mạnh mẽ: Kết hợp xu hướng giá và thông tin khối lượng để đánh giá hướng thị trường chính xác hơn.
  2. Khả năng thích nghi cao: Có thể thích nghi với các môi trường thị trường khác nhau bằng cách điều chỉnh thời gian EMA và CVP.
  3. Quản lý rủi ro hoàn chỉnh: Bộ lọc thời gian tích hợp ngăn chặn giao dịch trong thời gian không phù hợp.
  4. Cơ chế thoát lỏng lẻo: Cung cấp hai phương pháp thoát khác nhau để lựa chọn dựa trên đặc điểm thị trường.
  5. Hiển thị tốt: Chiến lược cung cấp giao diện đồ họa rõ ràng bao gồm các dấu hiệu tín hiệu và lấp đầy khu vực xu hướng.

Rủi ro chiến lược

  1. Rủi ro chậm trễ: EMA có sự chậm trễ vốn có, có thể gây ra sự chậm trễ nhẹ trong thời gian vào và ra.
  2. Nguy cơ dao động: Có thể tạo ra tín hiệu sai trong thị trường bên.
  3. Độ nhạy của các tham số: Sự kết hợp các tham số khác nhau có thể dẫn đến sự thay đổi hiệu suất đáng kể.
  4. Rủi ro thanh khoản: Các tính toán CVP có thể không chính xác trong các thị trường có thanh khoản thấp.
  5. Tùy thuộc múi giờ: Chiến lược sử dụng thời gian New York để lọc thời gian, đòi hỏi sự chú ý đến các giờ giao dịch thị trường khác nhau.

Hướng dẫn tối ưu hóa chiến lược

  1. giới thiệu bộ lọc biến động: Điều chỉnh các tham số chiến lược dựa trên biến động thị trường để cải thiện khả năng thích nghi.
  2. Tối ưu hóa bộ lọc thời gian: Thêm nhiều cửa sổ thời gian để kiểm soát phiên giao dịch chính xác hơn.
  3. Thêm đánh giá chất lượng khối lượng: giới thiệu các chỉ số phân tích khối lượng để lọc các tín hiệu khối lượng chất lượng thấp.
  4. Điều chỉnh tham số động: Phát triển hệ thống tham số thích nghi để tự động điều chỉnh các khoảng thời gian EMA và CVP dựa trên điều kiện thị trường.
  5. Thêm các chỉ số tâm lý thị trường: Kết hợp với các chỉ số kỹ thuật khác để xác nhận tín hiệu giao dịch.

Tóm lại

Đây là một chiến lược giao dịch định lượng với cấu trúc hoàn chỉnh và logic rõ ràng. Bằng cách kết hợp các lợi thế của EMA và CVP, nó tạo ra một hệ thống giao dịch có thể nắm bắt xu hướng và tập trung vào kiểm soát rủi ro. Chiến lược có thể tùy chỉnh cao và phù hợp để sử dụng trong các môi trường thị trường khác nhau. Thông qua việc thực hiện các đề xuất tối ưu hóa, có không gian để cải thiện hiệu suất hơn nữa.


/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// © sapphire_edge 

// # ========================================================================= #
// #                  
// #        _____                   __    _              ______    __         
// #      / ___/____ _____  ____  / /_  (_)_______     / ____/___/ /___ ____ 
// #      \__ \/ __ `/ __ \/ __ \/ __ \/ / ___/ _ \   / __/ / __  / __ `/ _ \
// #     ___/ / /_/ / /_/ / /_/ / / / / / /  /  __/  / /___/ /_/ / /_/ /  __/
// #    /____/\__,_/ .___/ .___/_/ /_/_/_/   \___/  /_____/\__,_/\__, /\___/ 
// #              /_/   /_/                                     /____/       
// #                                      
// # ========================================================================= #

strategy(shorttitle="⟡Sapphire⟡ EMA/CVP", title="[Sapphire] EMA/CVP Strategy", initial_capital= 50000, currency= currency.USD,default_qty_value = 1,commission_type= strategy.commission.cash_per_contract,overlay= true )

// # ========================================================================= #
// #                       // Settings Menu //
// # ========================================================================= #

// --------------------    Main Settings    -------------------- //
groupEMACVP = "EMA / Cumulative Volume Period"
tradeDirection = input.string(title='Trade Direction', defval='LONG', options=['LONG', 'SHORT'], group=groupEMACVP)
emaLength = input.int(25, title='EMA Length', minval=1, maxval=200, group=groupEMACVP)
cumulativePeriod = input.int(100, title='Cumulative Volume Period', minval=1, maxval=200, step=5, group=groupEMACVP)
exitType = input.string(title="Exit Type", defval="Crossover", options=["Crossover", "Custom CVP" ], group=groupEMACVP)
cumulativePeriodForClose = input.int(50, title='Cumulative Period for Close Signal', minval=1, maxval=200, step=5, group=groupEMACVP)
showSignals = input.bool(true, title="Show Signals", group=groupEMACVP)
signalOffset = input.int(5, title="Signal Vertical Offset", group=groupEMACVP)

// --------------------    Time Filter Inputs    -------------------- //
groupTimeOfDayFilter = "Time of Day Filter"
useTimeFilter1  = input.bool(false, title="Enable Time Filter 1", group=groupTimeOfDayFilter)
startHour1      = input.int(0, title="Start Hour (24-hour format)", minval=0, maxval=23, group=groupTimeOfDayFilter)
startMinute1    = input.int(0, title="Start Minute", minval=0, maxval=59, group=groupTimeOfDayFilter)
endHour1        = input.int(23, title="End Hour (24-hour format)", minval=0, maxval=23, group=groupTimeOfDayFilter)
endMinute1      = input.int(45, title="End Minute", minval=0, maxval=59, group=groupTimeOfDayFilter)
closeAtEndTimeWindow = input.bool(false, title="Close Trades at End of Time Window", group=groupTimeOfDayFilter)

// --------------------    Trading Window    -------------------- //
isWithinTradingWindow(startHour, startMinute, endHour, endMinute) =>
    nyTime            = timestamp("America/New_York", year, month, dayofmonth, hour, minute)
    nyHour            = hour(nyTime)
    nyMinute          = minute(nyTime)
    timeInMinutes     = nyHour * 60 + nyMinute
    startInMinutes    = startHour * 60 + startMinute
    endInMinutes      = endHour * 60 + endMinute
    timeInMinutes    >= startInMinutes and timeInMinutes <= endInMinutes

timeCondition =  (useTimeFilter1 ? isWithinTradingWindow(startHour1, startMinute1, endHour1, endMinute1) : true)

// Check if the current bar is the last one within the specified time window
isEndOfTimeWindow() =>
    nyTime            = timestamp("America/New_York", year, month, dayofmonth, hour, minute)
    nyHour            = hour(nyTime)
    nyMinute          = minute(nyTime)
    timeInMinutes     = nyHour * 60 + nyMinute
    endInMinutes      = endHour1 * 60 + endMinute1
    timeInMinutes == endInMinutes

// Logic to close trades if the time window ends
if timeCondition and closeAtEndTimeWindow and isEndOfTimeWindow()
    strategy.close_all(comment="Closing trades at end of time window")

// # ========================================================================= #
// #                       // Calculations //
// # ========================================================================= #

avgPrice = (high + low + close) / 3
avgPriceVolume = avgPrice * volume

cumulPriceVolume = math.sum(avgPriceVolume, cumulativePeriod)
cumulVolume = math.sum(volume, cumulativePeriod)
cumValue = cumulPriceVolume / cumulVolume

cumulPriceVolumeClose = math.sum(avgPriceVolume, cumulativePeriodForClose)
cumulVolumeClose = math.sum(volume, cumulativePeriodForClose)
cumValueClose = cumulPriceVolumeClose / cumulVolumeClose

emaVal = ta.ema(close, emaLength)
emaCumValue = ta.ema(cumValue, emaLength)

// # ========================================================================= #
// #                       // Signal Logic //
// # ========================================================================= #

// Strategy Entry Conditions
longEntryCondition = ta.crossover(emaVal, emaCumValue) and tradeDirection == 'LONG'
shortEntryCondition = ta.crossunder(emaVal, emaCumValue) and tradeDirection == 'SHORT'

// User-Defined Exit Conditions
longExitCondition = false
shortExitCondition = false

if exitType == "Crossover"
    longExitCondition := ta.crossunder(emaVal, emaCumValue)
    shortExitCondition := ta.crossover(emaVal, emaCumValue)

if exitType == "Custom CVP"
    emaCumValueClose = ta.ema(cumValueClose, emaLength)
    longExitCondition := ta.crossunder(emaVal, emaCumValueClose)
    shortExitCondition := ta.crossover(emaVal, emaCumValueClose)

// # ========================================================================= #
// #                       // Strategy Management //
// # ========================================================================= #

// Strategy Execution
if longEntryCondition and timeCondition
    strategy.entry('Long', strategy.long)
    label.new(bar_index, high - signalOffset, "◭", style=label.style_label_up, color = color.rgb(119, 0, 255, 20), textcolor=color.white)

if shortEntryCondition and timeCondition
    strategy.entry('Short', strategy.short)
    label.new(bar_index, low + signalOffset, "⧩", style=label.style_label_down, color = color.rgb(255, 85, 0, 20), textcolor=color.white)

if strategy.position_size > 0 and longExitCondition
    strategy.close('Long')

if strategy.position_size < 0 and shortExitCondition
    strategy.close('Short')

// # ========================================================================= #
// #                         // Plots and Charts //
// # ========================================================================= #

plot(emaVal, title='EMA', color=color.new(color.green, 25))
plot(emaCumValue, title='Cumulative EMA', color=color.new(color.purple, 35))
fill(plot(emaVal), plot(emaCumValue), color=emaVal > emaCumValue ? #008ee6 : #d436a285, title='EMA and Cumulative Area', transp=70)


Có liên quan

Thêm nữa